题目链接:P7470 [NOI Online 2021 提高组] 岛屿探险
以前都没有真正把cdqcdqcdq搞懂过,趁这次比赛花时间学了一下

SolutionSolutionSolution

对于min{d}≤min{b}min\{d\}\le min\{ b\}min{d}≤min{b},即a⊕c≤da\oplus c\le da⊕c≤d
先把询问拆成[1,l−1][1,l-1][1,l−1]和[1,r][1,r][1,r],然后离线将询问排序,用一棵01trie01trie01trie树就能贪心的求出

对于min{b}≤min{d}min\{b\}\le min\{ d\}min{b}≤min{d},即a⊕c≤ba\oplus c\le ba⊕c≤b
限制中有a,ba,ba,b,很难同时处理,但如果把a,ba,ba,b看成询问,只有ccc一个限制,就能套用min{d}≤min{b}min\{d\}\le min\{ b\}min{d}≤min{b}的做法了,每次将a,ba,ba,b插入01trie01trie01trie时,都将能够影响到的ccc集合打上标记,查询ccc时,查找根到该点的路径的标记和即可

由于我们既要满足b,db,db,d的大小限制,又要满足下标的前后关系,无法只用一次排序解决,这个时候就到cdqcdqcdq出场了
先将查询和修改放到一起按下标从小到大排序(按b,db,db,d大小排序也行),考虑处理[l,r][l,r][l,r]区间的问题,若已处理好[l,mid][l,mid][l,mid]和[mid+1,r][mid+1,r][mid+1,r]的情况,只需处理[l,mid][l,mid][l,mid]修改对[mid+1,r][mid+1,r][mid+1,r]询问的影响,提前将[l,mid][l,mid][l,mid]修改和[mid+1,r][mid+1,r][mid+1,r]询问按b,db,db,d从小到大排序,套用上面两个做法即可,在本题中使用快排并不影响时间复杂度,但可以直接使用归并排序,时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)

