标签:
好爽啊 晚上不回宿舍打比赛
最后打了三题 fail了一题.. 是因为第三题>=‘9‘就进位了...
打的时候被hack了一次cnm变大变小只有一个数的时候判断是不是0和15 其他的话判断一下最后的那个是不是0和15和增减性就好了
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #define Maxn 100 using namespace std; int N,A[Maxn]; int main() { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&A[i]); if(N==1){if(A[1]==0) printf("UP\n"); else if(A[1]==15) printf("DOWN\n"); else printf("-1\n"); return 0;} else { if(A[N]>A[N-1]) { if(A[N]==15) printf("DOWN\n"); else printf("UP\n"); } else if(A[N]<A[N-1]) { if(A[N]==0) printf("UP\n"); else printf("DOWN\n"); } } return 0; }
这道题硕爷用了三分钟ac 我被吓到了 心情平复一下 然后认为和字符串连续的多少有关然后dp
后来发现要间隔 一端连续的并不能说是把那些删去或者换掉 所以这也提醒了我 间隔的方式只有两种
然后按照这两种间隔方式dp 不同的记录一下 然后先交换 再一个个变 这样显然
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<climits> #define Maxn 100010 using namespace std; char str[Maxn]; int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int N; scanf("%d",&N); for(int i=1;i<=N;i++) scanf("\n%c",&str[i]); int F1=0, F2=0; for(int i=1;i<=N;i++) { if(str[i]==‘b‘&&i%2==1) F2++; if(str[i]==‘r‘&&i%2==0) F1++; } int minx=INT_MAX; minx=min(minx,max(F1,F2)); F1=0, F2=0; for(int i=1;i<=N;i++) { if(str[i]==‘b‘&&i%2==0) F2++; if(str[i]==‘r‘&&i%2==1) F1++; } minx=min(minx,max(F1,F2)); return printf("%d\n",minx),0; }
这道题一看就知道贪心 只是细节 比如说我就fail掉了 从最大的位可以进的就进就好了
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #define Maxn 200010 using namespace std; char str[Maxn]; int main() { int N,T; scanf("%d%d",&N,&T); for(int i=1;i<=N;i++) scanf("\n%c",&str[i]); int p; for(int i=1;i<=N;i++) if(str[i]==‘.‘) p=i; int L=N-p+1; int last=N+1; int tot=1; for(int i=p;i<=N;i++) { if(str[i]>=‘5‘&&str[i]<=‘9‘){last=i; break;} } if(last!=N+1) { L=N-last; str[last-1]++; last--; while(tot<T&&last>p&&str[last]>=‘5‘&&str[last]<=(‘9‘+1)) { last--; tot++; str[last]++; } if(last==p) { str[last]=‘.‘; str[p-1]++; last=p-1; while(str[last]>‘9‘) { str[last]=‘0‘; str[last-1]++; last--; } } }else last=N; if(str[0]==1) printf("1"); for(int i=1;i<p;i++) if(str[i]>=(‘9‘+1)) printf("0"); else printf("%c",str[i]); if(last>p) { printf("."); for(int i=p+1;i<=last;i++) if(str[i]>=(‘9‘+1)) printf("0"); else printf("%c",str[i]); } return 0; }
D 删掉了
就back回这一题 当时看完题栋爷给我讲了 但是没时间写 硕爷好6一个小时草掉了 我调了一个上午加个下午
这道题原来以为是卡常 然后发现要打的非常严谨 一定要nlogn
区间想到的就是线段树 然后斐波那契数列就在每个节点都放一个矩阵 来做矩阵乘法
每一个节点维护下面的矩阵的大小的和 就是每个元素加起来的呵
矩阵乘法是满足分配律的!!!!!!!!!!!!!!!!
比如说你要求lc和rc的答案 或者说是在lc和rc同时增加后求答案 那么(lc*c+rc*c)=u*c
然后就是怎么保证nlogn的问题 给出优化方案:
1.区间增加的时候不要看到一个区间就算一次 在外面先算一次 在里面的时候乘一下就好 这样就不是log^2而是 log+log
2.lazy下传的时候传一个矩阵 同样的 如果是传一个数 那么下面的数就会累计了上面很多数的和 那么到时候找的时候又要log
而直接传矩阵的话就不需要快速幂 只需要转移的速度罢了 打的时候很烦躁 代码略猥琐
#include<cstdio> #include<iostream> #include<cstring> #include<iostream> #include<cstdlib> #include<cmath> #include<climits> #define Maxn 100010 using namespace std; typedef long long LL; const LL Mod=1e9+7; struct node { LL A[2][2]; }C[4*Maxn],Sim,B,V,Bit[70],P,lazy[4*Maxn]; int N,M; LL A[4*Maxn]; int lc[4*Maxn],rc[4*Maxn]; int root,tot; void Add_Matrix(int x,int y) { for(int i=0;i<2;i++) for(int j=0;j<1;j++) if(C[x].A[i][j]+C[y].A[i][j]>Mod) C[x].A[i][j]=(C[x].A[i][j]+C[y].A[i][j])%Mod; else C[x].A[i][j]+=C[y].A[i][j]; } LL bit[Maxn]; void Quick(LL c) { B.A[0][0]=1; B.A[0][1]=0; B.A[1][0]=0; B.A[1][1]=1; for(int p=0;c>=bit[p];p++) { if((c&bit[p])==bit[p]) { for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=B.A[i][j]; for(int i=0;i<2;i++) for(int j=0;j<2;j++) B.A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) if(B.A[i][j]+V.A[i][k]*Bit[p].A[k][j]>Mod) B.A[i][j]=(B.A[i][j]+V.A[i][k]*Bit[p].A[k][j])%Mod; else B.A[i][j]=B.A[i][j]+V.A[i][k]*Bit[p].A[k][j]; } } } void Add(int u,node c) { for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=lazy[u].A[i][j]; for(int i=0;i<2;i++) for(int j=0;j<2;j++) lazy[u].A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) if(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j]>Mod) lazy[u].A[i][j]=(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j])%Mod; else lazy[u].A[i][j]=(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j]); for(int i=0;i<2;i++) for(int j=0;j<1;j++) V.A[i][j]=C[u].A[i][j]; for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++) if(C[u].A[i][j]+c.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+c.A[i][k]*V.A[k][j])%Mod; else C[u].A[i][j]=(C[u].A[i][j]+c.A[i][k]*V.A[k][j]); } void Push_Down(int u) { if(lazy[u].A[0][0]!=1||lazy[u].A[0][1]!=0||lazy[u].A[1][0]!=0||lazy[u].A[1][1]!=1) { Add(lc[u],lazy[u]); Add(rc[u],lazy[u]); lazy[u]=Sim; } } void Link(int &u,int L,int R) { if(!u) u=++tot; lazy[u]=Sim; if(L==R) { Quick(A[L]-1); V.A[0][0]=0; V.A[1][0]=1; for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++) if(C[u].A[i][j]+B.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+B.A[i][k]*V.A[k][j])%Mod; else C[u].A[i][j]=(C[u].A[i][j]+B.A[i][k]*V.A[k][j]); return ; } int mid=(L+R)>>1; Link(lc[u],L,mid);Add_Matrix(u,lc[u]); Link(rc[u],mid+1,R);Add_Matrix(u,rc[u]); } void Change(int u,int L,int R,int l,int r,LL c) { if(L==l&&R==r) { for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=lazy[u].A[i][j]; for(int i=0;i<2;i++) for(int j=0;j<2;j++) lazy[u].A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) if(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j]>Mod) lazy[u].A[i][j]=(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j])%Mod; else lazy[u].A[i][j]=(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j]); for(int i=0;i<2;i++) for(int j=0;j<1;j++) V.A[i][j]=C[u].A[i][j]; for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0; for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++) if(C[u].A[i][j]+P.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+P.A[i][k]*V.A[k][j])%Mod; else C[u].A[i][j]=(C[u].A[i][j]+P.A[i][k]*V.A[k][j]); return ; } int mid=(L+R)>>1; Push_Down(u); if(r<=mid) Change(lc[u],L,mid,l,r,c); else if(l>mid) Change(rc[u],mid+1,R,l,r,c); else { Change(lc[u],L,mid,l,mid,c); Change(rc[u],mid+1,R,mid+1,r,c); } for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0; Add_Matrix(u,lc[u]); Add_Matrix(u,rc[u]); } LL ans=0; void Ask(int u,int L,int R,int l,int r) { if(L==l&&R==r){ans=(ans+C[u].A[1][0])%Mod; return;} int mid=(L+R)>>1; Push_Down(u); if(r<=mid) Ask(lc[u],L,mid,l,r); else if(l>mid) Ask(rc[u],mid+1,R,l,r); else { Ask(lc[u],L,mid,l,mid); Ask(rc[u],mid+1,R,mid+1,r); } } int read() { char c; int t; int f; t = 0; f = 1; c = getchar(); for(; c < ‘0‘ || c > ‘9‘; c = getchar()) if(c == ‘-‘) f = -1; for(; c >= ‘0‘ && c <= ‘9‘; c = getchar()) t = t * 10 + (c - ‘0‘); return t * f; } int main() { N=read(); M=read(); root=tot=0; bit[0]=1; for(int i=1;i<=63;i++) bit[i]=bit[i-1]*2; Sim.A[0][0]=1; Sim.A[0][1]=0; Sim.A[1][0]=0; Sim.A[1][1]=1; Bit[0].A[0][0]=0; Bit[0].A[0][1]=Bit[0].A[1][0]=Bit[0].A[1][1]=1; for(int p=1;p<=65;p++) for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) Bit[p].A[i][j]=(Bit[p].A[i][j]+Bit[p-1].A[i][k]*Bit[p-1].A[k][j])%Mod; for(int i=1;i<=N;i++) A[i]=read(); Link(root,1,N); for(int i=1;i<=M;i++) { int opt; opt=read(); if(opt==1) { int l,r; int x; l=read(); r=read(); x=read(); Quick(x); for(int i=0;i<2;i++) for(int j=0;j<2;j++) P.A[i][j]=B.A[i][j]; Change(root,1,N,l,r,x); } else if(opt==2) { int l,r; l=read(); r=read(); ans=0; Ask(root,1,N,l,r); printf("%I64d\n",ans); } } return 0; }
Codeforces Round #373 (Div. 2)
标签:
原文地址:http://www.cnblogs.com/wohenshuai/p/5906127.html