只能说线段树太强大了,以下是我的代码(含注释),希望大家能看懂: #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; const int Max=5005; struct lineTree{ //线段树结构体 int down,up; //线段上下端坐标 int len,num; //线段长度,连续线段的个数 int numD,numU; //上下两端的覆盖次数 int numCover; //线段覆盖次数 }T[8*Max]; struct node{ //节点信息结构体 int x,y1,y2; //标记线段的各坐标 bool f; //标记线段是矩阵的左或右 }Node[2*Max]; struct pt_cmp { bool operator () ( const node &a, const node &b ) const { return a.x < b.x; } }; void buildTree(int d,int u,int step) { T[step].numCover=0;T[step].len=0; T[step].numD=false;T[step].numU=false; T[step].num=0; T[step].down=d;T[step].up=u; if(u-d>1) { buildTree(d,(d+u)/2,2*step); buildTree((d+u)/2,u,2*step+1); } } void update(int step) //更新线段树节点的信息 { if(T[step].numCover>0) { T[step].len=T[step].up-T[step].down; T[step].num=1; } else { if(T[step].up-T[step].down>1) { T[step].len=T[2*step].len+T[2*step+1].len; T[step].num=T[2*step].num+T[2*step+1].num; if(T[step].num&&T[2*step].numU&&T[2*step+1].numD) T[step].num--; } else { T[step].len=0; T[step].num=0; } } } void Insert(int d,int u,int step) //线段插入 { if(T[step].down==d) T[step].numD++; if(T[step].up==u) T[step].numU++; if(d==T[step].down&&T[step].up==u) T[step].numCover++; else { int mid=(T[step].down+T[step].up)/2; if(u<=mid) Insert(d,u,2*step); else if(d>=mid) Insert(d,u,2*step+1); else { Insert(d,mid,2*step); Insert(mid,u,2*step+1); } } update(step); } void Del(int d,int u,int step) //线段删除 { if(T[step].down==d) T[step].numD--; if(T[step].up==u) T[step].numU--; if(d==T[step].down&&T[step].up==u) T[step].numCover--; else { int mid=(T[step].down+T[step].up)/2; if(u<=mid) Del(d,u,2*step); else if(d>=mid) Del(d,u,2*step+1); else { Del(d,mid,2*step); Del(mid,u,2*step+1); } } update(step); } int main() { int n; while(cin>>n) { int Maxy=-2*Max,Miny=2*Max; int m=0; int x1,x2,y1,y2; for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(y1<Miny) Miny=y1; if(y2>Maxy) Maxy=y2; Node[++m].x=x1; Node[m].y1=y1; Node[m].y2=y2; Node[m].f=true; Node[++m].x=x2; Node[m].y1=y1; Node[m].y2=y2; Node[m].f=false; } sort(Node+1,Node+1+m,pt_cmp()); buildTree(Miny,Maxy,1); int sum=0; int lastlen=0,lastnum=0; for(int i=1;i<=m;i++) { if(Node[i].f) Insert(Node[i].y1,Node[i].y2,1); else Del(Node[i].y1,Node[i].y2,1); sum+=abs(T[1].len-lastlen); lastlen=T[1].len; if(i!=1) sum+=2*(Node[i].x-Node[i-1].x)*lastnum; lastnum=T[1].num; } cout<<sum<<endl; } return 0; }