LINK:数列

需要动一点脑子 考虑查询 暴力显然不行 考虑把绝对值拆开。

当x<=y ax<=ay时 有 y-x+ay-ax<=k x+ax>=y+ay-k 可以发现在满足前两个条件下第三个条件是这样才会被统计贡献。

剩下3种情况分别是 x+ax<=k+ay+y x-ax<=k+y-ay ax-x=k-y+ay

可以发现 这个类似于三维偏序问题 我们进行三维数点即可 但是由于操作有时间关系 上CDQ的话就变成了四维偏序。

直接KD tree即可。考虑修改操作 其实就是插入 由于历史版本还有我们不需要删除。

考虑替罪羊树维护。

//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ld long double
#define pb push_back
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define F first
#define S second
#define mk make_pair
#define mod 1000000007
#define RE register
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const db alpha=0.75;
const int MAXN=110000;
const int K=3;
int n,Q,cnt,D,top,ans,root;
char a[10];
struct wy
{
int l,r;
int mx[K],mn[K];
int d[K];//自己本身元素
int sum;
}t[MAXN<<2];
int q[MAXN<<2],b[MAXN];
inline int cmp(int a,int b){return t[a].d[D]<t[b].d[D];}
inline void pushup(int p)
{
int l=t[p].l;int r=t[p].r;
t[p].sum=t[l].sum+t[r].sum+1;
rep(0,K-1,i)
{
if(l)t[p].mx[i]=max(t[l].mx[i],t[p].mx[i]),t[p].mn[i]=min(t[p].mn[i],t[l].mn[i]);
if(r)t[p].mx[i]=max(t[r].mx[i],t[p].mx[i]),t[p].mn[i]=min(t[p].mn[i],t[r].mn[i]);
}
}
inline int build(int l,int r,int k)
{
if(l>r)return 0;
int mid=(l+r)>>1;D=k;
nth_element(q+l,q+mid,q+1+r,cmp);
rep(0,K-1,i)t[q[mid]].mx[i]=t[q[mid]].mn[i]=t[q[mid]].d[i];
t[q[mid]].l=build(l,mid-1,(k+1)%K);
t[q[mid]].r=build(mid+1,r,(k+1)%K);
pushup(q[mid]);return q[mid];
}
inline void dfs(int x)
{
if(!x)return;
q[++top]=x;
if(t[x].l)dfs(t[x].l);
if(t[x].r)dfs(t[x].r);
}
inline void insert(int &p,int x,int k,int flag)
{
if(!p)
{
p=x;t[p].sum=1;
rep(0,K-1,i)t[p].mx[i]=t[p].mn[i]=t[p].d[i];
return;
}
int mark=0;
if(t[x].d[k]<t[p].d[k])
{
if(t[t[p].l].sum>=t[p].sum*alpha)mark=1;
insert(t[p].l,x,(k+1)%K,flag|mark);
}
else
{
if(t[t[p].r].sum>=t[p].sum*alpha)mark=1;
insert(t[p].r,x,(k+1)%K,flag|mark);
}
if(mark&&!flag)top=0,dfs(p),p=build(1,top,k);
else pushup(p);
}
inline int check(int x)
{
rep(0,K-1,i)if(t[x].mx[i]>q[i])return 0;
return 1;
}
inline int check_point(int x)
{
rep(0,K-1,i)if(t[x].d[i]>q[i])return 0;
return 1;
}
inline int check_range(int x)
{
rep(0,K-1,i)if(t[x].mn[i]>q[i])return 0;
return 1;
}
inline void ask(int x)
{
if(check(x)){ans+=t[x].sum;return;}
if(check_point(x))++ans;
if(t[x].l&&check_range(t[x].l))
ask(t[x].l);
if(t[x].r&&check_range(t[x].r))
ask(t[x].r);
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(Q);
rep(1,n,i)
{
int x;get(x);b[i]=x;
t[++cnt].d[0]=i;t[cnt].d[1]=x;t[cnt].d[2]=-i-x;q[cnt]=cnt;
t[++cnt].d[0]=-i;t[cnt].d[1]=-x;t[cnt].d[2]=i+x;q[cnt]=cnt;
t[++cnt].d[0]=-i;t[cnt].d[1]=x;t[cnt].d[2]=i-x;q[cnt]=cnt;
t[++cnt].d[0]=i;t[cnt].d[1]=-x;t[cnt].d[2]=x-i;q[cnt]=cnt;
}
root=build(1,cnt,0);
rep(1,Q,i)
{
scanf("%s",a+1);
if(a[1]=='M')
{
int x,y;get(x);get(y);b[x]=y;
t[++cnt].d[0]=x;t[cnt].d[1]=y;t[cnt].d[2]=-x-y;insert(root,cnt,0,0);
t[++cnt].d[0]=-x;t[cnt].d[1]=-y;t[cnt].d[2]=y+x;insert(root,cnt,0,0);
t[++cnt].d[0]=-x;t[cnt].d[1]=y;t[cnt].d[2]=x-y;insert(root,cnt,0,0);
t[++cnt].d[0]=x;t[cnt].d[1]=-y;t[cnt].d[2]=y-x;insert(root,cnt,0,0);
}
else
{
ans=0;int x,y;get(x);get(y);
//x<=y ax<=ay -x-ax<=-y-ay+k 也统计x相等y相等
q[0]=x;q[1]=b[x];q[2]=-x-b[x]+y;ask(root);
//x>=y ax>ay x+ax<=k+ay+y
q[0]=-x;q[1]=-b[x]-1;q[2]=x+b[x]+y;ask(root);
//x>y ax<=ay x-ax<=k+y-ay
q[0]=-x-1;q[1]=b[x];q[2]=y+x-b[x];ask(root);
//x<y ax>=ay -x+ax<=k+ay-y;
q[0]=x-1;q[1]=-b[x];q[2]=y+b[x]-x;ask(root);
put(ans);
}
}
return 0;
}

