杭州赛区最后一题。。。。
最近看线段树还是有收获的·~~~
#include
#include
#include
#include
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
#define sf scanf
#define pf printf
using namespace std;
const int N = 10000 * 2 +10;
//437MS 2512K 3151 B C++
/*
比赛的时候也想到了容斥原理,但是并没有那么做,而是用cnt[3][rt]记录每种颜色的线
条有还是没有,结果把自己卡死了。。。。
比赛后用容斥原理做了一下,好吧,还是容斥原理好做些。
建立7课线段树,拿矩形覆盖面积模版一套即可求出 R, G, B, RG, RB, GB, RGB 7种颜色
的面积值sum[],但这个并不是最终答案,画个韦恩图就得出关系了,进而求得are[]。
注意:sum,are要 __int64
*/
int cnt[N<<2];
int len[N<<2];
int tot[10];
__int64 sum[10],are[10];
struct segment{
int lx,rx,y;
int kind;
}s[10][N];
int x[10][N];
int xcount[10];
bool cmp(segment s1,segment s2){
return s1.y>1;
if(l==ql && r==qr) cnt[rt]+=kind;
else if(qr<=m) updata(ql,qr,lson,kind,k);
else if(ql>m) updata(ql,qr,rson,kind,k);
else{
updata(ql,m,lson,kind,k);
updata(m+1,qr,rson,kind,k);
}
pushup(l,r,rt,k);
}
void input(int a,int x1,int x2,int y1,int y2){
x[a][tot[a]]=x1;
s[a][tot[a]].lx=x1;
s[a][tot[a]].rx=x2;
s[a][tot[a]].y=y1;
s[a][tot[a]].kind=1;
tot[a]++;
x[a][tot[a]]=x2;
s[a][tot[a]].lx=x1;
s[a][tot[a]].rx=x2;
s[a][tot[a]].y=y2;
s[a][tot[a]].kind=-1;
tot[a]++;
}
#define test(a,b) for(int ii=0;ii<(b);ii++)printf("%d%c",(a)[ii],ii==(b)-1?'\n':' ')
#define cntd(a,b) unique((a),(a)+(b))-(a)
#define lb(a,b,c) lower_bound((a),(a)+(b),(c))-(a)
#define fill(a) memset( (a),0,sizeof((a)) );
int main(){
int n,tt,col,cas=1;
scanf("%d",&tt);
while(tt--){
scanf("%d",&n);
fill(tot);
fill(sum);
fill(are);
for(int i=0;i