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. 动态内容的缓存技术:CSI vs SSI vs ESI

    CDN 中动态内容是不太好解决的,通常需要很麻烦的技术和方法来实现这些功能,比如我设计过一种动态缓存的方法,基于 session 栏接,然后根据热点来做动态缓存时间的控制.目前开放的实现 Cache ...

  2. 用jquery实现小火箭到页面顶部的效果

    恩,不知道之前在哪看过一个页面效果就是如果页面被滑动了就出现一个小火箭,点击这个小火箭就可以慢慢回到页面顶部,闲的没事,自己搞了一下 需要引入jquery 代码和布局都很简单 <!DOCTYPE ...

  3. spring-boot 更换依赖版本

    创建Spring Boot操作步骤如下: 在File菜单里面选择 New > Project,然后选择Spring Initializr 更换版本 或 pom spring-boot-start ...

  4. perl6 单线程破解phpmyadmin脚本

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $url = 'http://localhost/phpMyAdmin/index.php' ...

  5. flask插件系列之flask_caching缓存

    前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...

  6. Linux内存高,触发oom-killer问题解决

    最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1. 首先确认该系统的版本是32位 ? #uname -a Linux alarm 2.6.9-67.ELsmp #1 S ...

  7. adb_usb.ini在adb找不到设备时

    不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...

  8. WebClient vs HttpClient vs HttpWebRequest

    转载:http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/ Just when I was startin ...

  9. python爬虫多线程编程

    #使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...

  10. 121.Best Time to Buy and Sell Stock---dp

    题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ 题目大意:给出一串数组,找到差值最大的差 ...