4170: 极光

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 121  Solved: 64

Description

"若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她。对方表现出兴趣的话,那就慢
慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简单的问题,她一定也答不上来。"               
 --《上古之魔书》
天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列a[i],远古之魔书上记载到:2个位置的g
raze值为两者位置差与数值差的和:
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]}(含修改)<=80000

Output

对于每次询问操作,输出一个非负整数表示答案

Sample Input

3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1

Sample Output

2
3
3

HINT

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分治)的更多相关文章

  1. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  2. bzoj 1176 Mokia(CDQ分治,BIT)

    [题目链接]  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=96974 [题意] 定义查询操作与修改操作:1 x y z 为 ...

  3. bzoj 3263 陌上花开(cdq分治,BIT)

      [题意] 求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目. [思路] cdq分治 借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护. 首先合并三维都是相 ...

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

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

  5. BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]

    传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...

  6. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  7. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  8. BZOJ 1492 货币兑换 Cash CDQ分治

    这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个l ...

  9. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  10. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

随机推荐

  1. 【洛谷 P2604】 [ZJOI2010]网络扩容(最大流,费用流)

    题目链接 第一问就是简单的最大流. 第二问,保留第一问求完最大流的残量网络. 然后新建一个源点,向原源点连一条流量为k,费用为0的边. 然后所有边重新连一起(原来的边保留),费用为题目所给,最小费用即 ...

  2. HDU 1034 Candy Sharing Game (模拟)

    题目链接 Problem Description A number of students sit in a circle facing their teacher in the center. Ea ...

  3. NYOJ 267 郁闷的C小加(二) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...

  4. vue-loader 调用了cssLoaders方法配置了css加载器属性。

    module: { loaders: [ // 这里也是相应的配置,test就是匹配文件,loader是加载器, { test: /\.vue$/, loader: 'vue' }, { test: ...

  5. JS日历控件特效代码layDate

    https://www.js-css.cn/a/jscode/date/2015/0405/1461.html

  6. koa通过get请求获取参数

    1.通过get方式请求获取参数的方式有两种 通过上下文获取 通过request获取 获得的格式有两种:query与querystring 注意:querystring为小写,驼峰格式会导致无法获取 2 ...

  7. 判断Selenium加载完成

    How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...

  8. springMVC中ajax的实现

    function addDebtResult(){ var repayIds=$("#repayIds").val(); var lateFeeDay=$("#repay ...

  9. 安装 Xamarin for Visual Studio

    总得来说,Xamarin 有“联网自动安装”和“手动安装”两种方式. 说明:本文涉及得资源链接都是官网的,同时,在 我的网盘 也有相关备份. 现在,我就以 Windows 为例来大概说明……(-=-我 ...

  10. 自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: documen ...