Memory Limit: 32768/32768 K (Java/Others)
5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
5 6 5 9HintHuge input,the C function scanf() will work better than cin
只能怪自己知识算法掌握得不够,开始用线段数做,看起来和敌兵布阵一样,但一个CE一个RE,绝望啊,看起来一样,而且运行也没有错,趁着吃饭的时间又打了遍,AC~~~再看看以前的代码,然后就明白了自己的不足--没有虚心潜心学习,明白了一点就沾沾自喜,以为自己掌握了,结果.................
CE代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int N=200000+50; struct node { int l,r,n; }a[N<<2]; int max(int a,int b) { return a>b?a:b; } void build(int l,int r,int k) { int mid; if(l==r) { a[k].l=a[k].r=l; a[k].n=0; return ; } mid=(l+r)/2; a[k].l=l,a[k].r=r; build(l,mid,2*k); build(mid+1,r,2*k+1); } void insert(int n,int d,int k) { int mid; if(a[k].l==a[k].r&&a[k].r==d) { a[k].n+=n; return ; } mid=(a[k].l+a[k].r)/2; if(d<=mid) insert(n,d,2*k); else insert(n,d,2*k+1); a[k].n=max(a[k*2].n,a[k*2+1].n); } void xiugai(int n,int d,int k) { int mid; if(a[k].l==a[k].r&&a[k].r==d) { a[k].n=n; return ; } mid=(a[k].l+a[k].r)/2; if(d<=mid) xiugai(n,d,2*k); else xiugai(n,d,2*k+1); a[k].n=max(a[k*2].n,a[k*2+1].n); } int maxx; void query(int l,int r,int k) { int mid; if(a[k].l==l&&a[k].r==r) { maxx=max(maxx,a[k].n); return ; } mid=(a[k].l+a[k].r)/2; if(r<=mid) query(l,r,2*k); else if(l>mid) query(l,r,2*k+1); else { query(l,mid,2*k); query(mid+1,r,2*k+1); } } int main() { int t,n,m,i; char c; while(~scanf("%d%d",&n,&t)) { build(1,n,1); for(i=1;i<=n;i++) { scanf("%d",&m); insert(m,i,1); } int a,b; while(scanf("%c",&c)) { maxx=0; scanf("%d%d",&a,&b); if(c=='Q') { query(a,b,1); printf("%d\n",maxx); } else if(c=='U') { xiugai(b,a,1); } } } return 0; }
与下面的AC代码就可以明显看出区别了:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> using namespace std; const int N=200000+10; struct node { int l,r,n; } a[N<<2]; void build(int l,int r,int k) { int mid; if(l==r) { a[k].l=a[k].r=l; a[k].n=0; return ; } mid=(l+r)/2; a[k].l=l,a[k].r=r; build(l,mid,2*k),build(mid+1,r,2*k+1); } void update(int d,int n,int k) { int mid; if(a[k].l==a[k].r&&a[k].l==d) { a[k].n=n; return ; } mid=(a[k].l+a[k].r)/2; if(d<=mid) update(d,n,2*k); else if(d>mid) update(d,n,2*k+1); a[k].n=max(a[k*2].n,a[k*2+1].n); } int maxn; void query(int l,int r,int k) { int mid; if(a[k].l==l&&a[k].r==r) { maxn=max(a[k].n,maxn); return ; } mid=(a[k].l+a[k].r)/2; if(r<=mid) query(l,r,2*k); else if(l>mid) query(l,r,2*k+1); else { query(l,mid,2*k); query(mid+1,r,2*k+1); } } int main() { int n,m,x,i; char s; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); build(1,n,1); for(i=1; i<=n; i++) { scanf("%d",&x); update(i,x,1); } int a,b; while(m--) { getchar(); scanf("%c%d%d",&s,&a,&b); if(s=='U') update(a,b,1); else { maxn=0; query(a,b,1); printf("%d\n",maxn); } } } return 0; }
都是出自自己的手,只不过创作时间不同,然而熟练与否一眼便可知晓;