P3755 [CQOI2017]老C的任务题解
如果询问 \(x_1, y_1, x_2, y_2\),
那么询问
\((x_2, y_2)\),
\((x_2, y_1 - 1)\),
\((x_1 - 1, y_2)\)
\((x_1 - 1, y_1 - 1\)),
这些点到原点(不一定是 \((0, 0)\),有可能有负数)的和。
设其结果分别为 \(a, b, c, d\),那么最后结果为 \(a - b - c + d\)(二维前缀和原理)。
问题成功转化。
设结构体
struct Node {
int x, y; // 位置
int z; // 值
};
为基本信息。
我们在此基础上加一个 \(type\) 和 \(res\),
如果 \(type\) 为 \(1\) 就表示要询问 \((x, y)\) 的二维前缀和,结果保存在 \(res\) 中。
如果 \(type\) 为 \(0\) 表示 \((x, y)\) 为一个基站,其功率为 \(z\)。
对于 \(type_i\) 为 \(1\) 的部分,
使用CDQ分治统计:
\(type_j < type_i\) (即 \(type_j\) 为 \(0\))
\(x_j \leq x_i\)
\(y_j \leq y_i\)
的各个位置的和即可。
注意开long long。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define int long long
using namespace std;
const int N = 500010;
struct Node {
int x, y, z;
int type;
int res;
}a[N], tmp[N];
bool cmp(const Node a, const Node b) {
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
return a.type < b.type;
}
int n, m;
void cdq(int l, int r) {
if (l == r) return;
int mid = (l + r) / 2;
cdq(l, mid);
cdq(mid + 1, r);
int sum = 0;
int p = l, q = mid + 1, tot = l;
while (p <= mid && q <= r) {
if (a[p].y <= a[q].y) {
if (!a[p].type) sum += a[p].z;
tmp[tot++] = a[p++];
}
else {
if (a[q].type) a[q].res += sum;
tmp[tot++] = a[q++];
}
}
while (p <= mid) {
if (!a[p].type) sum += a[p].z;
tmp[tot++] = a[p++];
}
while (q <= r) {
if (a[q].type) a[q].res += sum;
tmp[tot++] = a[q++];
}
for (int i = l; i <= r; i++) a[i] = tmp[i];
}
struct Query {
int x1, y1;
int x2, y2;
}query[N];
unordered_map<int, unordered_map<int, int> > res_a;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y >> a[i].z;
a[i].type = 0;
a[i].res = 0;
}
int tot = n;
for (int i = 1; i <= m; i++) {
cin >> query[i].x1 >> query[i].y1 >> query[i].x2 >> query[i].y2;
a[++tot] = {query[i].x1 - 1, query[i].y1 - 1, 0, 1, 0};
a[++tot] = {query[i].x2, query[i].y2, 0, 1, 0};
a[++tot] = {query[i].x2, query[i].y1 - 1, 0, 1, 0};
a[++tot] = {query[i].x1 - 1, query[i].y2, 0, 1, 0};
}
sort(a + 1, a + tot + 1, cmp);
cdq(1, tot);
for (int i = 1; i <= tot; i++) {
if (a[i].type) {
res_a[a[i].x][a[i].y] = a[i].res;
}
}
for (int i = 1; i <= m; i++) {
int x1 = query[i].x1, y1 = query[i].y1;
int x2 = query[i].x2, y2 = query[i].y2;
int ans = res_a[x2][y2] - res_a[x2][y1 - 1] - res_a[x1 - 1][y2] + res_a[x1 - 1][y1 - 1];
cout << ans << '\n';
}
return 0;
}
P3755 [CQOI2017]老C的任务题解的更多相关文章
- P3755 [CQOI2017]老C的任务
传送门 可以离线,把询问拆成四个,然后把所有的按\(x\)坐标排序,这样就只要考虑\(y\)坐标了.然后把\(y\)坐标离散化,用树状数组统计即可 记得开longlong //minamoto #in ...
- [CQOI2017]老C的键盘
[CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...
- 【BZOJ4822】[CQOI2017]老C的任务(扫描线)
[BZOJ4822][CQOI2017]老C的任务(扫描线) 题面 BZOJ 洛谷 题解 没有修改操作,都不需要分治了... 直接排序之后扫描线算贡献就好了... 不知道为啥洛谷上过不了... #in ...
- bzoj4823: [Cqoi2017]老C的方块(最小割)
4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强 黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...
- 【BZOJ4823】[CQOI2017]老C的方块(网络流)
[BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
- bzoj 4822: [Cqoi2017]老C的任务
4822: [Cqoi2017]老C的任务 练手速... #include <iostream> #include <cstdio> #include <cstring& ...
- bzoj 4823: [Cqoi2017]老C的方块 [最小割]
4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...
- [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 218 Solved: 171[Submit][Statu ...
- [BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)
4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 379 Solved: 203[Submit][Statu ...
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 193 Solved: 149[Submit][Statu ...
随机推荐
- React Native组件(二)
一.创建一个项目 1.1.找到目标目录cmd命令,请尽量不要有中文路径 npx react-native init reactnative03 进入文件 cd reactnative03 启动 npx ...
- React onBlur回调中使用document.activeElement返回body解决方案
最开始想实现一个功能,点击img图标后给出购物下拉框CartDropdown,当img及CartDropdown失去焦点时隐藏CartDropdown. 最开始的核心代码如下: export defa ...
- Node + Express 后台开发 —— 起步
Node + Express 后台开发 -- 起步 前面陆续学习了一下 node.npm.模块,也稍尝试 Express,感觉得换一个思路加快进行. 比如笔者对前端的开发已较熟悉,如果领导给一个内部小 ...
- Java 新的生态型应用开发框架,Solon v2.2.13 发布
Java 新的生态型应用开发框架,Solon :更快.更小.更简单.从零开始构建,有自己的标准规范与开放生态: 150多个生态插件,可以满足各种场景开发 大量的国产框架适配,可以为应用软件国产化提供更 ...
- 从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC
作者:京东科技 康志兴 Shenandoah Shenandoah一词来自于印第安语,十九世纪四十年代有一首著名的航海歌曲在水手中广为流传,讲述一位年轻富商爱上印第安酋长Shenandoah的女儿的故 ...
- VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者
大家好,我是DOM哥. 我用 ChatGPT 开发了一个 Vue 的资源导航网站. 不管你是资深 Vue 用户,还是刚入门想学习 Vue 的小白,这个网站都能帮助到你. 网站地址:https://do ...
- 粘包/拆包问题一直都存在,只是到TCP就拆不动了。
OSI open-system-Interconnection TCP/IP 5层协议栈 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api TCP/UDP 概况 TCP粘包问 ...
- 项目打包后配置到node服务器
1.将项目进行打包 npm run build项目根目录下会多出一个打包好的由.js .html .css文件组成的dist文件夹,如图 2.搭建node微型服务器 新建文件夹命名"no ...
- 2022-10-11:一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b。 给你一组整数区间intervals,请找到一个最小的集合 S, 使得
2022-10-11:一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b. 给你一组整数区间intervals,请找到一个最小的集合 S, 使 ...
- Element Cascader 级联选择器去除空叶子节点
此处以后端获取部门级联List为例 以下为数据结构 { data: { children: [ 0:{childre:[ 0:{}, 1:{} ]}, 1:{}, 2:{}, 3:{}, 4:{}, ...