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 ...
 
随机推荐
- JUC(八)ThreadLocal
			
ThreadLocal 简介 ThreadLocal提供局部线程变量,这个变量与普通的变量不同,每个线程在访问ThreadLocal实例的时候,(通过get或者set方法)都有自己的.独立初始化变量副 ...
 - C语言中,取反运算符~a=-(a+1)的原因
			
1.因为计算机直接拿读取到的数据去运算付出的代价是最小的,所以计算机存储的数据的形式应该满足读取后不必经过任何加工就能直接用来运算由于原码不经加工无法实现(+a)+(-a)=0,所以不满足该要求,为了 ...
 - Qt 加载 libjpeg 库出现“长跳转已经运行”错误
			
继上篇 Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误 篇幅有点长,先说解决方法,在编译静态库时加上 -qt-libjpeg,编译出 libjpeg 库后,在项目中使用 #pragma c ...
 - Linux下ftp常见问题总结
			
Linux下ftp常见问题总结 似乎拖欠了几篇文章了@_@,来公司半年了,成长了不少!从大学毕业,直到看到http://blog.csdn.net/leixiaohua1020 雷霄骅(然而天妒英才 ...
 - class类 和 react类组件
			
类的理解 1 // 创建一个person类 2 class Person { 3 /* */ 4 // 构造器方法 5 constructor(name, age) { 6 // this指向 =& ...
 - 「学习笔记」2-SAT问题
			
SAT 是适定性 (Satisfiability) 问题的简称.一般形式为 k - 适定性问题,简称 k-SAT.而当 \(k>2\) 时该问题为 NP 完全的.所以我们只研究 \(k=2\) ...
 - 2022-12-31:以下go语言代码输出什么?A:1 1;B:-1 1;C:-1 -1;D:编译错误。 package main import “fmt“ func main() { a
			
2022-12-31:以下go语言代码输出什么?A:1 1:B:-1 1:C:-1 -1:D:编译错误. package main import "fmt" func main() ...
 - 2022-07-22:以下go语言代码输出什么?A:1;B:1.5;C:编译错误;D:1.49。 package main import “fmt“ func main() { var i
			
2022-07-22:以下go语言代码输出什么?A:1:B:1.5:C:编译错误:D:1.49. package main import "fmt" func main() { v ...
 - ABP - 初识 ABP
			
ABP框架 ABP是用于创建现代化Web应用程序的完整体系结构和强大的基础架构,以模块化的方式进行开发,所有模块以nuget包的方式提供,开箱即用,遵循最佳实践和约定,提供SOLID开发经验. 缩写 ...
 - vb.net 数据库连接字符串
			
'设置数据库连接字符串 Dim connString As String = "Data Source=.\SQLEXPRESS;Initial Catalog=YourDatabaseNa ...