题解:

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. Android应用内嵌cocos2dx游戏项目

    cocos2dx的Android环境搭建(Windows/Mac) 我用的cocos2dx3.15版本的. 以下步骤是在Windows平台执行的. 创建Cocos2d-x项目 将刚才下载的cocos2 ...

  2. 缓存系列之一:buffer、cache与浏览器缓存

    缓存系列之一:buffer.cache与浏览器缓存 一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保 ...

  3. 增加一台web机注意事项

    2017年4月18日 15:23:57 星期二 增加一台web机时, 先不要挂载进lb 1. 需要将此机器的ip加入到其它服务的白名单内: 数据库, 缓存, 第三方接口等 2. 绑定hosts, 点点 ...

  4. python学习第2天

    03 pycharm使用04 格式化输出05 while循环 why: 吃饭睡觉上课, 地球绕着太阳公转,单曲循环,列表循环. what: while how: while 条件: 循环体 where ...

  5. [C][代码实例]交换指向常量的二级指针的位置

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> ...

  6. Django 中间件 请求前

    中间件: class TestMiddleware(object): """中间件类""" def __init__(self): &quo ...

  7. JS和Jquery获取和修改label的值的示例代码

    abel标签在JS和Jquery中使用不能像其他标签一样用value获取它的值,下面有个不错的示例,希望大家可以学习下 来源:  <  JS和Jquery获取和修改label的值的示例代码  & ...

  8. Confluence 6 的 WebDAV 客户端整合介绍

    WebDAV 允许用户通过一个 WebDAV 客户端来访问 Confluence.例如,微软 Windows 的 'My Network Places'.通过为访问的用户提供权限,这个用户可以在 Co ...

  9. Confluence 6 数据库字符集编码和问题

    数据库字符集编码 你的数据库和 JDBC 数据源连接必须配置为使用 UTF-8 编码(或者根据你配置的数据库来制定正确的 UTF-8 编码字符集,例如在 Oracle 中使用的是 AL32UTF8 ) ...

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

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