Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
错误的代码能过 对的代码过不了!1 3 1 10 1 3 6 10 这数据结果显然是3 下面AC代码算出是 2 后面那个代码算出是 3 提交确实WA #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define inr 30010 using namespace std; typedef struct { int s; int left,right; } Node; int vis[2*inr]; Node tree[8*inr]; int mp[inr][2]; int can[2*inr],sum; int h[10000020]; int Build(int root,int left,int right) { tree[root].left=left; tree[root].right=right; tree[root].s=0; if(left==right) return 0; int mid=(left+right)/2; Build(2*root,left,mid); Build(2*root+1,mid+1,right); } int Update(int root,int left,int right,int x) { if(tree[root].left>right||tree[root].right<left) return 0; if(tree[root].left>=left&&tree[root].right<=right) { tree[root].s=x; return 0; } if(tree[root].s!=0) { tree[2*root].s=tree[root].s; tree[2*root+1].s=tree[root].s; tree[root].s=0; } Update(2*root,left,right,x); Update(2*root+1,left,right,x); } int Find(int root) { if(tree[root].s!=0) //切记两个if分开写 { if(vis[tree[root].s]==0) { sum++; vis[tree[root].s]=1; } return 0; } if(tree[root].left==tree[root].right) return 0; Find(2*root); Find(2*root+1); } int main() { int T,m,n,a,b; cin>>T; while(T--) { sum=n=0; scanf("%d",&m); memset(vis,0,sizeof(vis)); memset(h,0,sizeof(h)); for(int i=1; i<=m; i++) { scanf("%d%d",&mp[i][0],&mp[i][1]); if(!h[mp[i][0]]) { can[n++]=mp[i][0]; h[mp[i][0]]=1; } if(!h[mp[i][1]]) { can[n++]=mp[i][1]; h[mp[i][1]]=1; } } sort(can,can+n); Build(1,1,n+1); for(int i=1; i<=n; i++) { h[can[i-1]]=i; //此处不同 } for(int i=1; i<=m; i++) { mp[i][0]=h[mp[i][0]]; mp[i][1]=h[mp[i][1]]; Update(1,mp[i][0],mp[i][1],i); } Find(1); printf("%d\n",sum); } return 0; } #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #define inr 20010 using namespace std; typedef struct { int color; int left,right; }Node; int can[2*inr]; Node tree[12*inr]; int hs[10000025],sum; int mp[inr][2],vis[inr]; int Build(int root,int left ,int right) { tree[root].left=left; tree[root].right=right; tree[root].color=0; if(left==right) return 0; int mid=(left+right)>>1; Build(root<<1,left,mid); Build(root<<1|1,mid+1,right); } int Update(int root,int left,int right,int x) { if(tree[root].left>right||tree[root].right<left) return 0; if(tree[root].left>=left&&tree[root].right<=right) { tree[root].color=x; return 0; } if(tree[root].color!=0) { tree[root<<1].color=tree[root].color; tree[root<<1|1].color=tree[root].color; tree[root].color=0; } Update(root<<1,left,right,x); Update(root<<1|1,left,right,x); } int Find(int root) { if(tree[root].color!=0) { if(vis[tree[root].color]==0) { sum++; vis[tree[root].color]=1; } return 0; } if(tree[root].left==tree[root].right) return 0; Find(root<<1); Find(root<<1|1); } int main() { int T,m,n; cin>>T; while(T--) { sum=m=0; scanf("%d",&n); memset (vis,0,sizeof(vis)); memset (hs,0,sizeof(hs)); for(int i=1; i<=n;i++) { scanf("%d%d",&mp[i][0],&mp[i][1]); if(!hs[mp[i][0]]) { can[m++]=mp[i][0]; hs[mp[i][0]]=1; } if(!hs[mp[i][1]]) { can[m++]=mp[i][1]; hs[mp[i][1]]=1; } } sort(can,can+m); for(int i=1;i<=m;i++) { hs[can[i-1]]=2*i-1; //次处不同 } Build(1,1,2*(m+1)); for(int i=1;i<=n;i++) { mp[i][0]=hs[mp[i][0]]; mp[i][1]=hs[mp[i][1]]; Update(1,mp[i][0],mp[i][1],i); } Find(1); printf("%d\n",sum); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator