CDQ分治求前缀和
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,a_tot,q_tot,ans[N];
char s[];
struct query
{
int id,v,op;
bool operator < (const query &rhs)const
{
if(id==rhs.id) return op<rhs.op;
return id<rhs.id;
}
}query[N],tmp[N];
void init()
{
a_tot=; q_tot=;
memset(ans,,sizeof(ans));
}
void cdq(int l,int r)
{
if(l==r) return;
int m=(l+r)>>;
cdq(l,m); cdq(m+,r);
int p=l,q=m+,tot=,sum=;
while(p<=m && q<=r)
{
if(query[p]<query[q])
{
if(query[p].op==) sum+=query[p].v;
tmp[tot++]=query[p++];
}
else
{
if(query[q].op==) ans[query[q].v]+=sum;
else if(query[q].op==) ans[query[q].v]-=sum;
tmp[tot++]=query[q++];
}
}
while(p<=m) tmp[tot++]=query[p++];
while(q<=r)
{
if(query[q].op==) ans[query[q].v]+=sum;
else if(query[q].op==) ans[query[q].v]-=sum;
tmp[tot++]=query[q++];
}
for(int i=;i<tot;i++) query[i+l]=tmp[i];
}
int main()
{
int T; scanf("%d",&T);
for(int Case=;Case<=T;Case++)
{
init();
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int g; scanf("%d",&g);
query[a_tot].op=;
query[a_tot].id=i;
query[a_tot++].v=g;
}
while(scanf("%s",&s)!=EOF)
{
if(s[]=='E') break;
if(s[]=='S' || s[]=='A')
{
int flag=,x,v;
if(s[]=='S') flag=-;
scanf("%d%d",&x,&v);
query[a_tot].id=x;
query[a_tot].v=flag*v;
query[a_tot++].op=;
}
else
{
int l,r; scanf("%d%d",&l,&r);
query[a_tot].id=l-;
query[a_tot].op=;
query[a_tot++].v=q_tot;
query[a_tot].id=r;
query[a_tot].op=;
query[a_tot++].v=q_tot;
q_tot++;
}
}
cdq(,a_tot-);
printf("Case %d:\n",Case);
for(int i=;i<q_tot;i++) printf("%d\n",ans[i]);
}
return ;
}
CDQ分治求前缀和的更多相关文章
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
- hdu5618(cdq分治求三维偏序)
题意:给n(n<=100000)个点,坐标为(xi,yi,zi)(1<=xi,yi,zi<=100000),定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB, ...
- CDQ分治求不知道多少维偏序 (持续更新 ]
求三维偏序的模板 : //Author : 15owzLy1 //luogu3810.cpp //2018 12 25 16:31:58 #include <cstdio> #includ ...
- BOI2007 Mokia | cdq分治求二维点数模板
题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqw ...
- SPOJ:Another Longest Increasing Subsequence Problem(CDQ分治求三维偏序)
Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it ...
- CDQ分治学习笔记(三维偏序题解)
首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai.b_ibi.c_ ...
- bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...
- [模板] CDQ分治&&BZOJ3262:陌上花开
简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...
- [luogu3810][bzoj3262]陌下花开【cdq分治】
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示.现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅Sa&g ...
随机推荐
- 从池子里的beta看秋香, 个性迥异
从池子里的beta看秋香, 个性迥异 前文里那十只个股为例, 统计了它们的beta值. 回顾如下: Num name code Beta 0 深圳燃气 601139 0.710 公用事业 1 分众传媒 ...
- storm-starter 例子学习
storm-starter 是 apache storm 针对初学者的一个用maven管理的项目示例.这篇文章记录storm-starter例子代码分析及执行. 参考:https://github.c ...
- Visual Studio Code 常用快捷键
VsCode 快捷键有五种组合方式(科普) Ctrl + Shift + ? : 这种常规组合按钮 Ctrl + V Ctrl +V : 同时依赖一个按键的组合 Shift + V c : 先组合后单 ...
- bootstrap modal垂直居中 (转)
根据博友的经验,总结后请使用方法一就行了 一,修改bootstrap.js 源码 原来的: Modal.prototype.adjustDialog = function () { ].scrollH ...
- stm32启动文件ld md hd cl vl xl分析及选择
startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx, ...
- javaScript事件系统详解
一个有情怀的猴子
- QA系统Match-LSTM代码研读
QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...
- Tessaract 源码分析(转)
源码分析 Page Layout 分析步骤 二值化算法: OTSU调用栈:main[api/tesseractmain.cpp] -> TessBaseAPI::ProcessPages[api ...
- checklistboxx 多选取值 和选中
for (int i = 0; i < cklist.Items.Count; i++) { if (cklist.GetItemChecked(i)) { //修改子菜单的父节点为此菜单的id ...
- Nginx GZIP 压缩
[ HTTP 开启gzip ] gzip on; // 开启 nginx在线实时压缩数据流: gzip_min_length 1k; // 允许压缩的页面最小字节 gzip_buffers 32k; ...