题解:

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. Loj 【CQOI 2006】简单题,mmp

    #10117. 「一本通 4.1 练习 2」简单题     题目描述 题目来源:CQOI 2006 有一个 nnn 个元素的数组,每个元素初始均为 000.有 mmm 条指令,要么让其中一段连续序列数 ...

  2. 手动注册 Omron SYSMAC OPC Server 2

    使用如下注册表操作实现 Omron SYSMAC OPC Server 2 的注册,包括COM组件和ProgID. 注意,手动注册适用于在win10等不兼容老版本程序的正常使用的情况,此方法一般在单机 ...

  3. Ajax使用formdata异步上传文件,报错the request was rejected because no multipart boundary was found

    基于jQuery的Ajaxs使用FormData上传文件要注意两个参数的设定 processData设为false 把processData设为false,让jquery不要对formData做处理, ...

  4. 二、消息队列之如何在C#中使用RabbitMQ

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...

  5. Spring initializr使用

    Spring initializr 是Spring 官方提供的一个很好的工具,用来初始化一个Spring boot 的项目. 有两种方式可以使用Spring initializr来创建一个项目: ht ...

  6. 解决定位工具报错Error while parsing UI hierarchy XML file: Invalid ui automator hierarchy file.

    在微信自动化测试中,偶尔会出现某个页面一直无法读取到页面元素的情况,原因是页面未加载完成 解决方式:1.重启APP 2.建议上下滑动当前页面,如朋友圈,会出现滑动到某个地方,出现可以读取到的情况 参考 ...

  7. PyJWT 使用

    最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证.转用JWT. 其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT . J ...

  8. Python-递归、三元表达式列表生成式等

    一.函数递归 1.什么是函数递归:函数的递归调用是函数嵌套的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用 2.递归调用必须明确的两个阶段: 1.回溯:一次次 ...

  9. vscode 配置php

    vscode 的官网:https://code.visualstudio.com/docs/languages/php 添加扩张程序: php的设置: php格式化是安装“PHP Intelephen ...

  10. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...