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 ... 
随机推荐
- TypeSDK总体设计思路和架构
			引言:本文旨在提供读者制作一个自己的聚合SDK的思路,抛砖引玉,让更多的读者对聚合SDK有好的理解. 这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代:这是信仰的时期,这是怀疑的时期:这 ... 
- 升级Centos的python为2.7(centos python 升级)
			1.首先下载python的2.7.8版本的tar包.为什么没有选择最新版本的3.4呢?因为3版本的兼容性不好.很多一些成熟的项目都是基于2.7开发的. https://www.python.org/d ... 
- css知多少(11)——position
			1. 引言 本文将用一篇文章介绍position(定位),在学习position之前,我们应该去思考一个问题:什么情况下我们需要定位?如果没有定位将无法满足我们怎样的需求?我们要知道,被人类创造出来的 ... 
- SVG Path高级教程
			课程分为四个方面: 1. Path概述 2. 移动和直线命令 3. 弧线命令 4. 贝塞尔曲线命令 Path概述 <path> 标签用来定义路径,Path字符串是由命令及其参数组组成的字符 ... 
- ABAP关键字SUBMIT的简单例子和学习小记
			网上有关SUBMIT实现程序调用的例子稍显复杂,而相关的参考和解释则不是很完善.本文给出一个SUBMIT的小示例程序(代码见文末),实现了最简单的程序间调用及返回值,以及SAP官方文档中相关内容的翻译 ... 
- 01背包问题python 2.7实现
			版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html #!/usr/bin/env python # -*- coding ... 
- 脱离spring集成cxf(基于nutz框架)
			什么是webService WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 理论资料: http://blog.csdn.net/wooshn/article/details/8 ... 
- Graphviz绘制百家争鸣图
			最近读易中天<先秦诸子百家>,一边读一边在纸上画出逻辑关系,图越来越复杂,趁中午休息索性就把图用Graphviz重新绘制了一下;由于Graphviz主动承担了绘图排版的职责,我只需要关注内 ... 
- Android使用C++截屏并显示
			使用android底层自带的截屏源码进行修改后,将截取屏幕的内容再次显示在屏幕上,使屏幕呈现出暂停的效果. android自带的截屏代码在android\JB\frameworks\base\cmds ... 
- [python]set集合学习
			python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ... 
