所谓的懒操作模板题。
学好acm,英语很重要。做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意。最后确定了是线段树延迟更新果题。我就欣欣然上手敲了出来。
然后是漫长的段错误。。。。
第一次看见这种错误,还不知道什么意思,在那儿瞎改了好久也没过。最后看了下别人的代码,才知道这个题不管给的n是几,建树都是按0~8000建树。。。。
亏我第一次提交之前还跟yyf商量说这道题的n很奇怪,怎么又两个意思。。。。
我的zoj第一题。
#include<stdio.h> #include<string.h> #define N 8005 struct node { int x,y; int flag; }a[N*3]; int mark[N]; void CreatTree(int t,int x,int y) { a[t].x=x; a[t].y=y; a[t].flag=-1; if(x==y) return ; int temp=t*2; int mid=(x+y)/2; CreatTree(temp,x,mid); CreatTree(temp+1,mid+1,y); return ; } void InsertTree(int t,int x,int y,int k) { if(a[t].x==x&&a[t].y==y) { a[t].flag=k; return ; } int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(a[t].flag!=-1) { a[temp].flag=a[t].flag; a[temp+1].flag=a[t].flag; a[t].flag=-1; } if(y<=mid) InsertTree(temp,x,y,k); else if(x>mid) InsertTree(temp+1,x,y,k); else { InsertTree(temp,x,mid,k); InsertTree(temp+1,mid+1,y,k); } return ; } int FindTree(int t,int x) { if(a[t].x==a[t].y) return a[t].flag; int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(a[t].flag!=-1) { a[temp].flag=a[t].flag; a[temp+1].flag=a[t].flag; a[t].flag=-1; } if(x<=mid) return FindTree(temp,x); else return FindTree(temp+1,x); } int main() { int n; while(scanf("%d",&n)!=EOF) { CreatTree(1,1,8001); int i; for(i=1;i<=n;i++) { int x,y,k; scanf("%d%d%d",&x,&y,&k); int temp; if(x>y) { temp=x; x=y; y=temp; } x++; InsertTree(1,x,y,k); } memset(mark,0,sizeof(mark)); int t=-1; for(i=1;i<=8001;i++) { int temp; temp=FindTree(1,i); if(temp==t) continue; else if(temp!=t&&temp!=-1) mark[temp]++; t=temp; } for(i=0;i<=8001;i++) { if(mark[i]!=0) printf("%d %d\n",i,mark[i]); } printf("\n"); } return 0; }