题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716

怎么KD树跑得都那么快啊。。我写的CDQ分治被暴虐

做四遍CDQ分治,每次求一个左下角\(x_i+y_i\)的最大值

第一种写法是一开始按时间排序,然后CDQ分治的时候改成按\(x\)坐标排序,同时用树状数组统计每个\(y\)坐标的最大值

第二种写法是一开始按\(x\)坐标排序,然后CDQ分支的时候改成按时间排序

CDQ分治好神奇(琦)。。。

一定要注意树状数组如果没有元素不能返回0! 我这么写然后test1 WA on line 40W+...

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<algorithm>
using namespace std;const int N = 1e6;
const int C = 1e6+2;
struct Query
{int opt,x,y,id,ans;bool operator <(const Query &arg) const {return id<arg.id;}
} qr[N+3],qr2[N+3];
int tr[C+3];
int n,q,mx;void modify(int lrb,int val)
{while(lrb<=mx){tr[lrb] = max(tr[lrb],val);lrb += (lrb&(-lrb));}
}int querymax(int rb)
{int ret = -C*2;while(rb>0){ret = max(ret,tr[rb]);rb -= (rb&(-rb));}return ret;
}void clear(int lrb)
{while(lrb<=mx && tr[lrb]!=-C*2){tr[lrb] = -C*2;lrb += (lrb&(-lrb));}
}void cdqdc(int lb,int rb)
{if(lb==rb) return;int mid = (lb+rb)>>1;int j = lb,k = mid+1;for(int i=lb; i<=rb; i++){if(qr[i].id<=mid) {qr2[j] = qr[i]; j++;}else {qr2[k] = qr[i]; k++;}}for(int i=lb; i<=rb; i++) qr[i] = qr2[i];cdqdc(lb,mid);cdqdc(mid+1,rb);j = lb; k = mid+1;while(k<=rb){while(j<=mid && qr[j].opt==2) j++;while(k<=rb && qr[k].opt==1) k++;if(k>rb) break;while(j<=mid && qr[j].x<=qr[k].x){if(qr[j].opt==1) {modify(qr[j].y,qr[j].x+qr[j].y);}j++;}int tmp = querymax(qr[k].y);qr[k].ans = min(qr[k].ans,qr[k].x+qr[k].y-tmp);k++;}for(int i=lb; i<=mid; i++) {if(qr[i].opt==1) clear(qr[i].y);}j = lb; k = mid+1;for(int i=lb; i<=rb; i++){if(j>mid || (k<=rb && qr[k].x<qr[j].x)) {qr2[i] = qr[k]; k++;}else {qr2[i] = qr[j]; j++;}}for(int i=lb; i<=rb; i++) qr[i] = qr2[i];
}int main()
{scanf("%d%d",&n,&q);for(int i=1; i<=n; i++){scanf("%d%d",&qr[i].x,&qr[i].y); qr[i].opt = 1; qr[i].id = i; qr[i].x++; qr[i].y++; qr[i].ans = C*7;mx = max(mx,max(qr[i].x,qr[i].y));}for(int i=n+1; i<=n+q; i++){scanf("%d%d%d",&qr[i].opt,&qr[i].x,&qr[i].y,&qr[i].opt); qr[i].id = i; qr[i].x++; qr[i].y++; qr[i].ans = C*7;mx = max(mx,max(qr[i].x,qr[i].y));}q+=n;for(int i=0; i<=mx; i++) tr[i] = -C*2;cdqdc(1,q);sort(qr+1,qr+q+1);for(int i=1; i<=q; i++) {qr[i].x = mx+1-qr[i].x;}cdqdc(1,q);sort(qr+1,qr+q+1);for(int i=1; i<=q; i++) {qr[i].y = mx+1-qr[i].y;}cdqdc(1,q);sort(qr+1,qr+q+1);for(int i=1; i<=q; i++) {qr[i].x = mx+1-qr[i].x;}cdqdc(1,q);sort(qr+1,qr+q+1);for(int i=1; i<=q; i++){if(qr[i].opt==2) printf("%d\n",qr[i].ans);}return 0;
}

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

  1. BZOJ 2716: [Violet 3]天使玩偶 | CDQ分治

    题目: 南开OJ有非权限提交处 http://oi.nks.edu.cn/zh/Problem/Details/2739 题解: 鹅鹅鹅....有三维(t,x,y),所以可以用CDQ解决的好题 初始点 ...

  2. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  3. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  4. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 1473  Solved: 621 [Submit][Sta ...

  5. BZOJ 2716 Violet 3 天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 2145  Solved: 928 [Submit][Sta ...

  6. [cdq分治][树状数组] Bzoj P3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  7. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  8. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  9. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

最新文章

  1. Python开发【Part 4】:数据类型操作
  2. 2020-06-15 有理分式矩阵及其互质分解
  3. tomcat 绑定 ip 及域名,限制非法域名访问
  4. 去除inline-block元素间间距
  5. 小程序分类左右内容联动
  6. 使用ANT编译项目报错 com.sun.image.codec.jpeg does not exist 解决方法
  7. 品铂平板电脑刷linux,细说平板电脑刷机方法
  8. awr报告 解读_十步解析awr报告
  9. Java-KoTime:接口耗时监测与邮件通知接口耗时情况
  10. 超级学习者的6个习惯:快速深入地学习任何技能
  11. 微信消息收发与微信内部emoji表情转义
  12. 教师心理压力测试软件,关注教师心理健康——教师版心理测评软件
  13. 2020-04-12
  14. 陀螺年度好文回顾|区块链跨链互操性的意义和应用案例
  15. 神器必会!“世界上最好的编辑器Source Insight”
  16. 微信小程序点击换头像-图片从本地获取-tab选项卡-点击按钮出弹框
  17. 视频剪辑PR各种版本
  18. 游戏行业如何进入元宇宙?
  19. PMP考试费用是多少呢?
  20. 生活娱乐 屌丝的24个特征手绘版

热门文章

  1. 台湾大学林轩田机器学习基石课程学习笔记2 -- Learning to Answer Yes/No
  2. 拖动窗体的任意区域移动窗体
  3. Delphi笔记整理(二)
  4. 项目开发中的注意事项
  5. 使用TWebBrowser组件保存网页为html和mht文件 收藏
  6. Beej网络编程指南《三》
  7. BUUCTF-Reverse:[GKCTF2020]Check_1n
  8. 硬盘和显卡的访问与控制(三)(含多彩的Hello)——《x86汇编语言:从实模式到保护模式》读书笔记03
  9. 【vsftpd】嵌入式linux简易配置vsftpd服务
  10. 区块链技术 好文收藏