luoguP3374 【模板】树状数组 1 cdq
链接
思路
可耐我连cdq都不会,Orz 陈丹琦
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 7;
int read() {
int x = 0, f = 1; char s = getchar();
for (;s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
for (;s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int ans[N];
struct node {
int type, id, val;
node(int a = 0,int b = 0, int c = 0) {
type = a, id = b, val = c;
}
bool operator < (const node &b) const {
return id == b.id ? type < b.type : id < b.id;
}
} Q[N<<2], tmp[N<<2];
void cdq(int l, int r){
if (l == r) return;
int mid = (l + r) >> 1;
cdq(l, mid), cdq(mid + 1, r);
int p = l, q = mid + 1, js = l, sum = 0;
while (p <= mid && q <= r) {
if (Q[p] < Q[q]) {
if (Q[p].type == 1) sum += Q[p].val;
tmp[js++] = Q[p++];
} else {
if (Q[q].type == 2) ans[Q[q].val] -= sum;
if (Q[q].type == 3) ans[Q[q].val] += sum;
tmp[js++] = Q[q++];
}
}
while (p <= mid) tmp[js++] = Q[p++];
while (q <= r) {
if (Q[q].type == 2) ans[Q[q].val] -= sum;
if (Q[q].type == 3) ans[Q[q].val] += sum;
tmp[js++] = Q[q++];
}
for (int i = l; i <= r; ++i) Q[i] = tmp[i];
}
int main() {
int n = read(), m = read(), js = 0, DSR = 0;
for (int i = 1; i <= n; ++i) {
int x = read();
Q[++js] = node(1, i, x);
}
for(int i = 1; i <= m; ++i) {
int opt = read(), x = read(), y = read();
if (opt == 1) {
Q[++js] = node(1, x, y);
} else {
Q[++js] = node(2, x-1, ++DSR),
Q[++js] = node(3, y, DSR);
}
}
cdq(1, js);
for (int i = 1; i <= DSR; ++i) printf("%d\n", ans[i]);
return 0;
}
luoguP3374 【模板】树状数组 1 cdq的更多相关文章
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- [模板] 树状数组 (C++ class)
闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- 【洛谷 p3374】模板-树状数组 1(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- LUGOU P3374 【模板】树状数组 1(CDQ 分治)
传送门 拿个二维偏序练练cdq板子,其实就和归并排序差不多,复杂度不太会,似乎nlogn?. #include<iostream> #include<cstdio> #incl ...
- P3374 【模板】树状数组 1(cdq)
P3374 [模板]树状数组 1 cdq分治 刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃 cdq好像只能离线的样子 cdq分治(转) 以下是摘录的几句: 在合并的时 ...
随机推荐
- How to signout from an Azure Application?(转载)
问: I have created a Azure AD application and a Web App. The Azure AD Application uses AAD Authentica ...
- axios捕获401 赋值token
//捕获401 // http request 拦截器 axios.interceptors.request.use( config => { const token = localStorag ...
- MVC伪静态路由简单搭配
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute ...
- vue中的插槽
匿名插槽 // comp1 <div> <slot></slot> </div> // parent <comp>hello</com ...
- vue.js 如何加载本地json文件
在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...
- linux mysql连接
1. 添加头文件 # apt-get install libmysqlclient-dev 引入头文件 #include <mysql/mysql.h> 2. 举例 MYSQL *mysq ...
- 自制微擎AI面相识别算术阈值
有时在朋友圈或其他地方会看到一些AI面相的分享链接或小程序,不是面相算命的有多吸引人,而是前面有"AI"两个字母.于是我就上网找了一下相关代码,发现了一个微擎系统的面相模块.下载下 ...
- can解析
- 初探PHP设计模式
设计模式不是一套具体的语言框架,是行之有效的编码规范,是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.合理 ...
- java String字符串编码类型转换
/** * 前后端数据乱码问题 * 解决办法1: * 乱码原因:一编一解码型不一致导致. * [main description] * @param {[type]} String[] args [d ...