[Hdu1166]敌兵布阵(CQD分治)

Posted void_f

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Hdu1166]敌兵布阵(CQD分治)相关的知识,希望对你有一定的参考价值。

CQQ分治

Code

#include <cstdio>
#include <cstring>
#define N 50010

struct info{
	int x,p,v;
	info(int a,int b,int c):x(a),p(b),v(c){}
	info(){x=p=v=0;}
	friend bool operator < (info a,info b){
		return a.p==b.p?a.x<b.x:a.p<b.p;
	}
}que[N*3],tmp[N*3];
int n,qn,an,Ans[N];

inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}

inline void Init(){
	qn=an=0;
	memset(Ans,0,sizeof(Ans));
	n=read();	
	for(int i=1,x;i<=n;++i) x=read(),que[qn++]=info(1,i,x);
	char s[10];
	for(;;){
		scanf("%s",s);
		if(s[0]==‘E‘) break;
		if(s[0]==‘Q‘){
			int l=read(),r=read();
			que[qn++]=info(2,l-1,an);
			que[qn++]=info(3,r,an++);
		}else{
			int p=read(),v=read();
			if(s[0]==‘S‘) v=-v;
			que[qn++]=info(1,p,v);
		}
	}
}

void solve(int l,int r){
	if(l+1>=r) return;
	int m=(l+r)>>1;
	solve(l,m),solve(m,r);
	int p=l,q=m,cnt=0,sum=0;
	while(p<m&&q<r){
		if(que[p]<que[q]){
			if(que[p].x==1) sum+=que[p].v;
			tmp[cnt++]=que[p++];
		}else{
			if(que[q].x==2) Ans[que[q].v]-=sum;
			else if(que[q].x==3) Ans[que[q].v]+=sum;
			tmp[cnt++]=que[q++];
		}
	}
	while(p<m) tmp[cnt++]=que[p++];
	while(q<r){
		if(que[q].x==2) Ans[que[q].v]-=sum;
		else if(que[q].x==3) Ans[que[q].v]+=sum;
		tmp[cnt++]=que[q++];
	}
	for(int i=0;i<cnt;++i) que[i+l]=tmp[i];
}

int main(){
	for(int T=read(),i=1;i<=T;++i){
		Init();
		solve(0,qn);
		printf("Case %d:\n",i);
		for(int i=0;i<an;++i) printf("%d\n",Ans[i]);
	}
}

 

以上是关于[Hdu1166]敌兵布阵(CQD分治)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1166 敌兵布阵

HDU 1166 敌兵布阵

[HDU 1166]敌兵布阵

hdu 1166 敌兵布阵

HDU 1166 敌兵布阵

HDU 1166 敌兵布阵(线段树)