题目描述

你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

命令

参数限制

内容

1 x y A

1<=x,y<=N,A是正整数

将格子x,y里的数字加上A

2 x1 y1 x2 y2

1<=x1<= x2<=N

1<=y1<= y2<=N

输出x1 y1 x2 y2这个矩形内的数字和

3

终止程序


输入格式

输入文件第一行一个正整数N。
接下来每行一个操作。
 

输出格式

对于每个2操作,输出一个对应的答案。
 

样例输入

4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

样例输出

3
5

提示

1<=N<=500000,操作数不超过200000个,内存限制20M。
对于100%的数据,操作1中的A不超过2000。
 
思路分析 :
  CDQ分治真有意思!
  这个题目我们只需要将所给的条件变换一下,不就变成了一道裸的题目啦,题目所给的是在一个二维的空间中,我们可以加一维时间在上边,变成一个三维偏序。
代码示例 : (未测试)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 6e5+5; int n;
int k = 1;
struct node
{
int x, y, z, num, sum;
node(int _x=0, int _y=0, int _z=0, int _num=0, int _sum=0):x(_x),y(_y),z(_z),num(_num),sum(_sum){} bool operator< (const node &v)const{
if (x != v.x) return x < v.x;
if (y != v.y) return y < v.y;
return z < v.z;
}
}arr[maxn], f[maxn];
int c[maxn];
int lowbit(int x){return x&(-x);}
void add(int p, int num){
for(int i = p; i <= n; i += lowbit(i)) c[i] += num;
}
int query(int x){
int res = 0;
for(int i = x; i ; i -= lowbit(i)){
res += c[i];
}
return res;
}
void CDQ(int l, int r){
if (l == r) return;
int mid = (l+r)>>1;
CDQ(l, mid);
CDQ(mid+1, r);
int p1 = l, p2 = mid+1;
int num = 0;
for(int i = l; i <= r; i++){
if (p1<=mid && (p2 > r || arr[p1].y <= arr[p2].y)){
add(arr[p1].z, arr[p1].num);
f[num++] = arr[p1++];
}
else {
int num2 = query(arr[p2].z);
arr[p2].sum += num2;
f[num++] = arr[p2++];
}
}
num = 0;
for(int i = l; i <= r; i++){
if (i <= mid) add(arr[i].z, -arr[i].num);
arr[i] = f[num++];
}
} vector<int>ve;
int main () {
int pt;
int x1, y1, x2, y2, num;
int time = 1;
cin >> n; while(1){
scanf("%d", &pt);
if (pt == 3) break;
else if (pt == 1) {
scanf("%d%d%d", &x1, &y1, &num);
x1++, y1++;
arr[k++] = node(time++, x1, y1, num, num);
}
else {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
x1++, y1++, x2++, y2++;
ve.push_back(k);
arr[k++] = node(time, x1-1, y1-1, 0, 0);
arr[k++] = node(time, x1-1, y2, 0, 0);
arr[k++] = node(time, x2, y1-1, 0, 0);
arr[k++] = node(time++, x2, y2, 0, 0);
}
}
CDQ(1, k-1);sort(arr+1, arr+k); for(int i = 0; i < ve.size(); i++){
int x = ve[i];
int ans = arr[x+3].sum+arr[x].sum-arr[x+1].sum-arr[x+2].sum;
printf("%d\n", ans);
}
return 0;
}
/*
10
2 1 1 3 3
1 1 1 1
1 2 1 2
1 3 3 1
1 4 4 4
2 1 1 3 3
2 1 1 4 4
3
*/
 

bzoj 2683 CDQ分治的更多相关文章

  1. bzoj 1176 CDQ分治

    思路:首先我们将问题转换一下,变成问在某个点左下角的权值和,那么每一个询问可以拆成4的这样的询问,然后 进行CDQ 分治,回溯的时候按x轴排序,然后用树状数组维护y的值. #include<bi ...

  2. BZOJ 1537 cdq分治

    思路: 我只是想写一下cdq-- 二维偏序 一维排序 一维cdq分治 (我忘了归并排序怎么写了,,,) 写了个sort- 复杂度是O(nlog^2n) //By SiriusRen #include ...

  3. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  4. bzoj 1176 cdq分治套树状数组

    题面: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Inp ...

  5. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

  6. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  7. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  8. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  9. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

随机推荐

  1. [转]ECMAScript 2016,2017 和 2018 中所有新功能的示例

    很难追踪 JavaScript(ECMAScript)中的新功能. 想找到有用的代码示例更加困难. 因此,在本文中,我将介绍 TC39 已完成 ES2016,ES2017 和 ES2018(最终草案) ...

  2. spring security BCryptPasswordEncoder加密解密,不错的随机盐,不错的加密解密方法

    项目中用这个加密感觉不错啊,推荐: 1.先大体看看,了解一下 浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(match ...

  3. CSS 个性化滚动条样式

    页面中有许多内容过多时,为了不影响整体布局,总会有滚动效果代替.but,许多情况浏览器自带的滚动条样式与整体UI 界面不搭啊,怎么办,当然作为界面的化妆师CSS就出手啦~ 滚动条样式由多个伪类组成 下 ...

  4. tomcat最大线程数的设置

    Tomcat的server.xml中连接器设置如下 <Connector port="8080" maxThreads="150" minSpareThr ...

  5. 关于移动端弹层下的body滚动

    关于移动端弹层下的body滚动 这个问题在移动端挺常见的,网上也有一些解决方法,现在笔者来总结一下:css的解决方案都有兼容问题,js是比较稳定的解决方法(虽然比较麻烦) ps: 本文的例子都是用vu ...

  6. 基于AutoIt3的Ping、网址转IP地址,以及hosts文件写入

    #include <Constants.au3> #include <GUIConstantsEx.au3> GUICreate("通讯测试-eip.hxgroup. ...

  7. 一眼看懂promise async的区别

    // promise方法 let p1 = new Promise((resolve,reject) => { setTimeout(() => { resolve('我是p1') },4 ...

  8. java框架篇---Struts2 本地化/国际化(i18n)(转)

    源地址:https://www.cnblogs.com/oumyye/p/4368453.html 国际化(i18n)是规划和实施的产品和服务,使他们能很容易地适应特定的本地语言和文化的过程中,这个过 ...

  9. centos7靶机获取不到ip

    尝试了好多方法都获取不到靶机ip: 1.首先检查网络链接是否正常 2.重启网卡  /etc/init.d/network restart 3.修改网卡ONBOOT=yes vi /etc/syscon ...

  10. [Python之路] 内存管理&垃圾回收

    一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...