正题

题目链接:https://www.luogu.com.cn/problem/P7470


题目大意

给出nnn个二元组(a,b)(a,b)(a,b)。

qqq次询问给出(l,r,c,d)(l,r,c,d)(l,r,c,d)表示询问[l,r][l,r][l,r]中有多少二元组满足cxora≤min(b,d)c\ xor\ a\leq min(b,d)c xor a≤min(b,d)。

1≤n,q≤1051\leq n,q\leq 10^51≤n,q≤105


解题思路

这个minminmin一看就很迷,显然是让我们分两种情况讨论。

再把询问拆一下,就变成了两个条件pos≤r/pos<lpos\leq r/pos<lpos≤r/pos<l且b≤d/b>db\leq d/b>db≤d/b>d。

两个偏序条件的话直接上CDQCDQCDQ,然后考虑两种情况怎么处理。

  • cxora≤bc\ xor\ a\leq bc xor a≤b:这样对于每个二元组合法的ccc开业被拆成TrieTrieTrie上最多logloglog个区间,建TrieTrieTrie即可
  • cxora≤dc\ xor\ a\leq dc xor a≤d:对于每组询问在TrieTrieTrie上跑区间求和即可。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10,M=N*24;
struct node{int w,l,id;
}q[N<<1],a[N];
int n,m,tot,rt1,rt2,ans[N];
vector<node> v[N];
struct Trie1{int cnt,ch[M][2],w[M]; void Clear(){rt1=0;cnt=0;return;}int Newp(){++cnt;ch[cnt][0]=ch[cnt][1]=w[cnt]=0;return cnt;}void Insert(int &x,int d,int l,int val){if(!x)x=Newp();if(d<0){w[x]++;return;}int c=(val>>d)&1;if((l>>d)&1){Insert(ch[x][c^1],d-1,l,val);if(!ch[x][c])ch[x][c]=Newp();w[ch[x][c]]++; }else Insert(ch[x][c],d-1,l,val);}int Ask(int x,int d,int val){if(!x)return 0;if(d<0)return w[x];int c=(val>>d)&1;return Ask(ch[x][c],d-1,val)+w[x];}
}T1;
struct Trie2{int cnt,ch[M][2],w[M];void Clear(){rt2=0;cnt=0;return;}int Newp(){++cnt;ch[cnt][0]=ch[cnt][1]=w[cnt]=0;return cnt;}void Insert(int &x,int d,int val){if(!x)x=Newp();if(d<0){w[x]++;return;}int c=(val>>d)&1;Insert(ch[x][c],d-1,val);w[x]=w[ch[x][0]]+w[ch[x][1]];return;}int Ask(int x,int d,int l,int val){if(d<0)return w[x];int c=(val>>d)&1;if((l>>d)&1)return Ask(ch[x][c^1],d-1,l,val)+w[ch[x][c]];return Ask(ch[x][c],d-1,l,val);}
}T2;
bool cmp(node x,node y)
{return x.l<y.l;}
void CDQ(int l,int r){if(l==r)return;int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid+1,r);sort(a+l,a+mid+1,cmp);T1.Clear();T2.Clear();tot=0;for(int i=mid+1;i<=r;i++)for(int j=0;j<v[i].size();j++)q[++tot]=v[i][j];sort(q+1,q+1+tot,cmp);for(int i=1,z=l;i<=tot;i++){while(z<=mid&&a[z].l<=q[i].l)T1.Insert(rt1,23,a[z].l,a[z].w),z++;if(q[i].id<0)ans[-q[i].id]-=T1.Ask(rt1,23,q[i].w);else ans[q[i].id]+=T1.Ask(rt1,23,q[i].w);}for(int i=tot,z=mid;i>=1;i--){while(z>=l&&a[z].l>q[i].l)T2.Insert(rt2,23,a[z].w),z--;if(q[i].id<0)ans[-q[i].id]-=T2.Ask(rt2,23,q[i].l,q[i].w);else ans[q[i].id]+=T2.Ask(rt2,23,q[i].l,q[i].w);}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].w,&a[i].l);for(int i=1;i<=m;i++){int l,r,c,d;scanf("%d%d%d%d",&l,&r,&c,&d);v[l].push_back((node){c,d,-i});v[r+1].push_back((node){c,d,i});}sort(q+1,q+1+n,cmp);CDQ(1,n+1);for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

P7470-[NOI Online 2021 提高组]岛屿探险【Trie,CDQ分治】相关推荐

  1. P7470 [NOI Online 2021 提高组] 岛屿探险

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

  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. win10虚拟内存怎么设置最好_win10系统两台电脑直连怎么设置
  2. nginx mysql占用率高_nginx/mysql查看内存占用
  3. 【转】Hibernate数据过滤
  4. 改造一下jeecg中的部门树
  5. php7 str split,PHP7.4新特性预览
  6. unity3d collider自动调整大小_3dmax室内模型导入Unity3d快速烘焙光照【2020】
  7. JSP中meta http-equiv=pragma content=no-cache属性ttp-equiv功能介绍转载
  8. es6 async函数与其他异步处理方法的比较
  9. 第二冲刺阶段绩效评估
  10. 昂达v819i安卓bios
  11. SecureCRT Home End键
  12. Civil 3d-快速转换C3D图形为CAD图形
  13. js 不用onload的loding
  14. 在python终端中打印颜色的3中方式(python3经典编程案例)
  15. 康熙不愧大帝——且看他是怎样交班的
  16. SSM框架之数据分页,模糊查询
  17. ubuntu下发送邮件到外部邮箱
  18. ChatGPT大规模封锁亚洲地区账号
  19. 126企业邮箱smtp服务器设置,网易企业邮箱新增超级邮件列表等功能
  20. java判断字符个数_使用Java判断字符串中的中文字符数量

热门文章

  1. Excel基础(二):Excel公式函数
  2. Android 最新状态栏处理
  3. python生成试卷制卷系统_Python如何自动生成考试试卷?
  4. 回顾 微信小程序template模板的使用 循环 赋值 点击事件
  5. 《编程之禅》序(转载)
  6. win10任务管理器快捷键_Win10全新任务管理器上线:专为PC游戏优化
  7. 最全计算机综合试题,计算机综合试题.doc
  8. Kyligence at Microsoft Build,助力世界非凡洞见
  9. 已开发多款原型,或明年发布新品,三星XR专利布局大揭秘
  10. Oracle RMAN备份和异机恢复