BZOJ_2989_数列&&BZOJ_4170_极光_KDTree
BZOJ_2989_数列&&BZOJ_4170_极光_KDTree
Description
Input
Output
对于每次询问操作,输出一个非负整数表示答案
Sample Input
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1
Sample Output
3
3
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200050
#define ls ch[p][0]
#define rs ch[p][1]
#define _min(x,y) ((x)<(y)?(x):(y))
#define _max(x,y) ((x)>(y)?(x):(y))
int ch[N][2],mx[N][2],mn[N][2],siz[N],now,root,val[N],n;
struct Point {
int p[2];
bool operator < (const Point &x) const {
return p[now]==x.p[now]?p[!now]<x.p[!now]:p[now]<x.p[now];
}
}a[N];
inline char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
char rc() {
char s=nc();
while(s!='Q'&&s!='M') s=nc();
return s;
}
int rd() {
int x=0; char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
void pushup(int p,int x) {
int i;
for(i=0;i<2;i++) mn[p][i]=_min(mn[p][i],mn[x][i]),mx[p][i]=_max(mx[p][i],mx[x][i]);
siz[p]+=siz[x];
}
int build(int l,int r,int type) {
int mid=(l+r)>>1; now=type;
nth_element(a+l,a+mid,a+r+1);
int i;
for(i=0;i<2;i++) mn[mid][i]=mx[mid][i]=a[mid].p[i];
siz[mid]=1;
ch[mid][0]=ch[mid][1]=0;
if(l<mid) ch[mid][0]=build(l,mid-1,!type),pushup(mid,ch[mid][0]);
if(r>mid) ch[mid][1]=build(mid+1,r,!type),pushup(mid,ch[mid][1]);
return mid;
}
void insert(int x) {
int p=root;
now=0;
mx[x][0]=mn[x][0]=a[x].p[0];
mx[x][1]=mn[x][1]=a[x].p[1];
siz[x]=1;
while(1) {
pushup(p,x);
if(a[x]<a[p]) {
if(ls) p=ls;
else {ls=x; return ;}
}else {
if(rs) p=rs;
else {rs=x; return ;}
}
now=!now;
}
}
int Abs(int x) {return x>0?x:-x;}
int dismin(int x,int y,int p) {
return _max(mn[p][0]-x,0)+_max(x-mx[p][0],0)+_max(mn[p][1]-y,0)+_max(y-mx[p][1],0);
}
int dismax(int x,int y,int p) {
return max(Abs(x-mx[p][0]),Abs(x-mn[p][0]))+max(Abs(y-mx[p][1]),Abs(y-mn[p][1]));
}
int query(int x,int y,int k,int p) {
if(dismax(x,y,p)<=k) return siz[p];
int re=0;
if(Abs(a[p].p[0]-x)+Abs(a[p].p[1]-y)<=k) re++;
if(ls&&dismin(x,y,ls)<=k) re+=query(x,y,k,ls);
if(rs&&dismin(x,y,rs)<=k) re+=query(x,y,k,rs);
return re;
}
int main() {
n=rd(); int Q=rd();
int i,x,y;
for(i=1;i<=n;i++) {
val[i]=rd();
a[i]=(Point){i,val[i]};
}
root=build(1,n,0);
while(Q--) {
char opt=rc();
x=rd(); y=rd();
if(opt=='Q') {
printf("%d\n",query(x,val[x],y,root));
}else {
val[x]=y;
a[++n]=(Point){x,y};
insert(n);
if(n%10000==0) root=build(1,n,0);
}
}
}
BZOJ_2989_数列&&BZOJ_4170_极光_KDTree的更多相关文章
- BZOJ 2989: 数列/4170: 极光
题解: n倍经验题 首先比较容易想到的是对绝对值分类讨论 然后是4维偏序 1.查询和修改顺序 2.x>y 3.a[x]>a[y] 4.(x+a[x])-(y+a[y])<=k 这样是 ...
- 【BZOJ 4170】 4170: 极光 (CDQ分治)
4170: 极光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64 Description "若是万一琪露诺(俗 ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- PAT 1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
随机推荐
- 【Todo】各种语言里面的for循环 & loop
会的语言多了,不同语言的语法就会混淆.整理了一下. Java里面: 普通的for循环之外: 有以下格式: for (int x : intarr) { } JS里面: }; for (x in per ...
- Spring HTTP Service
基于Spring MVC, 使用Http Service Invoke远程调用方法 (参考: http://blog.csdn.net/hanqunfeng/article/details/43031 ...
- Android API Guides---Services
服务 在该文献 基础 声明在清单服务 创建一个启动的服务 扩展IntentService类 扩展服务类 启动服务 停止服务 创建绑定服务 将通知发送给用户 执行在前台服务 管理服务生命周期 实施生命周 ...
- 赵雅智_Fragment
当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块. 在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就能 ...
- 建立第一个Sencha Touch应用
准备 开始开发前,请先到下面的地址下载Sencha Touch 2的包:http://www.sencha.com/products/touch/download/ .下载完解压后你会发现包里有很多文 ...
- One usage of recurison: the tower of Hanoi
Statements: This blog was written by me, but most of content is quoted from book[Data Structure wit ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- Ubuntu 15.10
安装Ubuntu 15.10后要做的事 http://blog.csdn.net/skykingf/article/details/45267517 ubuntu15.10 install-mac-t ...
- 1.新手上路:Windows下,配置Qt环境
个人体会: 我最初只是想看看C++除了"黑窗口"之外,怎么才能做一些"更好看的东西".之后在网上看到有人推荐Qt,就看了一下官网(https://www.qt. ...
- Jquery 插件 实例
先说明下应用场景,通过可配项的配置和默认项覆盖,获取指定的需求数据,填充到指定的位置(两个指定其实都是可配的) (function($) { $.fn.extend({ getOneNews: fun ...