【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 ...
随机推荐
- IE6+IE7+IE8+IE9+FF兼容性调试
HACK原理:不同浏览器对各中字符的识别不同 (读完文章你会发现,FF和IE8对以下字符的识别能力完全相同) 在 CSS中常用特殊字符识别表: (1)*: IE6+IE7都能识别*,而标准浏览器FF ...
- 针对移动设备的CSS3布局
针对移动设备的CSS3布局 一些专业人士预测五年内移动设备将击败普通电脑成为网页浏览领域的霸主,不管这个预言是否应验,让网页在移动设备上较好的显示已经成为网页设计师和开发者的重要任务,本教程学习用CS ...
- 【CodeForces】947 D. Picking Strings
[题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC 2.B - AC 3.C - AB 4.AAA - empty ...
- 【CodeForces】908 E. New Year and Entity Enumeration
[题目]E. New Year and Entity Enumeration [题意]给定集合T包含n个m长二进制数,要求包含集合T且满足以下条件的集合S数:长度<=m,非和与的结果都在集合中. ...
- js、php本周第一天和本周最后一天
PHP:本周一 echo date('Y-m-d',(time()-((date('w')==0?7:date('w'))-1)*24*3600)); //w为星期几的数字形式,这里0为周日 本周日 ...
- css各种姿势的水平居中
首先是最常用的,利用margin属性的auto来进行水平居中 margin: 0 auto; 其中0是指上下的margin,auto是左右的margin,margin这个属性的简写是按顺时针走的,也就 ...
- LOW逼三人组(三)----插入排序
插入排序思路 插入排序算法: import random # 随机模块 import time def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper( ...
- zedboard学习记录.2.PS+PL 流水灯与uart
1.建立一个工程. 硬件设计 2.IP integrator -> create block desgin;Run Block Automation. 3.add IP -> AXI GP ...
- arch点击硬盘无法挂载
出现问题如下 在使用xfce4桌面的时候在点击硬盘图标时可以挂载虽然要求你输入root密码 但是在使用openbox的时候点击硬盘图标却出现如下提示,权限的问题 Not authorized to p ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...