代码写的有问题 我这样做应该建立四棵KD-tree。

或者 写四个ask 我觉得。

网上题解都是旋转坐标系转契比雪夫距离了。我思考一下我这种做法对不对。

bzoj 2989: 数列的更多相关文章

  1. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  2. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  3. BZOJ 2989: 数列/4170: 极光

    题解: n倍经验题 首先比较容易想到的是对绝对值分类讨论 然后是4维偏序 1.查询和修改顺序 2.x>y 3.a[x]>a[y] 4.(x+a[x])-(y+a[y])<=k 这样是 ...

  4. 解题:BZOJ 2989 数列

    题面 学习二进制分组 题目本身可以看成二维平面上的问题,转成切比雪夫距离后就是矩形和了 二进制分组是将每个修改添加到末尾,然后从后往前二进制下进位合并,这样最多同时有$\log n$组,每个修改只会被 ...

  5. BZOJ #2989. 数列 [树套树]

    考虑转化问题模型,这个没必要可持久化,直接加点就可以了,还不用删点 每次的问题是求 曼哈顿距离,变成切比雪夫距离然后求解 然后我们考虑将这玩意旋转 45度, 然后原坐标的 \((x,y)\) 会变成 ...

  6. bzoj 4303 数列

    bzoj 4303 数列 二维 \(KD-Tree\) 模板题. \(KD-Tree\) 虽然在更新和查询的方式上类似于线段树,但其本身定义是类似于用 \(splay/fhq\ treap\) 维护区 ...

  7. BZOJ 3142 数列(组合)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3142 题意:给出n,K,m,p.求有多少长度为K的序列A,满足:(1)首项为正整数:(2 ...

  8. BZOJ 4305: 数列的GCD( 数论 )

    对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...

  9. bzoj 4305 数列的GCD

    LINK:数列的GCD 题意: 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], ...

随机推荐

  1. h5移动端实现图片文件上传

    PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现. JS代码 ...

  2. 转载---最简单的JavaScript模板引擎

    转载自:http://www.cnblogs.com/dolphinX/p/3489269.html,http://blog.jobbole.com/56689/

  3. 基础设计模式-02 UML图

    在学习设计模式的时候,经常会涉及到类,接口之间关系的梳理,UML图就是一个很好的方式: 1.类,抽象类,接口 类: 抽象类: 接口: 1.抽象类斜体表示: 2.“+”表示public,"-& ...

  4. c++ 数字与字符串的相互转换

    首先推荐用用C++的stringstream. 主要原因是操作简单. 0x00 字符串转数字 // zcj_14.cpp : //该程序是一个注册机,原理是对输入的字符每个与2求异或的结果取低位即为注 ...

  5. javaWeb7——PrepareStatement原理,Pareparedstatement和Statement的区别

    查询数据返回的结果集: ResulSet: 代码实现 : PrepareStatement原理 代码实现: Pareparedstatement和Statement的区别: 注意: Statement ...

  6. Redis 6.0 redis-cluster-proxy 说明

    背景 Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念.关于Redis Cluster的相关说明,可以看之前的几篇文章:Redis Cluster 原 ...

  7. 午间邂逅 | post 和 get 的兄弟情深

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习导图: image-20200710142453734 image-202007101431049 ...

  8. requests接口自动化6-Body里json格式数据形式的post请求:json

    Body里json格式数据形式的post请求:用json传参 fiddler里请求响应内容: 传递的json数据 [{"stepId":"0","ca ...

  9. JVM 专题六:运行时数据区(一)概述

    1. 运行时数据区架构图 2. 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略, ...

  10. python发送邮件插件

    github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...