【模板】cdq分治代替树状数组(单点修改,区间查询)
2024-08-25 16:12:45
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int N = (int)1e6 + 5;
int n, m;
struct Q{
int type, id;
long long val;
friend bool operator < (Q x, Q y){
return x.id == y.id ? x.type < y.type : x.id < y.id;
}
}q[N], tmp[N];
int qsize;
long long ans[N];
int asize;
void cdq(int l, int r){//左闭右开
if(r - l <= 1) return ;//长度为1的区间内部就不会有贡献了
int mid = l + ((r - l) >> 1);
cdq(l, mid); cdq(mid, r);
long long sum = 0;
int i = l, j = mid, tsize = 0;
//合并并计算左区间对右区间贡献
while(i < mid && j < r){
if(q[i] < q[j]){
if(q[i].type == 1) sum += q[i].val;
tmp[++tsize] = q[i++];
}
else {
if(q[j].type == 2) ans[q[j].val] -= sum;
else if(q[j].type == 3) ans[q[j].val] += sum;
tmp[++tsize] = q[j++];
}
}
while(i < mid) tmp[++tsize] = q[i++];
while(j < r){
if(q[j].type == 2) ans[q[j].val] -= sum;
else if(q[j].type == 3) ans[q[j].val] += sum;
tmp[++tsize] = q[j++];
}
for(int i = 1; i <= tsize; ++i) q[l + i - 1] = tmp[i];
}
/*
这部分的思路总结
判断是否到边界
下方左右分治
计算左边对右边的贡献
把左右类似归并排序重排
*/
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
++qsize;
q[qsize].id = i, q[qsize].type = 1;
scanf("%lld", &q[qsize].val);
}
for(int i = 1; i <= m; ++i){
scanf("%d", &q[++qsize].type);
if(q[qsize].type == 1){
scanf("%d%lld", &q[qsize].id, &q[qsize].val);
}
else {
int l, r; scanf("%d%d", &l, &r);
++asize;
q[qsize].id = l - 1, q[qsize].val = asize;
q[++qsize].id = r, q[qsize].type = 3, q[qsize].val = asize;
}
}
cdq(1, qsize + 1);
for(int i = 1; i <= asize; ++i) printf("%lld\n", ans[i]);
return 0;
}
最新文章
- 查看当前正在运行的activity
- EMC Documentum DQL整理(一)
- HDU4930 Fighting the Landlords 模拟
- 【笔记】DOM探索基础篇(二)
- 由DataGridTextColumn不能获取到父级DataContext引发的思考
- dojo使用疑难杂症集锦
- JDBC数据更新
- 个人分享:平时开发中感觉几款不错 IDE 、插件、工具
- 【转】java jawin api 中文 invoke方法
- 为 Devops 和系统管理员提供的 400+ 免费资源
- 64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误
- python打印表格式数据,留出正确的空格和段落星号或注释
- python+requests+unittest API接口测试
- 从Javascript单线程谈Event Loop
- Codeforces Beta Round #1 A,B,C
- 多Region下HBase写入问题
- Java 读书笔记 (十五) Java 异常处理
- Parameter &#39;ids&#39; not found. Available parameters are [array]
- Jquery.Datatable 控件后端分页实例 (后台使用ashx、aspx-webmethod)
- Ubuntu安装Sqlite报错:No module named &#39;ConfigParser&#39;
热门文章
- jQuery中.html(“xxx”)和.append(";xxx";)有什么区别
- java 工具
- css 别人找的css特效
- js获取数组中相同元素数量
- vue-cli3.0之vue.config.js的配置项(注解)
- redis 的简单命令
- python爬虫之win7Mongod安装使用
- mysql数据库修改数据表引擎的方法
- 【转】MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)
- django_filter,Search_Filter,Order_Filter,分页