密码:waxadyt
十年OI一场空,不输endl见祖宗
T1
打表找规律
从n>=5开始,就有相邻两个数的差是一个公差为28的等差数列
直接给代码吧
#includeusing namespace std;int main(){ int t; scanf("%d",&t); while(t--) { unsigned long long n; scanf("%llu",&n); if(n==0){printf("1\n");continue;} if(n==1){printf("9\n");continue;} if(n==2){printf("41\n");continue;} if(n==3){printf("109\n");continue;} if(n==4){printf("205\n");continue;} if(n==5){printf("325\n");continue;} printf("%llu\n",325+(148+(n-6)*14)*(n-5)); }}
T2
dfs裸题
加一个vis
代码
#includeusing namespace std;int vis[(1<<11)+1];int a[1001001],n,p;void dfs(int pos){ if(p)return; if(pos==(1<
T3
m<=15
15棵线段树解决问题233
代码
#includeusing namespace std;#define ls k<<1#define rs k<<1|1struct tree{ int le,ri,sum,lz,sumc[2];}t[16][50010<<2];int a[1001001][16],n,m,q,c[1001001][16];inline void pushdown(int p,int k){ if(t[p][k].lz==-1)return; t[p][ls].sum=t[p][ls].sumc[t[p][k].lz]; t[p][rs].sum=t[p][rs].sumc[t[p][k].lz]; t[p][ls].lz=t[p][rs].lz=t[p][k].lz; t[p][k].lz=-1;}inline void pushup(int p,int k){ t[p][k].sum=t[p][ls].sum+t[p][rs].sum; t[p][k].sumc[0]=t[p][ls].sumc[0]+t[p][rs].sumc[0]; t[p][k].sumc[1]=t[p][ls].sumc[1]+t[p][rs].sumc[1];}void build(int p,int k,int l,int r){ t[p][k].le=l; t[p][k].ri=r; t[p][k].lz=-1; if(l==r) { t[p][k].sum=c[l][p]==0; t[p][k].sumc[0]=c[l][p]==0; t[p][k].sumc[1]=c[l][p]==1; return; } int mid=l+r>>1; build(p,ls,l,mid); build(p,rs,mid+1,r); pushup(p,k);}void modify(int p,int k,int l,int r,int v){ int le=t[p][k].le; int ri=t[p][k].ri; if(l==le&&r==ri) { t[p][k].sum=t[p][k].sumc[v]; t[p][k].lz=v; return; } pushdown(p,k); int mid=le+ri>>1; if(l>mid)modify(p,rs,l,r,v); else if(mid+1>r)modify(p,ls,l,r,v); else modify(p,ls,l,mid,v),modify(p,rs,mid+1,r,v); pushup(p,k);}inline int get(){ char c=getchar(); while(c!='0'&&c!='1')c=getchar(); return (c-'0');}int main(){ scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { c[i][j]=get(); } } for(int i=1;i<=m;i++)build(i,1,1,n); for(int i=1;i<=q;i++) { int x,y,xx,yy,p; scanf("%d%d%d%d%d",&x,&xx,&y,&yy,&p); for(int i=y;i<=yy;i++)modify(i,1,x,xx,p); int ans=0; for(int i=1;i<=m;i++)ans+=t[i][1].sum; printf("%d\n",ans); }}