2018年湖南省第十四届大学生计算机程序设计竞赛 CSU 2170: 千万别用树套树

题目传送门
比赛时想的解法,整体二分+树状数组
具体看代码吧

代码:

#include
using namespace std;

const int maxn=100000+100;

struct Node{
	
	int l,r;
	int type,id;
};
int n,q;
Node node[maxn],a[maxn],b[maxn];
int tree[maxn],user[maxn],tot;
int ans[maxn];

void Add(int x){
	
	while(x<=n){
		
		if(user[x]!=tot) user[x]=tot,tree[x]=0;
		tree[x]++;
		x+=(x&(-x));
	}
}

int getsum(int x){
	
	int sum=0;
	while(x){
		
		if(user[x]!=tot) user[x]=tot,tree[x]=0;
		sum+=tree[x];
		x-=(x&(-x));
	} 
	return sum;
}

void kaven(int l,int r,int L,int R){

    tot++;
	if(L==R){
		
		for(int i=l;i<=r;i++){
			
			if(node[i].type==1) Add(node[i].r);
			else ans[node[i].id]+=(getsum(n)-getsum(node[i].r-1));
		}
		return ;
	}
	int mid=(L+R)>>1;
	int atot=0,btot=0;
	for(int i=l;i<=r;i++){
		
		if(node[i].type==1){
			
			if(node[i].l<=mid) Add(node[i].r),a[atot++]=node[i];
			else b[btot++]=node[i];
		}
		else{
			
			if(node[i].l>mid) ans[node[i].id]+=(getsum(n)-getsum(node[i].r-1)),b[btot++]=node[i];
			else if(node[i].l==mid) ans[node[i].id]+=(getsum(n)-getsum(node[i].r-1));
			else a[atot++]=node[i];
		}
	}
	for(int i=0;i

你可能感兴趣的:(ACM)