【BZOJ 4170】 4170: 极光 (CDQ分治)
4170: 极光
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 121 Solved: 64Description
"若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她。对方表现出兴趣的话,那就慢慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简单的问题,她一定也答不上来。"--《上古之魔书》天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列a[i],远古之魔书上记载到:2个位置的graze值为两者位置差与数值差的和:graze(x,y)=|x-y|+|a[x]-a[y]|。要想破解天罚,就必须支持2种操作(k都是正整数):Modify x k:将第x个数的值修改为k。Query x k:询问有几个i满足graze(x,i)<=k。由于从前的天罚被圣王lmc破解了,所以rhl改进了她的法术,询问不仅要考虑当前数列,还要考虑任意历史版本,即统计任意位置上出现过的任意数值与当前的a[x]的graze值<=k的对数。(某位置多次修改为同样的数值,按多次统计)Input
第1行两个整数n,q。分别表示数列长度和操作数。第2行n个正整数,代表初始数列。第3~q+2行每行一个操作。N<=40000, 修改操作数<=40000, 询问操作数<=10000, Max{a[i]}(含修改)<=80000Output
对于每次询问操作,输出一个非负整数表示答案
Sample Input
3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1Sample Output
2
3
3HINT
Source
【分析】
那个公式是曼哈顿距离的形式,把编号看成x,数值看成y,那就是在二维平面上不断给你一些点,然后问你距离某个点曼哈顿距离小于等于k的有多少个。
曼哈顿距离画出来是一个菱形区域,把它旋转,即(x,y)->(x-y,x+y),就是一个矩形区域,根据容斥分成4段求前缀。
那么加一个时间维就是一个经典的CDQ模型啦,三维偏序嘛~
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 40010
#define Maxm 50010 struct node {int a,b,c,id,f,ans;}t[Maxn*];
int len=;
int ans[Maxm*],w[Maxn*];
char s[];
int n,q; void add(int a,int b,int c,int id,int f)
{
// printf("%d %d %d %d %d\n",a,b,c,id,f);
t[++len].a=a;t[len].b=b;t[len].c=c;t[len].id=id;t[len].f=f;
t[len].ans=;
} bool cmp(node x,node y)
{
if(x.a!=y.a) return x.a<y.a;
return (x.b==y.b)?(x.c<y.c):(x.b<y.b);
}
bool cmp2(int x,int y) {return (t[x].b==t[y].b)?(t[x].c<t[y].c):(t[x].b<t[y].b);} int cc[Maxm*],nw[Maxm*];
void ad(int x,int y) {for(int i=x;i<=q+;i+=i&(-i)) cc[i]+=y;}
int query(int x) {int as=;for(int i=x;i>=;i-=i&(-i)) as+=cc[i];return as;} void ffind(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>;
nw[]=;for(int i=l;i<=r;i++) nw[++nw[]]=i;
sort(nw+,nw++nw[],cmp2);
for(int i=;i<=nw[];i++)
{
if(nw[i]<=mid&&t[nw[i]].id==)
{
ad(t[nw[i]].c,);
}
else if(nw[i]>mid&&t[nw[i]].id!=)
{
t[nw[i]].ans+=query(t[nw[i]].c);
}
}
for(int i=l;i<=r;i++) if(i<=mid&&t[i].id==) ad(t[i].c,-);
ffind(l,mid);ffind(mid+,r);
} int main()
{
scanf("%d%d",&n,&q);
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
w[i]=x;
add(i-x,i+x,,,);
}ans[]=;
for(int i=;i<=q;i++)
{
int x,y;
scanf("%s%d%d",s,&x,&y);
if(s[]=='Q')
{
add(x-w[x]+y,x+w[x]+y,i+,++ans[],);
add(x-w[x]-y-,x+w[x]-y-,i+,ans[],);
add(x-w[x]-y-,x+w[x]+y,i+,ans[],-);
add(x-w[x]+y,x+w[x]-y-,i+,ans[],-);
}
else
{
add(x-y,x+y,i+,,);
w[x]=y;
}
}
sort(t+,t++len,cmp);
ffind(,len);
for(int i=;i<=ans[];i++) ans[i]=;
for(int i=;i<=len;i++) if(t[i].id!=) ans[t[i].id]+=t[i].f*t[i].ans;
// for(int i=1;i<len;i++) printf("%d %d %d %d %d %d\n",t[i].a,t[i].b,t[i].c,t[i].id,t[i].f,t[i].ans);
for(int i=;i<=ans[];i++) printf("%d\n",ans[i]);
return ;
}
认真地开了数组大小很久还是RE,干脆全部乘10了。。。
2017-03-26 16:40:39
【BZOJ 4170】 4170: 极光 (CDQ分治)的更多相关文章
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- bzoj 1176 Mokia(CDQ分治,BIT)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=96974 [题意] 定义查询操作与修改操作:1 x y z 为 ...
- bzoj 3263 陌上花开(cdq分治,BIT)
[题意] 求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目. [思路] cdq分治 借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护. 首先合并三维都是相 ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]
传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- BZOJ 1492 货币兑换 Cash CDQ分治
这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个l ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
随机推荐
- Mock InjectMocks ( @Mock 和 @InjectMocks )区别
之前一直对这两个注解的区别不是很明白. 搜到过一篇博客园的文章举例说明了代码行为的区别.后来在stackoverflow上看到一个问答简单明了的解释了这两个注解在定义上的区别: 在此翻译记录一下: / ...
- 【leetcode 简单】第十八题 爬楼梯
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...
- python常用库之base64
1. 什么是base64 base64是一种将不可见字符转换为可见字符的编码方式. 2. 如何使用 最简单的使用方式 import base64 if __name__ == '__main__': ...
- 爬虫--PySpider框架
PySpider框架 PySpider框架的作用
- UTF8字符串转换为汉字 c#
using System; /// <summary> /// UTF8字符串转换为汉字用的类 /// 转换如"\\u8d35"之类的字符串为对应的汉字 /// < ...
- Go语言 5 函数
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 今天,我们来学习Go语言编程的第五章,函数.首先简单说一下函数的概念和作用.函数是一 ...
- 初窥ThinkPHP
MVC全称(Model View Controller) Model:模型(可以理解位数据库操作模型) View:视图(视图显示) Controller:(控制器) 简单的说框架就是一个类的集合.集合 ...
- AJP与HTTP比较和分析
系统环境: OS:Ubuntu 10.10 (2G) Servlet Container:tomcat-tomcat-7.0.23 (最大内存:default 256M maxThreads:50 ...
- 关于Hazard Pointers的话题
关于Hazard Pointers的话题, 起源于这个文章: 实现无锁的栈与队列(4) http://www.cnblogs.com/catch/p/3176636.html 其实他的系列文章(3)之 ...
- css给奇数行或偶数行添加指定样式
odd表示奇数行,even表示偶数行; tr:nth-child(odd); .table-striped > tbody > tr:nth-child(odd) { background ...