由于线段树的插入和更新还搞不大清楚所以做这题很痛苦,搞了半天总算在偷看大牛代码以后过了...
学到了如何更新~
#include <iostream>
using namespace std;
struct Seg
{
int l,r,data;
}seg[8000*3];
int col[8001];
int tmp;
void mkseg(int x,int l,int r)
{
seg[x].l=l;
seg[x].r=r;
seg[x].data=-1;
if(r==l+1)return;
int mid=(l+r)/2;
mkseg(2*x,l,mid);
mkseg(2*x+1,mid,r);
}
void clc(int x)
{
if(seg[x].data!=-1&&seg[x].l+1!=seg[x].r)seg[2*x].data=seg[2*x+1].data=seg[x].data;
if(seg[x].l+1!=seg[x].r)seg[x].data=-1;
}
void ins(int x,int data,int l,int r)
{
int mid=(seg[x].l+seg[x].r)/2;
clc(x);
if(l<=seg[x].l&&seg[x].r<=r)
{
seg[x].data=data;
return;
}
if(r<=mid)ins(2*x,data,l,r);
else
if(l>=mid)ins(2*x+1,data,l,r);
else
{
ins(2*x,data,l,mid);
ins(2*x+1,data,mid,r);
}
}
void count(int x)
{
if(seg[x].data!=-1)
{
if(tmp!=seg[x].data)
{
col[seg[x].data]++;
tmp=seg[x].data;
}
return;
}
if(seg[x].l+1!=seg[x].r)
{
count(2*x);
count(2*x+1);
}
else
tmp=-1;
}
int main ()
{
int i,l,r,c,n;
//OPEN
while(scanf("%d",&n)!=EOF)
{
memset(col,0,sizeof(col));
mkseg(1,0,8000);
for(i=0;i<n;i++)
{
scanf("%d%d%d",&l,&r,&c);
ins(1,c,l,r);
}
tmp=-1;
count(1);
for(i=0;i<8001;i++)
if(col[i]!=0)
printf("%d %d/n",i,col[i]);
puts("");
}
return 0;
}
下面是我写的,只需要开一次线段树。
#include<iostream>
#include<algorithm>
using namespace std;
struct Seg
{
int l,r,c,id;
}seg[32767];
int cnt[8001],tmp,id=0;
void mkseg(int l,int r,int x)
{
seg[x].l=l;
seg[x].r=r;
seg[x].c=-1;
seg[x].id=0;
if(l==r-1)return;
int mid=(l+r)/2;
mkseg(l,mid,2*x);
mkseg(mid,r,2*x+1);
}
void ins(int l,int r,int c,int x)
{
if(seg[x].l+1!=seg[x].r)
{
if(seg[x].c!=-1&&seg[x].id==id)
seg[2*x].c=seg[2*x+1].c=seg[x].c,seg[x].c=-1,seg[2*x].id=id,seg[2*x+1].id=id;
}
if(l<=seg[x].l&&seg[x].r<=r)
{
seg[x].c=c;
seg[x].id=id;
return;
}
int mid=(seg[x].l+seg[x].r)/2;
if(l>=mid)
ins(l,r,c,2*x+1);
else
if(r<=mid)
ins(l,r,c,2*x);
else
ins(l,mid,c,2*x),ins(mid,r,c,2*x+1);
}
void pre(int x)
{
if(seg[x].c!=-1&&seg[x].id==id)
{
if(seg[x].c!=tmp)
cnt[seg[x].c]++;
tmp=seg[x].c;
return;
}
if(seg[x].l+1==seg[x].r){tmp=-1;return;}
pre(2*x);
pre(2*x+1);
}
int main()
{
int n,i,x,y,c;
mkseg(0,8000,1);
while(scanf("%d",&n)!=EOF)
{
memset(cnt,0,sizeof(cnt));
++id;
while(n--)
{
scanf("%d%d%d",&x,&y,&c);
if(x>y)x^=y,y^=x,x^=y;
ins(x,y,c,1);
}
tmp=-1;
pre(1);
for(i=0;i<=8000;i++)if(cnt[i])printf("%d %d/n",i,cnt[i]);
puts("");
}
return 0;
}