#include<cstdio>
#include<algorithm>
#define re register
using namespace std;
void read(int &res)
{res=0;int x=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') x=-x;ch=getchar();}while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar();res*=x;
}
const int N=2e5+100;
int n,q,tot,lc,rc;
struct node
{int type,pos,x,y,k;
}a[N<<1|1],L[N<<1|1],R[N<<1|1],h[N<<1|1];
bool cmp(node a,node b)
{return a.pos<b.pos||(a.pos==b.pos&&a.type<b.type);
}
int cnt;
struct SEG
{int ls,rs,sum;
}t[N*31+10];
//d<=b
int rt1;
void ins(int &p,int x,int len,int k)
{if(!p) p=++cnt;t[p].sum+=k;if(len<0) return;if(x&(1<<len)) ins(t[p].rs,x,len-1,k);else ins(t[p].ls,x,len-1,k);
}
int query(int p,int c,int d,int len)
{if(len<0) return t[p].sum;if(d&(1<<len)){if(c&(1<<len)) return query(t[p].ls,c,d,len-1)+t[t[p].rs].sum;else return query(t[p].rs,c,d,len-1)+t[t[p].ls].sum;}else{if(c&(1<<len)) return query(t[p].rs,c,d,len-1);else return query(t[p].ls,c,d,len-1);}
}
//b<d
int rt2;
void change(int &p,int a,int b,int len,int k)
{if(!p) p=++cnt;
//  printf("fucu %d %d %d %d\n",p,a,b,len);if(len<0){t[p].sum+=k; return;} if(b&(1<<len)){if(a&(1<<len)){if(!t[p].rs) t[p].rs=++cnt;t[t[p].rs].sum+=k;change(t[p].ls,a,b,len-1,k);}else   {if(!t[p].ls) t[p].ls=++cnt;t[t[p].ls].sum+=k;change(t[p].rs,a,b,len-1,k);}}else{if(a&(1<<len)) change(t[p].rs,a,b,len-1,k);else change(t[p].ls,a,b,len-1,k);}
}
int get(int p,int x,int len)
{//  printf("fuc %d %d %d %d\n",p,x,len,t[p].sum);if(len<0) return t[p].sum;if(x&(1<<len)) return get(t[p].rs,x,len-1)+t[p].sum;else return get(t[p].ls,x,len-1)+t[p].sum;
}
int ans[N+10];
void cdq(int l,int r)
{if(l==r) return;re int mid=l+r>>1,i,j,k;cdq(l,mid),cdq(mid+1,r);lc=rc=0;for(i=l;i<=mid;i++) if(a[i].type==0) L[++lc]=a[i];for(i=mid+1;i<=r;i++) if(a[i].type!=0) R[++rc]=a[i];for(i=lc,j=rc;j>=1;j--){while(i>=1&&L[i].y>R[j].y) ins(rt1,L[i].x,24,1),i--;ans[R[j].type]+=query(rt1,R[j].x,R[j].y,24)*R[j].k;}for(i++;i<=lc;i++) ins(rt1,L[i].x,24,-1);for(i=1,j=1;j<=rc;j++){while(i<=lc&&L[i].y<=R[j].y) change(rt2,L[i].x,L[i].y,24,1),i++;ans[R[j].type]+=get(rt2,R[j].x,24)*R[j].k;
//      if(l==4&&r==6) printf("fuck %d\n",get(rt2,R[j].y,24));}for(i--;i>=1;i--) change(rt2,L[i].x,L[i].y,24,-1);for(i=l,j=mid+1,k=l;i<=mid&&j<=r;){if(a[i].y<a[j].y) h[k++]=a[i++];else h[k++]=a[j++];}for(;i<=mid;i++) h[k++]=a[i];for(;j<=r;j++) h[k++]=a[j];for(i=l;i<=r;i++) a[i]=h[i];
//  printf("l %d r %d\n",l,r);
//  for(int i=l;i<=r;i++)
//      printf("node %d %d %d %d\n",a[i].type,a[i].pos,a[i].x,a[i].y);
//  printf("ans %d\n",ans[1]);
}
int main()
{read(n),read(q);for(int i=1;i<=n;i++)read(a[++tot].x),read(a[tot].y),a[tot].type=0,a[tot].pos=i;for(int i=1,l,r,c,d;i<=q;i++){read(l),read(r),read(c),read(d);a[++tot].type=i,a[tot].pos=l-1,a[tot].x=c,a[tot].y=d,a[tot].k=-1,a[++tot].type=i,a[tot].pos=r,a[tot].x=c,a[tot].y=d,a[tot].k=1;} sort(a+1,a+1+tot,cmp),cdq(1,tot);for(int i=1;i<=q;i++) printf("%d\n",ans[i]);return 0;
}

P7470 [NOI Online 2021 提高组] 岛屿探险相关推荐

  1. P7470-[NOI Online 2021 提高组]岛屿探险【Trie,CDQ分治】

    正题 题目链接:https://www.luogu.com.cn/problem/P7470 题目大意 给出nnn个二元组(a,b)(a,b)(a,b). qqq次询问给出(l,r,c,d)(l,r, ...

  2. 【寒假每日一题】洛谷 P7471 [NOI Online 2021 入门组] 切蛋糕

    题目链接:P7471 [NOI Online 2021 入门组] 切蛋糕 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 Alice.Bob 和 Cindy 三个好朋友得到 ...

  3. NOI Online #2 提高组 第一题:涂色游戏

    NOI Online #2 提高组 第一题:涂色游戏 前言 题目 解析 代码 前言 呦呵,这道题我竟然爆零了 而且我的暴力dfs死循环了!\bold{\Large\xcancel\text{而且我的暴 ...

  4. NOIP1998-2018 CSP-S2 2019 2021提高组解题报告与视频

    CSP-S 2020 讲题录屏 CSP-S 2020 讲题录屏_哔哩哔哩_bilibili 冠军说题--ACM世界冠军吴卓杰,带你复盘2020 CSP-S2 冠军说题--ACM世界冠军吴卓杰,带你复盘 ...

  5. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

    problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi​. 如果到 iii 时,栈顶已经为 pip_ipi​ ...

  6. 吃豆人(luogu 7472/NOI Online 2021 普及组 T2)

    正题 luogu 7472 题目大意 给出一个正方形点阵,让你选择两个点,分别向两个方向移动(必须是45度),每到一个点就得到该点的贡献(不重复得),遇到墙壁反射,问你最大贡献 解题思路 不难发现,从 ...

  7. 【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)

    正题 luogu 7473 题目大意 给出一个正方形区域,中间有一些障碍 现在有两个球,每次操作可以使两个球同时向一个方向移动,直到遇到障碍或边界 现在问你让两个球到同一个位置最少要多少步 解题思路 ...

  8. 题解 P6476 【[NOI Online #2 提高组]涂色游戏】

    你有 102010^{20}1020 个格子,它们从 00 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色: 编号是 p1p_1p1​ 倍数的格子(包括 00 号格子,下同)染成红色. ...

  9. luogu P6476 [NOI Online 2 提高组]涂色游戏color

    题面传送门 考虑一下,其实只要管一个两个倍数点到另一个两个倍数点就好了. 设p1<p2p_1<p_2p1​<p2​ 贪心一下,发现两个倍数点都赋值p2p_2p2​就是最优的. 对于任 ...

最新文章

  1. 30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
  2. Intel Realsense D435 官方推荐有源USB线(有源电缆 cable)
  3. JavaScript基础知识(Date 的方法)
  4. 计算机策划知识竞赛有创意的主题,【社团活动】首届创意·科技文化节--第八届计算机趣味知识竞赛决赛...
  5. linux安装jdk(以1.6为例)
  6. Linux中的中断管理机制
  7. python程序设计基础教程慕课版课后题答案_Python语言程序设计基础
  8. 学生DW静态网页设计 红色中国文化主题网站设计 ——美丽中国1页HTML+CSS
  9. Echar的学习记录
  10. 软件工程 | 第三章 需求分析
  11. 急需“五彩连珠”小游戏的代码
  12. 手机java应用安装失败_解决OPPO手机在Android studio 环境下安装失败问题
  13. deepin20.6设置默认的root密码
  14. Vant 商品规格sku用法
  15. 使用Vue实现todos(Vue CLI和VueX)
  16. 2021年R1快开门式压力容器操作考试报名及R1快开门式压力容器操作考试试题
  17. 车辆识别系统消息服务器异常,原来这样能处理好停车场车牌识别道闸一体机异常问题...
  18. SePiCo: Semantic-Guided Pixel Contrast for Domain Adaptive Semantic Segmentation
  19. java单链表快慢指针
  20. 搜狗输入法 linux版本好用,【2345好压和搜狗输入法 For Linux哪个好用】2345好压和搜狗输入法 For Linux对比-ZOL下载...

热门文章

  1. Google 应用与游戏出海 11 月刊: 领取您的节假季突围攻略
  2. MATLAB中inv、plot、max、round函数的功能与用法
  3. Matlab:实现Fra单缝衍射仿真
  4. ios layer的一些学习
  5. 一加X 手机变砖过程
  6. Android手机录屏并制作Gif
  7. Java多线程异常抛出后的表现及捕获
  8. Linux根文件系统(rootfs原理详解)
  9. 不借助第三方变量交换两个变量的值(多种方法)
  10. 数据挖掘概念汇总及数据预处理