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. VMware安装CentOS时,无法以图形界面安装解决办法

    有的同学问: 用虚拟机软件(vmware.VirtualBox)安装CentOS系统时, 安装过程中没有中文,也没有出现图形界面,都是以命令行方式去安装, 有时候又会出现图形界面,不知道哪里配置的问题 ...

  2. 怎样在asp中产生10个0-99的随机数

    <% randomize for i=1 to 10 response.write cint(rnd*100) next %> randomize是随机初始化,使用rnd之前必须要先来一句 ...

  3. Android 防止控件被重复点击

    转载: 工具类: public class Utils { private static long lastClickTime; public static boolean isFastDoubleC ...

  4. SDK接入(3)之iOS内支付(In-App Purchase)接入

    SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...

  5. iOS获取app图标和启动图片名字(AppIcon and LaunchImage's name)

    在某种场景下,可能我们需要获取app的图标名称和启动图片的名称.比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,需要用到icon名称:再比如在加载某个控制器 ...

  6. Android编码规范05

    编码逻辑规范总结: 1.避免使用多个类放在一个文件里,除非是一次性使用的内部类 2.一个方法代码长度最好不要超过35行 3.原则上尽量不要修改自动生成的文件,如R文件 4.Final String 取 ...

  7. C# dynamic 动态创建 json

    1. 如何通过C# 的dynamic 创建如下json 对象? { "query": { "match": [{ "name": " ...

  8. Node.js 教程 06 - 函数

    前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...

  9. PHP中的数据库二、memcache

    :first-child, ol li > :first-child, ul li ul:first-of-type, ol li ol:first-of-type, ul li ol:firs ...

  10. nginx 虚拟主机基于端口的搭建

    首先配置nginx.conf [root@localhost conf]# cat nginx.confworker_processes 1;user nginx nginx;error_log /a ...