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 ...
随机推荐
- Javaweb学习笔记——(五)——————DOM&XML目录
1.表单提交方式 *使用submit提交 <form> <input type="submit" /> </form> *使用button提交表 ...
- C# 部分类使用partial修饰
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pati ...
- Netty入门(2) - 核心概念
Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...
- tf.matmul()和tf.multipy()的区别
首先我们分析一下下面的代码: import tensorflow as tf import numpy as np a=tf.constant([[1., 2., 3.],[4., 5., 6.]]) ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- <转载>iTerm2使用技巧
原文链接:http://www.cnblogs.com/756623607-zhang/p/7071281.html 1.设置窗口 定位到 [Preferences - Profiles - Wi ...
- HTML5的学习(三)HTML5标签
3.HTML5新添加的标签 标签 描述 <article> 定义文章. <aside> 定义页面内容之外的内容. <audio> 定义声音内容. <bdi&g ...
- 【SVN】svn使用方法
下载安装TortoiseSVN 下载地方 安装成功后 TortoiseSVN清除凭证 右击空白处-TortoiseSVN-Settings打开Settings窗口后做如下操作: svn在idea中的使 ...
- semantic segmentation 和instance segmentation
作者:周博磊链接:https://www.zhihu.com/question/51704852/answer/127120264来源:知乎著作权归作者所有,转载请联系作者获得授权. 图1. 这张图清 ...
- Maven入门-安装及配置(一)
0.Maven简介 三种仓库: