1176: [Balkan2007]Mokia

Time Limit: 30 Sec   Memory Limit: 162 MB
Submit: 185   Solved: 94
[ Submit][ Status]

Description

维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值。 修改操作数M<=160000,询问数Q<=10000,W<=2000000。

Input

Output

Sample Input

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

Sample Output

3
5

HINT

Input file Output file Meaning
0 4 Table size is , filled with zeroes.

1 2 3 3 Add 3 customers at (2, 3).
2 1 1 3 3 Query sum of rectangle , .

3 Answer.
1 2 2 2 Add 2 customers at (2, 2).
2 2 2 3 4 Query sum of rectangle , .

5 Answer
3 Exit your program.

裸CDQ...1A

注意几个关键部分的写法

步骤:

1.读入询问,按x排序

2.将[L,R]中的数分为前部分操作,后部分操作(各部分仍保持X升序)

3.将前面对后面的影响记录ans

4.复原影响

5.递归[L,M],[M+1,R]

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define F (1000000009)
#define MAXM (640000+10)
#define MAXQ (10000+10)
#define MAXN (2000000+10)
typedef long long ll;
int n,m,q;
ll ans[MAXQ];
struct comm
{int no,x,y,v,q,type;comm():no(0),x(0),y(0),v(0),q(0),type(0){}comm(int _no,int _x,int _y,int _v,int _q,int _type):no(_no),x(_x),y(_y),v(_v),q(_q),type(_type){}friend bool operator<(comm a,comm b){return a.x<b.x;}
}ask[MAXM];
struct arr_tree
{ll a[MAXN];arr_tree(){memset(a,0,sizeof(a));}void add(int x,ll c){for(int i=x;i<=n;i+=i&(-i)) a[i]+=c;}int qur(int x){ll ans=0;for(int i=x;i;i-=i&(-i)) ans+=a[i];return ans;   }void clear(){memset(a,0,sizeof(a));}
}T;
comm tmp[MAXM];
void solve(int l,int r)
{if (l==r) return;int m=l+r>>1;int s1=l-1,s2=m;Fork(i,l,r) tmp[ask[i].no<=m?++s1:++s2]= ask[i];memcpy(ask+l,tmp+l,sizeof(comm)*(r-l+1));int now=l;Fork(i,m+1,r) //遍历询问 {if (ask[i].type==2){while (ask[now].x<=ask[i].x&&now<=m){if (ask[now].type==1) T.add(ask[now].y,ask[now].v);now++;}ans[ask[i].q]+=ask[i].v*T.qur(ask[i].y);         }}now--;while (l<=now) {if (ask[now].type==1) T.add(ask[now].y,-ask[now].v);now--;}solve(l,m),solve(m+1,r);
}
bool work()
{scanf("%d",&n);int type,no=0,x,y,x1,y1,x2,y2,v,q=0;memset(ans,0,sizeof(ans));T.clear();while (scanf("%d",&type)){if (type==0||type==3) break;else if (type==1){scanf("%d%d%d",&x,&y,&v);no++;ask[no]=comm(no,x,y,v,0,1);}else if (type==2){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);q++;no++;ask[no]=comm(no,x1-1,y1-1,1,q,2);no++;ask[no]=comm(no,x2,y2,1,q,2);no++;ask[no]=comm(no,x1-1,y2,-1,q,2);no++;ask[no]=comm(no,x2,y1-1,-1,q,2);         }}sort(ask+1,ask+1+no);solve(1,no);For(i,q) cout<<ans[i]<<endl;return type==0;
}
int main()
{//freopen("bzoj1176.in","r",stdin);int type;scanf("%d",&type);if (type==3) return 0;while (work());//cout<<"END"<<endl;while (1);return 0;
}

转载于:https://www.cnblogs.com/dyllove98/p/3186980.html

BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)相关推荐

  1. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  2. BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)

    BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和) Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值. ...

  3. BZOJ 1176: [Balkan2007]Mokia

    一道CDQ分治的模板题,然而我De了一上午Bug...... 按时间分成左右两半,按x坐标排序然后把y坐标丢到树状数组里,扫一遍遇到左边的就add,遇到右边的query 几个弱智出了bug的点, 一是 ...

  4. cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)

    CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...

  5. bzoj1176: [Balkan2007]Mokia cdq

    链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /**************************************************************Pr ...

  6. bzoj 1176 Mokia (cdq分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 3874  Solved: 1742 [Submit] ...

  7. [bzoj] 1176 Mokia || CDQ分治

    原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...

  8. BZOJ 2961 共点圆 CDQ分治+凸包

    题目大意:给定平面,多次插入点和圆,每次插入点时询问当前插入的点是否在之前插入的所有圆中并且至少在一个圆中 直接用数据结构维护这些点和圆不是很好写,我们考虑CDQ分治 对于每层分治,我们需要对于[mi ...

  9. Bzoj 2683: 简单题(CDQ分治)

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

最新文章

  1. html5通html5通,HTML5 history详解
  2. python百度百科api-Python即时网络爬虫:API说明
  3. php-数据分析 余弦相似度实现
  4. excel 某个单元格不是等于空值_这些稀奇古怪的符号,却是Excel高手们常玩的!...
  5. [渝粤教育] 山东第一医科大学 健康教育与健康促进 参考 资料
  6. 没事做贴个代码,判断是否素数,顺便打个素数表(非原创)。
  7. 进阶~Qt程序启动画面
  8. P1379 八数码难题
  9. 7z解压crc错误_7-Zip - 常见问题解答(FAQ)
  10. 学习编程需要什么英语基础?
  11. Python学习笔记(三)(图灵学院)
  12. android 连接usb扫码枪
  13. 筛选两张表中id不同的数据
  14. Mybatis-Plus实现乐观锁配置
  15. 状态栏和导航栏重叠,解决办法
  16. Get UWP Version(不使用额外的nuget包或SDK)
  17. 主要的数据交换格式XML与JASON
  18. 王献旗:孪生开发是数字化转型的必经之路
  19. Android Accessibility(辅助功能) 学习
  20. php获取远程网页地址吗,php怎么获取远程网站上的图片的地址?有什么思路吗?...

热门文章

  1. 网站制作基本要素了解一下
  2. 网站单页面排名提升的技巧有哪些?
  3. java uuid会重复吗_记一次订单号重复的事故,快看看你的 uuid 在并发下还正确吗?...
  4. mac cad石材填充图案_CAD超级填充教程
  5. android横竖屏切换不刷新,关于Android中使用BottomNavigationView切换横屏导致返回主页的问题...
  6. c 在realse下为什么生成不了exe_exe文件?你也可以编写!
  7. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...
  8. splunk 索引过程
  9. mysql 查询 插入
  10. java switch 应用