#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
int a[3][5]; bool ans[5];
inlineboolDFS(CI tot){
if (tot==8) return1; bool flag=0;
for (RI i=1,j;i<=2;++i) for (j=1;j<=4;++j) if (!a[i][j])
{
if (a[i][j]=1,flag|=!DFS(tot+1),j<4&&!a[i][j+1])
a[i][j+1]=1,flag|=!DFS(tot+2),a[i][j+1]=0; a[i][j]=0;
}
return flag;
}
intmain(){
a[1][1]=1; ans[1]=!DFS(1);
a[1][2]=1; ans[2]=!DFS(2);
a[1][1]=0; ans[3]=!DFS(1);
a[1][3]=1; ans[4]=!DFS(2);
for (RI i=1;i<=4;++i) putchar(ans[i]?'V':'L');
return0;
}
4|0C 求和
不妨设sum=∑ni=1ai,然后枚举每个数,先把sum减去ai,然后用ai乘上sum即可
#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=200005;
int n,a[N]; longlong sum,ans;
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i];
for (i=1;i<=n;++i) sum-=a[i],ans+=1LL*a[i]*sum;
returnprintf("%lld",ans),0;
}
#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=200005;
int n,m,l,r,a[N],x,bkt[N],mx[N][25],lg[N];
inlineintquery(CI l,CI r){
int k=lg[r-l+1]; returnmax(mx[l][k],mx[r-(1<<k)+1][k]);
}
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i,j; for (scanf("%d%d%d",&n,&m,&x),i=1;i<=n;++i)
scanf("%d",&a[i]),mx[i][0]=bkt[a[i]^x],bkt[a[i]]=i;
for (i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
for (j=1;(1<<j)<=n;++j) for (i=1;i+(1<<j)-1<=n;++i)
mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);
for (i=1;i<=m;++i) scanf("%d%d",&l,&r),puts(query(l,r)>=l?"yes":"no");
return0;
}
#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=100005;
int n,a[N],x,ans;
inlineintcheck(CI k){
longlong sum=0; RI i; for (i=1;i<=k;++i) sum+=a[i];
if (sum<2LL*x) return0;
for (i=k+1;i<n;++i) if ((sum+=a[i]-a[i-k])<2LL*x) return0;
return1;
}
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i; for (scanf("%d%d",&n,&x),i=1;i<n;++i) scanf("%d",&a[i]);
int l=1,r=n-1,mid; ans=n; while (l<=r)
if (check(mid=l+r>>1)) ans=mid,r=mid-1; else l=mid+1;
returnprintf("%d",ans),0;
}
8|0G 最长不下降子序列
这个算是比较套路的题了,放在以前可能看一眼就秒了,现在还要想上好久
不难发现我们在修改连续的k个数字变成同一值时,最好让这k个数和它们前面的数一样
我们先维护fi表示以i结尾的最长不下降子序列的长度,考虑枚举i使得[i+1,i+k]都变成ai
不难发现此时的答案就是fi+k再加上在[i+k+1,n]中以ai开头的最长不下降子序列的长度
当然我们也可以不考虑用ai开头,舍弃掉前面的贡献只考虑后面的最优贡献,这个特判一下即可
而维护前缀和后缀的最长不下降子序列都可以通过对值域开树状数组来维护,总复杂度O(nlogn)
#include<cstdio>#include<iostream>#include<algorithm>#define RI register int#define CI const int&usingnamespace std;
constint N=100005;
int n,k,a[N],rst[N],f[N],tot,ans;
#define lowbit(x) (x&-x)classTree_Array1//<={
private:
int bit[N];
public:
inlinevoidadd(RI x,CI y){
for (;x<=tot;x+=lowbit(x)) bit[x]=max(bit[x],y);
}
inlineintget(RI x,int ret=0){
for (;x;x-=lowbit(x)) ret=max(ret,bit[x]); return ret;
}
}T1;
classTree_Array2//>={
private:
int bit[N];
public:
inlinevoidadd(RI x,CI y){
for (;x;x-=lowbit(x)) bit[x]=max(bit[x],y);
}
inlineintget(RI x,int ret=0){
for (;x<=tot;x+=lowbit(x)) ret=max(ret,bit[x]); return ret;
}
}T2;
#undef lowbitintmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); RI i; for (scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d",&a[i]),rst[i]=a[i];
sort(rst+1,rst+n+1); tot=unique(rst+1,rst+n+1)-rst-1;
for (i=1;i<=n;++i) a[i]=lower_bound(rst+1,rst+tot+1,a[i])-rst;
for (i=1;i<=n;++i) f[i]=T1.get(a[i])+1,T1.add(a[i],f[i]);
for (i=n;i>k;--i)
{
ans=max(ans,f[i-k]+k-1+T2.get(a[i-k])+1);
int tmp=T2.get(a[i])+1; ans=max(ans,k+tmp); T2.add(a[i],tmp);
}
returnprintf("%d",ans),0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人