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 ...
随机推荐
- neutron-删除负载均衡器
neutron-删除负载均衡器 在清除垃圾数据的时候,删除负载均衡器,总是有很多依赖.写了一个脚本,连同依赖资源一起删除 #!/bin/bash delete(){ local id id=$1 lo ...
- CentOS配置history记录每个用户执行过的命令
一个偶然的机会,看到了这个文档,先存下来,后续使用的话直接就加进去了 要记录登录者的用户名.IP.操作记录,在/etc/bashrc末尾加入几个环境变量,用于history命令显示用户ip等内容,完成 ...
- Oracle 获取前几行数据问题的陷阱
查询用户数据表,需要根据时间正序排序,然后获取时间最早的前三条数据,是不是第一印象想这么写: select * from users where rownum<4 order by datati ...
- MSSQL Server2012备份所有数据库到网络共享盘上面,并自动删除几天前的备份。。
--要备份到哪一服务的IP网络位置,要提前打开文件夹共享.这里还要输入用户名和密码,下面这一行是建立共享 exec master..xp_cmdshell 'net use \\192.168.8.1 ...
- NOI-OJ 2.2 ID:3089 爬楼梯
整体思路 这是一个典型的递归型问题: 临界点:如果只有1级台阶,有1种走法(一次一步):如果有2级台阶,则有2种走法(一次一步或一次两步) 递归方法,对于n级台阶,如果第一次走1步,还剩n-1级台阶, ...
- logging模块简单使用
日志配置 #!/usr/bin/python2.7 import os import logging def get_logger(path='./', filename='access.log', ...
- angularjs指令中的compile与link函数详解补充
通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. angularjs里的指令非常神奇,允许你 ...
- 函数的if--while流程控制
一.流程控制---if 1.if条件判断 age=18 hight=1.70 sex="female" is_beautiful=True if sex=="female ...
- kettle 数据迁移
最近在公司搞一个项目重构迁移问题,旧项目一直在线上跑,重构的项目则还没上线.重构之后数据库表结构,字段,类型等都有变化,而且重构的数据库由oracl改为mysql.这样就设计到数据迁移问题,别人推荐下 ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string)string转成int64: int64, e ...