BZOJ-10-1176: [Balkan2007]Mokia-CDQ第二类应用
思路 :按照操作的时间进行分治,这样转化成了 时间t ,x坐标,y坐标 经典的三维偏序。
最初时间就是递增顺序,无需排序直接进行第二维的分治,类似归并排序处理x坐标,在保证
x有序的情况下进行更新y坐标的树状数组。求一个 (x1,y1) - (x2,y2)矩形内点的个数,简单容斥一下
求[ (1,1) ——(x1-1,y1-1) ]+[ (1,1) ——(x2,y2) ]-[ (1,1) ——(x1-1,y1) ]-[ (1,1) ——(x1,y1-1) ]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 2234567
ll op,w,s,x[3],y[3];
ll cnt,q[maxn],tot;
ll ans[maxn],tree[maxn];
struct node
{
int x,y,id,ad;
} data[maxn],cp[maxn];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int d)
{
while(x<=w)
{
tree[x]+=d;
x+=lowbit(x);
}
}
ll query(int x)
{
ll re=0;
while(x>0)
{
re+=tree[x];
x-=lowbit(x);
}
return re;
}
void cdq(int l,int r)
{
if(l>=r)return ;
int mid=(l+r)/2;
cdq(l,mid);
cdq(mid+1,r);
int t1=l,t2=mid+1,ct=l;
while(t2<=r)
{
while(data[t1].x<=data[t2].x&&t1<=mid)
{
if(data[t1].id==0)
add(data[t1].y,data[t1].ad);
cp[ct++]=data[t1++];
}
if(data[t2].id!=0)ans[data[t2].ad]+=query(data[t2].y);
cp[ct++]=data[t2++];
}
for(int i=l; i<t1; i++)
if(data[i].id==0)
add(data[i].y,-data[i].ad);
while(t1<=mid)cp[ct++]=data[t1++];
while(t2<=r)cp[ct++]=data[t2++];
for(int i=l; i<=r; i++)
data[i]=cp[i];
}
int main()
{
scanf("%lld%lld",&s,&w);
while(1)
{
scanf("%lld",&op);
if(op==1)
{
data[++cnt].id=0;
scanf("%lld%lld%lld",&data[cnt].x,&data[cnt].y,&data[cnt].ad);
}
else if(op==2)
{
scanf("%lld%lld%lld%lld",&x[1],&y[1],&x[2],&y[2]);
q[++tot]=cnt+1;
ans[cnt+4]+=(y[2]-y[1]+1)*(x[2]-x[1]+1)*s;
data[++cnt].x=x[1]-1,data[cnt].y=y[1]-1,data[cnt].id=2,data[cnt].ad=cnt;
data[++cnt].x=x[1]-1,data[cnt].y=y[2],data[cnt].id=2,data[cnt].ad=cnt;
data[++cnt].x=x[2],data[cnt].y=y[1]-1,data[cnt].id=2,data[cnt].ad=cnt;
data[++cnt].x=x[2],data[cnt].y=y[2],data[cnt].id=3,data[cnt].ad=cnt;
}
else break;
}
cdq(1,cnt);
for(int i=1; i<=tot; i++)
printf("%lld\n",ans[q[i]+3]-ans[q[i]+1]-ans[q[i]+2]+ans[q[i]]);
return 0;
}
BZOJ-10-1176: [Balkan2007]Mokia-CDQ第二类应用的更多相关文章
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
		考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ... 
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
		1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ... 
- 【BZOJ】1176: [Balkan2007]Mokia(cdq分治)
		http://www.lydsy.com/JudgeOnline/problem.php?id=1176 在写这题的时候思维非常逗啊........2333................... 最后 ... 
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
		[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ... 
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
		题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ... 
- 【BZOJ】1176: [Balkan2007]Mokia
		[题意]n*n的矩阵,初始值为0(题面有误),m次操作,增加一个格子的权值,或查询子矩阵和.n<=2*10^6.(m应该较题面所述偏大). [算法]CDQ分治(算法知识见数据结构) [题解]三维 ... 
- BZOJ 1176: [Balkan2007]Mokia
		1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2012 Solved: 896[Submit][St ... 
- 1176: [Balkan2007]Mokia
		1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ... 
- [BZOJ1176][Balkan2007]Mokia  cdq+树状数组
		1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1395[Submit][S ... 
- bzoj 4555 [Tjoi2016&Heoi2016]求和——NTT+第二类斯特林数
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 第二类斯特林数展开式: \( S(i,j) = \frac{1}{j!} \sum\l ... 
随机推荐
- Python--Linux上安装Python
			Linux 上安装 Python 官网下载:https://www.python.org/downloads/ 本文安装包下载链接:https://pan.baidu.com/s/1uL2JyoY_g ... 
- WinForm文件说明
			以上位置,双击即可. 界面可以通过拖动控件,也可以通过背后的界面代码去布局. 如果删除了事件代码,界面可能报错,因为界面代码中有未删除的残余(波浪线提示处代码,直接删除即可). 对于多个窗体,Prog ... 
- 记一次504 Gateway Time-out
			使用curl请求是超时,查了下资料原来是端口被占用,造成了死锁,记录下 首先要知道为什么会出现死锁? 在我们访问页面的时候这个端口进程就已经被使用,当我们再在页面中curl请求其他页面因为没有其他的端 ... 
- ACM-ICPC 2018 沈阳赛区网络预赛 K  Supreme Number(规律)
			https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ... 
- 关于缓存和 Chrome 的“新版刷新”
			在读本文前你要确保读过我的上篇文章<扼杀 304,Cache-Control: immutable>,因为本文是接着上文写的.上文说到,在现代 Web 上,“条件请求/304 响应”绝大多 ... 
- express + restful
			express http://www.expressjs.com.cn/ Express 是一个基于 Node.js 平台的极简.灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 ... 
- python下调用pytesseract识别某网站验证码
			一.pytesseract介绍 1.pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Pyt ... 
- windows 7中的windows键相关的快捷键
			引用 https://support.microsoft.com/zh-cn/help/976857 Windows 键的位置 如果不清楚 Windows 键的位置,请参照下图: 常用的 Window ... 
- String.intern() 方法__jdk1.6与jdk1.7/jdk1.8的不同
			1.为什么要使用intern()方法 intern方法设计的初衷是为了重用string对象,节省内存 用代码实例验证下 public class StringInternTest { static f ... 
- XL4001 典型应用电路
			典型的应用电路如下: 中文数据手册:https://wenku.baidu.com/view/98ad2ed86f1aff00bed51ec7.html 在做毕设的时候用到的一款350ma的DC/DC ... 
