天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子
CDQ分治的题目.
我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心.
试想一下怎么去掉
如果所有的点都在我们当前求的点的左下方(就是只考虑在他坐下方的点对他的贡献). 我们怎么求?
那么就要我们求\(min{A_x-B_x+A_y-B_y}\)(假设\(A\)为询问的点)
那么其实就是让我们求\(A_x+A_y-max(B_x+B_y)\)
也因为要满足左下角的限制
其实就是满足
\(B_x<=A_x\)同时满足\(B_y<=A_y\)中最大的\(B_x+B_y\)
这个是可以直接CDQ的
但是我们只考虑了左下方的点对他的贡献,很明显,这是不够的
那么我们就想办法依次将左上,右上,右下全部转化为左下
就是通过同最大值域的加减来改变他们的左边但不改变相对关系
注意常数就好了
另外,这种情况下归并排序的时间复杂度比快排优秀太多了
#include<bits/stdc++.h>
using namespace std;
const int N = 6e5 + 3;
const int M = 1e6 + 3;
const int INF = 2e9;
int n,m;
int max_x,max_y;
int ans[N];
struct Q{
int type;
int id;
int xi;
int yi;
int ans;
}q[N],p[N],h[N];
Q g[N];
struct BIT{
int c[M];
inline void ins(int x,int v){
for(;x <= max_y;x += x & -x) c[x] = max(c[x],v);
}
inline int query(int x){
int res = 0;
for(;x;x -= x & -x) res = max(res,c[x]);
return res;
}
inline void clear(int x){
for(;x <= max_y;x += x & -x) c[x] = 0;
}
}T;
int xx[N],yy[N];
inline bool cmp1(Q x,Q y){
return x.id < y.id;
}
inline bool cmp2(Q x,Q y){
if(x.xi != y.xi)
return x.xi < y.xi;
return x.yi < y.yi;
}
inline int read(){
int x = 0;int flag = 0;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') flag = 1;
ch = getchar();
}
while(isdigit(ch)){
x = (x<<1) + (x<<3) + (ch^'0');
ch = getchar();
}
if(flag) x = -x;
return x;
}
inline void solve(int l,int r){
if(l == r) return;
int mid = (l + r) >> 1;
solve(l,mid);solve(mid + 1,r);
//sort(p + l,p + mid + 1,cmp2);
//sort(p + mid + 1,p + r + 1,cmp2);
// nj printf("%d %d\n",l,r);
int now = l;
int ll = l,rr = mid + 1,nn = l - 1;
// cout << 1 << endl;
for(int i = mid + 1;i <= r;++i){
while(i <= r && p[i].type != 2) ++i;
if(i > r) break;
for(;now <= mid && p[now].xi <= p[i].xi;++now) if(p[now].type == 1) T.ins(p[now].yi,p[now].xi + p[now].yi);
int t = T.query(p[i].yi);
if(t) ans[p[i].id] = min(ans[p[i].id],p[i].xi + p[i].yi - t);
}
for(int i = l;i < now;++i) if(p[i].type == 1) T.clear(p[i].yi);
while(ll <= mid && rr <= r){
if(p[ll].xi <= p[rr].xi) h[++nn] = p[ll++];
else h[++nn] = p[rr++];
}
while(ll <= mid) h[++nn] = p[ll++];
while(rr <= r) h[++nn] = p[rr++];
for(int i = l;i <= r;++i) p[i] = h[i];
}
inline void del(){
int rx = 0,ry = 0;m = 0;
for(int i = 1;i <= n;++i)
if(p[i].type == 1) rx = max(p[i].xi,rx),ry = max(p[i].yi,ry);
for(int i = 1;i <= n;++i){
if((p[i].xi <= rx && p[i].yi <= ry) || p[i].type == 2) g[++m] = p[i];
}
for(int i = 1;i <= m;++i) p[i] = g[i];
}
int main(){
n = read(),m = read();
for(int i = 1;i <= n;++i){
q[i].xi = read() + 1,q[i].yi = read() + 1;
max_x = max(max_x,q[i].xi),max_y = max(max_y,q[i].yi);
q[i].id = i;
q[i].type = 1;
}
for(int i = 1;i <= m;++i){
q[n + i].type = read();q[n + i].xi = read() + 1;q[n + i].yi = read() + 1;
q[n + i].id = i + n;
max_x = max(max_x,q[n + i].xi),max_y = max(max_y,q[n + i].yi);
}
n += m;
for(int i = 1;i <= n;++i) p[i] = q[i];
for(int i = 1;i <= n;++i) ans[i] = INF;
max_y = max(max_x,max_y) + 1;
solve(1,n);
for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi;
solve(1,n);
for(int i = 1;i <= n;++i) p[i] = q[i],p[i].yi = max_y - p[i].yi;
solve(1,n);
for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi,p[i].yi = max_y - p[i].yi;
solve(1,n);
for(int i = 1;i <= n;++i) if(ans[i] != INF) printf("%d\n",ans[i]);
return 0;
}
天使玩偶/SJY摆棋子的更多相关文章
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- 【LG4169】[Violet]天使玩偶/SJY摆棋子
[LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...
- 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...
- luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree
P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- [Violet]天使玩偶/SJY摆棋子 [cdq分治]
P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...
- P4169 [Violet]天使玩偶/SJY摆棋子
题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...
- LG4169 [Violet]天使玩偶/SJY摆棋子
题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子
%%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...
随机推荐
- 获取登录的地点和ip地址的js
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script>doc ...
- PHP实现redis限制单ip、单用户的访问次数功能
本文实例讲述了PHP实现redis限制单ip.单用户的访问次数功能.分享给大家供大家参考,具体如下: 有时候我们需要限制一个api或页面访问的频率,例如单ip或单用户一分钟之内只能访问多少次 类似于这 ...
- mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value
一.问题描述 在往数据库写入数据的时候,报错: '字段名' doesn't have a default value 本来这个错误是经常见到的,无非就是字段没有设置默认值造成的.奇怪的是,我这边报错的 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十七章:拾取
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十七章:拾取 代码工程地址: https://github.com/ ...
- [java]struts2 模型驱动 2016-05-01 21:40 702人阅读 评论(19) 收藏
一开始敲网上商城的时候,对于数据的传递方式我是很惊艳了一把的,感觉特别高大上,就感觉,竟然不用像.net一样取谁的值,给谁赋值这样,只要需要用的时候,简单的get一下就ok了,简直高大上啊. 然后发现 ...
- [***]沙雕低错集(算起来因为低错挂掉的分快够我AK三场了……)
由于沙雕错太多了所以不想写了,看着就难受…… 各种沙雕错(自从上次考试开始各种犯沙雕低错……): !!!sort是不稳定的排序,如果排序结构题只按其中一个关键字排序,那么在关键字相等时,排序多次的结果 ...
- 巨蟒python全栈开发-第11阶段 ansible_project7
今日大纲 1.发布详情页面 2.前端页面获取分支信息 3.前端界面获取commit信息与tag信息 4.获取线上最新版本 5.发布之实现nginx下线 6.发布之实现server发布 7.前端页面按钮 ...
- SDUT-2119_数据结构实验之链表四:有序链表的归并
数据结构实验之链表四:有序链表的归并 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 分别输入两个有序的整数序列(分别包 ...
- oracle函数 localtimestamp
[功能]:返回会话中的日期和时间 [参数]:没有参数,没有括号 [返回]:日期 [示例]select localtimestamp from dual; 返回:14-11月-08 12.35.37.4 ...
- Python深入:setuptools简介
Setuptools是Python Distutils的加强版,使开发者构建和发布Python包更加容易,特别是当包依赖于其他包时.用setuptools构建和发布的包与用Distutils发布的包是 ...