题解:

n倍经验题

首先比较容易想到的是对绝对值分类讨论

然后是4维偏序

1.查询和修改顺序

2.x>y

3.a[x]>a[y]

4.(x+a[x])-(y+a[y])<=k

这样是nlogn^3的,也许可以卡过吧。。。

另外注意在解决偏序问题的时候我们尽量使用cdq分治嵌套

注意cdq分治嵌套的时候

合并用归并排序这样才是nlog^3不然是nlog^4的

如果每层都要用归并的话每层要用不同数组

由于前面不对复杂度造成影响所以其实直接最后一层用归并就可以了

#include <bits/stdc++.h>
using namespace std;
#define IL inline
#define rint register int
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
char ss[<<],*A=ss,*B=ss;
char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int INF=1e9;
const int N=2e5+;
struct re{
int a,b,c,d,e,f,g;
}a[N],b[N];
int ans[N];
IL bool cmp(re x,re y)
{
return(x.a<y.a||(x.a==y.a&&x.b<y.b)||(x.a==y.a&&x.b==y.b&&x.c<y.c));
}
IL bool cmp2(re x,re y)
{
return(x.b<y.b||(x.b==y.b&&x.c<y.c)||(x.b==y.b&&x.c==y.c&&x.a<y.a));
}
IL bool cmp3(re x,re y)
{
return(x.c<y.c||(x.c==y.c&&x.a<y.a)||(x.c==y.c&&x.a==y.a&&x.b<y.b));
}
#define mid ((h+t)/2)
IL void cdq_fz2(int h,int t)
{
if (h==t) return;
cdq_fz2(h,mid); cdq_fz2(mid+,t);
rep(i,h,mid) a[i].f=;
rep(i,mid+,t) a[i].f=;
int h1=h,h2=mid+,h3=h;
while (h1<=mid&&h2<=t)
if (cmp3(a[h1],a[h2])) b[h3++]=a[h1++];
else b[h3++]=a[h2++];
while (h1<=mid) b[h3++]=a[h1++];
while (h2<=t) b[h3++]=a[h2++];
rep(i,h,t) a[i]=b[i];
int cnt=;
rep(i,h,t)
{
if (a[i].e&a[i].f) cnt+=a[i].d;
if (!(a[i].e|a[i].f)) a[i].g+=cnt;
}
}
IL void cdq_fz1(int h,int t)
{
if (h==t) return;
cdq_fz1(h,mid); cdq_fz1(mid+,t);
rep(i,h,mid) a[i].e=;
rep(i,mid+,t) a[i].e=;
sort(a+h,a+t+,cmp2);
cdq_fz2(h,t);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int n,k;
read(n); read(k); int nn=n;
rep(i,,n) read(a[i].a),read(a[i].b),read(a[i].c),a[i].d=;
sort(a+,a+n+,cmp);
int l=;
a[].a=INF;
rep(i,,n)
if (a[i].a==a[i-].a&&a[i].b==a[i-].b&&a[i].c==a[i-].c)
a[l].d++; else a[++l]=a[i];
n=l;
cdq_fz1(,n);
for(int i=;i<=n;i++) ans[a[i].g+a[i].d-]+=a[i].d;
for (int i=;i<=nn-;i++) cout<<ans[i]<<endl;
return ;
}

避免使用树套树

因为这样能大量降低编程复杂度

另外一种比较简单的方法是

当我们解不等式abs(x-y)+abs(a[x]-a[y])<=k时

先利用绝对值不等式abs(x-y+a[x]-a[y])<=abs(x-y)+abs(a[x]-a[y])<=k

得出-k<=x-y+a[x]-a[y]<=k(我并没有想出来这样为什么是等效的)

那么加上查询和修改顺序是三维偏序

正解是把它放到二维平面上

然后由于是一个菱形

将笛卡尔坐标旋转45°

然后三维偏序的cdq做法或者kd-tree就都可以了

另外本题如果强制在线除了kd-tree还有一种做法

就是二进制分组

BZOJ 2989: 数列/4170: 极光的更多相关文章

  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: 数列

    LINK:数列 需要动一点脑子 考虑查询 暴力显然不行 考虑把绝对值拆开. 当x<=y ax<=ay时 有 y-x+ay-ax<=k x+ax>=y+ay-k 可以发现在满足前 ...

  4. 解题:BZOJ 2989 数列

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

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

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

  6. 【BZOJ 4170】 4170: 极光 (CDQ分治)

    4170: 极光 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 121  Solved: 64 Description "若是万一琪露诺(俗 ...

  7. bzoj 4303 数列

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

  8. BZOJ_2989_数列&&BZOJ_4170_极光_KDTree

    BZOJ_2989_数列&&BZOJ_4170_极光_KDTree Description "若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方 ...

  9. BZOJ 3142 数列(组合)

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

随机推荐

  1. Unity3D ParticleSystem粒子系统

    粒子系统检视面板 点击粒子系统检视面板的右上角的"+"来增加新的模块.(Show All Modules:显示全部) 初始化模块: 持续时间(Duration):粒子系统发射粒子的 ...

  2. gnutls-3.5.18 static building for windows

    gnutls-3.5.18 static building for windows Required libraries:1. libnettle 2. gmplib Optional librari ...

  3. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  4. C/C++中如何在main()函数之前执行一条语句?

    在C语言中,如果使用GCC的话,可以通过attribute关键字声明constructor和destructor(C语言中如何在main函数开始前执行函数) #include <stdio.h& ...

  5. GZip、deflate和sdch压缩(网摘整理)

    GZip和deflate: gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代 ...

  6. ant自动编译打包android项目

    源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/antdemo.zip Android打包APK的流程如下:  下面我们开始尝试使用ant进行ap ...

  7. swift 实践- 01 -- UItableView的简单使用

    import UIKit class ViewController: UIViewController ,UITableViewDelegate,UITableViewDataSource{ over ...

  8. PID控制器开发笔记之十一:专家PID控制器的实现

    前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...

  9. (六)STL仿函数functor

    1.仿函数为算法服务,特点是重载操作符() 2.一共分为3大类,包括算术类,逻辑运算类,相对关系(比较大小):都继承了binary_function 3.仿函数的一些调用示例,其中右边的仿函数没有继承 ...

  10. VUE开发请求本地数据的配置,旧版本dev-server.js,新版本webpack.dev.conf.js

    VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...