[Hdu1166]敌兵布阵(CQD分治)
2024-08-31 10:09:26
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]);
}
}
最新文章
- web报表工具FineReport常用函数的用法总结(报表函数)
- Spring 定时任务2
- get到的新技能
- ORACLE 10g 64位下载地址
- 调用gluNurbsCurve绘制圆弧
- POJ 2486 Apple Tree(树形DP)
- 对于服务器的识别的条件,header之类的使用
- springmvc的系统学习之配置方式
- XML DTD验证
- poj 3783 Balls 动态规划 100层楼投鸡蛋问题
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4
- 初识Android
- 【Android - 框架】之ORMLite的使用
- 【iOS与EV3混合机器人编程一系列五个】iOS_WiFi_EV3_Library 解剖连接EV3
- AP付款出现(-1)例外处理
- 201521123037 《Java程序设计》第6周学习总结
- HTML语义化的理解
- E3Upload项目总结
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
- spring_07使用spring的特殊bean、完成分散配置