BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶
Time Limit: 80 Sec Memory Limit: 128 MB
Submit: 1473 Solved: 621
[Submit][Status][Discuss]
Description
.gif)
Input
.gif)
Output
.gif)
Sample Input & Output
样例过大,略
HINT
.gif)
Source
CDQ分治,分类讨论拆绝对值的方式,分别查询最优值。
#include <cstdio>
#include <cstring>
#include <algorithm> inline int nextChar(void) {
const int siz = ;
static char buf[siz];
static char *hd = buf + siz;
static char *tl = buf + siz;
if (hd == tl)
fread(hd = buf, , siz, stdin);
return int(*hd++);
} inline int nextInt(void) {
register int ret = ;
register int neg = false;
register int bit = nextChar();
for (; bit < ; bit = nextChar())
if (bit == '-')neg ^= true;
for (; bit > ; bit = nextChar())
ret = ret * + bit - ;
return neg ? -ret : ret;
} const int lim = ;
const int siz = ;
const int inf = ; int n, m; struct data {
int k, x, y, t, p;
inline friend bool operator <
(const data &a, const data &b) {
if (a.x != b.x)
return a.x < b.x;
else
return a.k < b.k;
}
}p[siz], s[siz], q[siz]; int ans[siz]; int now;
int bit[siz];
int tim[siz]; inline void add(int t, int k) {
for (; t < siz; t += t&-t)
if (bit[t] < k || tim[t] != now)
bit[t] = k, tim[t] = now;
} inline int ask(int t) {
int ret = -inf;
for (; t; t -= t&-t)
if (ret < bit[t] && tim[t] == now)
ret = bit[t];
return ret;
} void cdqSolve(int l, int r) {
if (l >= r)return; int mid = (l + r) >> ; cdqSolve(l, mid);
cdqSolve(mid + , r); int t1 = l, t2 = mid + , tot = l; while (t1 <= mid && t2 <= r) {
if (s[t1] < s[t2])
q[tot++] = s[t1++];
else
q[tot++] = s[t2++];
} while (t1 <= mid)
q[tot++] = s[t1++]; while (t2 <= r)
q[tot++] = s[t2++]; for (int i = l; i <= r; ++i)
s[i] = q[i]; ++now; for (int i = l; i <= r; ++i)
if (s[i].k && s[i].t > mid) {
int tmp = s[i].x + s[i].y - ask(s[i].y);
if (ans[s[i].p] > tmp)
ans[s[i].p] = tmp;
}
else if (!s[i].k && s[i].t <= mid)
add(s[i].y, s[i].x + s[i].y);
} inline void cdqSolve1(void) {
memcpy(s, p, sizeof(s));
cdqSolve(, n + m);
} inline void cdqSolve2(void) {
memcpy(s, p, sizeof(s));
for (int i = ; i <= n + m; ++i)
s[i].x = lim - s[i].x;
cdqSolve(, n + m);
} inline void cdqSolve3(void) {
memcpy(s, p, sizeof(s));
for (int i = ; i <= n + m; ++i)
s[i].y = lim - s[i].y;
cdqSolve(, n + m);
} inline void cdqSolve4(void) {
memcpy(s, p, sizeof(s));
for (int i = ; i <= n + m; ++i)
s[i].x = lim - s[i].x,
s[i].y = lim - s[i].y;
cdqSolve(, n + m);
} signed main(void) {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout); n = nextInt();
m = nextInt(); for (int i = ; i <= n; ++i) {
p[i].x = nextInt();
p[i].y = nextInt();
p[i].k = ;
p[i].t = i;
} for (int i = ; i <= m; ++i) {
p[i + n].k = nextInt() - ;
p[i + n].x = nextInt();
p[i + n].y = nextInt();
p[i + n].t = i + n;
p[i + n].p = i;
} for (int i = ; i <= m; ++i)
ans[i] = inf; cdqSolve1();
cdqSolve2();
cdqSolve3();
cdqSolve4(); for (int i = ; i <= m; ++i)
if (p[i + n].k)printf("%d\n", ans[i]);
}
@Author: YouSiki
BZOJ 2716: [Violet 3]天使玩偶的更多相关文章
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- bzoj 2716 [Violet 3]天使玩偶——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...
- bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】
KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会 ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...
随机推荐
- CSS3新特性应用之用户体验
一.光标 新增加not-allowed光标,不允许访问 隐藏光标,在触模应用上很有用,css2.1需要一个透明的图片来实现,而css3直接用cursor:none即可. 完整代码: curosr: u ...
- 如何在Node.js中合并两个复杂对象
通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...
- JavaScript Array数组方法详解
Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...
- 如果你的SharePoint出现了,状态服务问题,InfoPath无法正常使用
Create a new ‘State Service’ Service Application using Powershell February 14, 2012Leave a commentGo ...
- [Erlang 0113] Elixir 编译流程梳理
注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效 之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...
- uploadify插件Http Error(302)错误记录(MVC)
由于项目(asp.net MVC)需要做一个附件上传的功能,使用的是jQuery的Uploadify插件的2.1.0版本,上传文件到自己项目指定的文件夹下面.做完之后,在谷歌上测试是正确的,在火狐上报 ...
- 遇到的Exception/error及解决办法记录汇总
一.java.net.SocketException 1.java.net.SocketException:Connection reset 首先,如果一端的Socket被关闭(或主动关闭,或因为异常 ...
- XML简介与CDATA解释
简介XML 是一种受到广泛支持的 Internet 标准,用于以一种特殊的方式编码结构化数据.实际上,以 XML 编码的数据可以通过任何编程语言解码,人们甚至可以使用标准的文本编辑器来阅读或编写 XM ...
- css content之counter-reset、content-increment
万万没想到,写了快三年前端,有不会用的css,居然还有完全没听过.见过的css属性,而且还是CSS2的内容! 关于counter-reset.content-increment两个属性的详解可以参看张 ...
- plain framework 1 1.0.4 更新 稳定版发布
PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...