2716: [Violet 3]天使玩偶

Time Limit: 80 Sec  Memory Limit: 128 MB
Submit: 1473  Solved: 621
[Submit][Status][Discuss]

Description

Input

Output

Sample Input & Output

样例过大,略

HINT

Source

[Submit][Status][Discuss]

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]天使玩偶的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  2. bzoj 2716 [Violet 3]天使玩偶——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...

  3. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  4. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

  5. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  6. bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】

     KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会 ...

  7. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  8. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  9. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. 你必须知道的Microsoft SQL Server一

    不知道为什么我Win10环境下安装的Sqlserver2012,智能提示的功能基本上没有用,没办法,我还是选择安装插件SQL Prompt 5吧.下载地址:http://www.uzzf.com/so ...

  2. python入门-python解释器执行

    最近由于公司需要,接触了python这门神奇的语言,给我的感觉就是开发快速和代码简洁. 开始还是先罗列一下解释性语言和编译性语言的差别吧0.0!   编译性语言:是在程序运行前,需要专门的一个编译过程 ...

  3. 4.6 .net core依赖注入的封装

    现在流行的系统一般都采用依赖注入的实现方式,利用DI容器来直接获取所用到的类/接口的实例..net core也一样采用DI的方式,提供了DI容器的接口IServiceCollection,并提供了基于 ...

  4. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  5. Laravel大型项目系列教程(二)之用户管理

    Laravel大型项目系列教程(二) 一.前言 本节教程将大概实现用户的注册.修改个人信息.管理用户功能. 二.Let's go 1.创建用户注册视图 $ php artisan generate:v ...

  6. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  7. Web.xml配置详解

    (转自:http://www.cnblogs.com/chinafine/archive/2010/09/02/1815980.html) 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必 ...

  8. 手机app软件开发有什么需要注意的细节?

    在做手机产品设计的过程中,遇到很多看似很小,且很容易被忽略的问题,正是这些手机应用软件开发小问题,一次次的撩拨用户的耐心,让用户对你的产品心生怨念.刚出道的朋友没有经过实战,对细节注意不多,往往都会遇 ...

  9. 使用串口线真机调试Linux内核

    一.环境 ubuntu 14.04 一台有串口的PC(编号PC1,被调试机器) 另一台PC通过USB转串口线连接PC1(编号PC2,发起调试命令的机器) 二.串口线配置及测试 安装cutecom US ...

  10. Docker初体验

    ## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...