题目:

Description

Input

Output

HINT

题解:

学了cdq后近期最后一道题···然而tm还是搞了1个半小时才tm搞出来······

先说思路:对于绝对值,我们采取类似于旋转整个图的方法,也就是说共计三次翻转再加上原来的图,每次旋转90度,算出点在旋转后的对应坐标(具体看代码中的注释部分),然后对于一个询问,每次只算它左上角的点的贡献,这样就有一个三维偏序:<时间,x,y>,时间已经在开始就默认排好了,由于此时dis=x-x1+y-y1=x+y-x1-y1,所以对于一个<时间,x,y>,我们要计算的是所有x1<x,y1<y,时间1<时间的点中x1+y1最大的点,这样dis就能最小;分析完基本思路后,接下来就是cdq的基本套路了,x1+y1用树状数组维护

但这道题让我发现了自己的许多细节错误,详细见代码注释

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=2e6+;
const int M=5e5+;
struct node
{
int x,y,id,pos;
}a[N],q[N],tmp[N];
int n,m,tot,maxx,maxy,ans[M],cnt=,tree[N],tag[N],tim;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
bool comp(node a,node b)
{
if(a.x==b.x) return a.id<b.id; //!!!!!注意一定要有这一点,x相同时一定要按时间排序!!
else return a.x<b.x;
}
inline void insert(int u,int v)
{
for(int i=u;i<=maxy;i+=(i&(-i)))
if(tag[i]!=tim) tag[i]=tim,tree[i]=v;
else tree[i]=max(tree[i],v);
}
inline int query(int u)
{
int temp=;
for(int i=u;i;i-=(i&(-i)))
if(tag[i]!=tim) continue;
else temp=max(temp,tree[i]);
return temp==?-1e+:temp; //注意这里!!!
}
inline void solve(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;
solve(l,mid),solve(mid+,r);
int i=l,j=mid+,k=l;tim++;
while(i<=mid&&j<=r)
{
if(comp(q[i],q[j]))
{
if(!q[i].pos) insert(q[i].y,q[i].x+q[i].y);
tmp[k++]=q[i++];
}
else
{
if(q[j].pos) ans[q[j].pos]=min(ans[q[j].pos],q[j].x+q[j].y-query(q[j].y));
tmp[k++]=q[j++];
}
}
while(i<=mid) tmp[k++]=q[i++];
while(j<=r)
{
if(q[j].pos) ans[q[j].pos]=min(ans[q[j].pos],q[j].x+q[j].y-query(q[j].y));
tmp[k++]=q[j++];
}
for(j=l;j<=r;j++) q[j]=tmp[j];
}
int main()
{
//freopen("a.in","r",stdin);
n=R();m=R();int x,y,t;
for(int i=;i<=n;i++)
{
x=R()+,y=R()+;
a[++tot].id=i,a[tot].x=x,a[tot].y=y;
maxx=max(maxx,x),maxy=max(maxy,y);
}
for(int i=;i<=m;i++)
{
t=R(),x=R()+,y=R()+;
if(t==)
a[++tot].id=tot,a[tot].x=x,a[tot].y=y;
else
a[++tot].id=tot,a[tot].x=x,a[tot].y=y,a[tot].pos=++cnt;
maxx=max(maxx,x),maxy=max(maxy,y);
}
maxx++,maxy++;
for(int i=;i<=cnt;i++) ans[i]=1e+;
for(int i=;i<=tot;i++) q[i]=a[i]; //第一次,不用翻转
solve(,tot);
for(int i=;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x; //第一次翻转 (不一定是90度,把所有情况讨论了就行)
solve(,tot);
for(int i=;i<=tot;i++) q[i]=a[i],q[i].y=maxy-a[i].y; //第二次翻转
solve(,tot);
for(int i=;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x,q[i].y=maxy-a[i].y; //第三次翻转
solve(,tot);
for(int i=;i<=cnt;i++) printf("%d\n",ans[i]);
return ;
}

刷题总结——天使玩偶(bzoj2716)的更多相关文章

  1. [BZOJ2716]天使玩偶

    [BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...

  2. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

  3. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  4. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  5. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

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

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

  7. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  8. CH4701 天使玩偶

    题意 4701 天使玩偶 0x40「数据结构进阶」例题 描述 题目PDF 样例输入 2 3 1 1 2 3 2 1 2 1 3 3 2 4 2 样例输出 1 2 来源 石家庄二中Violet 3杯省选 ...

  9. SJY摆棋子&&[Violet 3]天使玩偶

    SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 [Violet 3]天使玩偶 https://www.lydsy.com/Ju ...

随机推荐

  1. python中os.listdir( )函数读取文件夹

    编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...

  2. 百度site网址显示完整站点信息的分析

    去年赛花红就发现百度site本博客网址,仅出现找到相关结果数约多少个,数字为估算值,网站管理员如需了解更准确的索引量,请使用百度站长平台等字样.但赛花红又发现有的网站却显示着完整的站点信息,当时以为是 ...

  3. ping请求超(iPV4)

    ping请求超(iPV4) arp –a(查看局域网全部IP) cmd 管理员运行 netsh winsock reset(重置Winsock目录借以恢复网络) etsh int ip reset r ...

  4. mysql 速度检索

    授权GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'127.0.0.1' IDENTIFIED BY 'zabbixpwd' WITH GRANT OPTI ...

  5. ctrl+shift+f

    ctrl+f是在当前文件寻找某个参数 ctrl+shift+f是在整个工程目录下寻找某个参数

  6. TDB文件介绍

    samba在运行时,Samba 存储许多信息,从本地密码到希望从中收到信息的一系列客户端.这类数据其中一些是暂时的,在 Samba 重启时可能会被丢弃,但是另一些却是永久的,不会被丢弃.这类数据可能是 ...

  7. JQuery EasyUI学习记录(五)

    1.datagrid使用方法(重要) 1.1将静态html渲染为datagrid样式 <!--方式一: 将静态html渲染为datagrid样式 --> <table class=& ...

  8. c++ 指针数组,输入4个季度的花费,计算出总花费

    #include <iostream> #include <array> #include <string> const int Seasons = 4; cons ...

  9. Postgres-XL的限制

    Postgres-XL是基于PostgreSQL的一个分布式数据库. 相比于PostgreSQL,XL的表的数据是可以分布到不同的datanode上的,对存在于不同的datanode上的数据进行处理, ...

  10. 【动态规划】bzoj1939: [Croatian2010] Zuma

    隐约记得类似的一道JSOI祖玛……然后好像这题不能够把珠子合并成一段?或许是因为这里珠子碰在一起之后可以不消除? Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 K 个 ...