BZOJ 2989: 数列/4170: 极光
题解:
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: 极光的更多相关文章
- [BZOJ 2989]数列(二进制分组+主席树)
[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- bzoj 2989: 数列
LINK:数列 需要动一点脑子 考虑查询 暴力显然不行 考虑把绝对值拆开. 当x<=y ax<=ay时 有 y-x+ay-ax<=k x+ax>=y+ay-k 可以发现在满足前 ...
- 解题:BZOJ 2989 数列
题面 学习二进制分组 题目本身可以看成二维平面上的问题,转成切比雪夫距离后就是矩形和了 二进制分组是将每个修改添加到末尾,然后从后往前二进制下进位合并,这样最多同时有$\log n$组,每个修改只会被 ...
- BZOJ #2989. 数列 [树套树]
考虑转化问题模型,这个没必要可持久化,直接加点就可以了,还不用删点 每次的问题是求 曼哈顿距离,变成切比雪夫距离然后求解 然后我们考虑将这玩意旋转 45度, 然后原坐标的 \((x,y)\) 会变成 ...
- 【BZOJ 4170】 4170: 极光 (CDQ分治)
4170: 极光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64 Description "若是万一琪露诺(俗 ...
- bzoj 4303 数列
bzoj 4303 数列 二维 \(KD-Tree\) 模板题. \(KD-Tree\) 虽然在更新和查询的方式上类似于线段树,但其本身定义是类似于用 \(splay/fhq\ treap\) 维护区 ...
- BZOJ_2989_数列&&BZOJ_4170_极光_KDTree
BZOJ_2989_数列&&BZOJ_4170_极光_KDTree Description "若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方 ...
- BZOJ 3142 数列(组合)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3142 题意:给出n,K,m,p.求有多少长度为K的序列A,满足:(1)首项为正整数:(2 ...
随机推荐
- 二、消息队列之如何在C#中使用RabbitMQ
1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...
- sublime text3 golang插件(golang build)
1 前言 先前条件: sublime text3:下载地址:http://www.sublimetext.com/3 golang:下载地址:https://golang.google.cn/dl/ ...
- 洛谷P3317 [SDOI2014]重建 [Matrix-Tree定理]
传送门 思路 相信很多人像我一样想直接搞Matrix-Tree定理,而且还过了样例,然后交上去一分没有. 但不管怎样这还是对我们的思路有一定启发的. 用Matrix-Tree定理搞,求出的答案是 \[ ...
- confluence搭建破解及汉化教程
注:本文参考了 < confluence搭建破解及汉化教程 > 本文是在yum环境搭建好,且可用联网的前提下进行的实际操作并作记录的. 关于yum本地环境搭建可以参考此文:<Cen ...
- Pod 找不到头文件 解决方法
在 BuildSetting 中 搜索 User Header Search Paths 然后在下面 User Header Search Paths 中添加 ${SRCROOT} 再将后面参数改为 ...
- SpringMVC环境搭建
Spring MVC为展现层提供的基于MVC设计理念的优秀Web框架,是目前最主流的MVC框架之一. Spring 3.0之后完全超越Struts2,称为最优秀的MVC框架.学完SpringMVC之后 ...
- Linux基础实操六
实操一: 临时配置网络(ip,网关,dns)+永久配置 #ifconfig ens33 192.168.145.134/24 #vim /etc/resolv.conf #route add defa ...
- skipfish web Scrabble
1.skipfish 网页扫描抓取 2.w3af web漏洞扫描
- Metasploit渗透测试模块(一)
1.Metasploit模块加载 初始化界面,成功要加载数据库 查看 Metasploit中已近存在的漏洞模块使用 show payloads
- 三维拓扑排序好题hdu3231
/* 三维拓扑排序 将每个长方体分解成六个面,xyz三维进行操作 每一维上的的所有长方体的面都应该服从拓扑关系,即能够完成拓扑排序=如果两个长方体的关系时相交,那么其对应的三对面只要交叉即可 如 a1 ...