CDQ分治2

CDQ套CDQ:四维偏序问题

题目来源:COGS 2479 偏序

#define LEFT 0
#define RIGHT 1struct Node{int a,b,c,d,bg;};
Node q[_],tmp1[_],tmp2[_];  int aa,bb,cc,dd,n; long long Ans;void cdq2(RG int L,RG int R){if(L == R)return;RG int mid = (L+R)>>1; cdq2(L,mid); cdq2(mid+1,R);RG int oo = L , l = L , r = mid + 1;while(l <= mid && r <= R){if(tmp1[l].c < tmp1[r].c){if(tmp1[l].bg == LEFT)BIT:: Update(tmp1[l].d);tmp2[oo++] = tmp1[l++];}else {if(tmp1[r].bg == RIGHT)Ans += BIT::Query(tmp1[r].d);tmp2[oo++] = tmp1[r++];}}while(l <= mid)tmp2[oo++] = tmp1[l++];while(r <= R){if(tmp1[r].bg == RIGHT)Ans += BIT::Query(tmp1[r].d) ;tmp2[oo++] = tmp1[r++];}for(RG int i = L; i <= R; i ++){if(tmp2[i].bg == LEFT)BIT::Clear(tmp2[i].d);tmp1[i] = tmp2[i];}return;
}void cdq1(int L,int R){if(L == R)return;RG int mid = (L+R)>>1; cdq1(L,mid);  cdq1(mid+1,R);RG int oo = L , l = L ,r = mid + 1;while(l <= mid && r <= R){if(q[l].b < q[r].b)q[l].bg = LEFT ,tmp1[oo++] = q[l++] ;else q[r].bg = RIGHT , tmp1[oo++] = q[r++] ;}while(l <= mid)q[l].bg = LEFT , tmp1[oo++] = q[l++];while(r <= R)q[r].bg = RIGHT , tmp1[oo++] = q[r++];for(RG int i = L; i <= R; i ++)q[i] = tmp1[i];cdq2(L,R);
}int main(){freopen("partial_order.in","r",stdin);freopen("partial_order.out","w",stdout);n = gi();for(RG int i = 1; i <= n; i ++)q[i].a = i; for(RG int i = 1; i <= n; i ++)q[i].b = gi(); for(RG int i = 1; i <= n; i ++)q[i].c = gi(); for(RG int i = 1; i <= n; i ++)q[i].d = gi(); Ans = 0; cdq1(1,n);cout<<Ans;  return 0;
}

CDQ套CDQ套CDQ:五维偏序问题

题目来源:COGS 2580 偏序 \(II\)

#define LEFT 0
#define RIGHT 1struct Node{int d1,d2,d3,d4,d5,bg[2];};
Node q[_] , tmp1[_] , tmp2[_] , tmp3[_];  int n; long long ans;IL bool Check(RG int id,RG int opt)
{return tmp2[id].bg[0]==opt && tmp2[id].bg[1]==opt;}void cdq3(RG int L,RG int R){      //cdq分治解决三维偏序问题 if(L == R)return;RG int mid = (L+R)>>1; cdq3(L,mid); cdq3(mid+1,R);RG int l = L , r = mid+1 , oo = L-1;while(l <= mid && r <= R){if(tmp2[l].d4 < tmp2[r].d4){if(Check(l,LEFT))BIT::Update(tmp2[l].d5);tmp3[++oo] = tmp2[l++];}else{if(Check(r,RIGHT))ans += BIT::Query(tmp2[r].d5);tmp3[++oo] = tmp2[r++];}}while(l <= mid)tmp3[++oo] = tmp2[l++];while(r <= R){if(Check(r,RIGHT))ans += BIT::Query(tmp2[r].d5);tmp3[++oo] = tmp2[r++];}for(RG int i = L; i <= R; i ++){if(Check(i,LEFT))BIT::Clear(tmp2[i].d5);tmp2[i] = tmp3[i];}return;}void cdq2(RG int L,RG int R){       //消去第三维的影响 if(L == R)return;RG int mid = (L+R)>>1; cdq2(L,mid); cdq2(mid+1,R);RG int l = L , r = mid+1 , oo = L-1;while(l <= mid && r <= R){if(tmp1[l].d3 < tmp1[r].d3)tmp1[l].bg[1] = LEFT , tmp2[++oo] = tmp1[l++];elsetmp1[r].bg[1] = RIGHT , tmp2[++oo] = tmp1[r++];}while(l <= mid)tmp1[l].bg[1] = LEFT , tmp2[++oo] = tmp1[l++];while(r <= R)tmp1[r].bg[1] = RIGHT , tmp2[++oo] = tmp1[r++];for(RG int i = L; i <= R; i ++)tmp1[i] = tmp2[i];cdq3(L,R); }void cdq1(RG int L,RG int R){         //消去第二维的影响 if(L == R)return;RG int mid = (L+R)>>1; cdq1(L,mid); cdq1(mid+1,R);RG int l = L , r = mid+1 , oo = L-1;while(l <= mid && r <= R){if(q[l].d2 < q[r].d2)q[l].bg[0] = LEFT , tmp1[++oo] = q[l++];else q[r].bg[0] = RIGHT , tmp1[++oo] = q[r++];} while(l<=mid)q[l].bg[0] = LEFT , tmp1[++oo] = q[l++];while(r<=R)q[r].bg[0] = RIGHT , tmp1[++oo] = q[r++];for(RG int i = L; i <= R; i ++)q[i] = tmp1[i];      cdq2(L,R);
}int main(){freopen("partial_order_two.in","r",stdin);freopen("partial_order_two.out","w",stdout);n = gi();for(RG int i = 1; i <= n; i ++)q[i].d1 = i;for(RG int i = 1; i <= n; i ++)q[i].d2 = gi();for(RG int i = 1; i <= n; i ++)q[i].d3 = gi();for(RG int i = 1; i <= n; i ++)q[i].d4 = gi();for(RG int i = 1; i <= n; i ++)q[i].d5 = gi();//sort_a  消去第一维的影响 ans = 0; cdq1(1,n);cout << ans;  return 0;
}

转载于:https://www.cnblogs.com/Guess2/p/8370972.html

CDQ分治嵌套模板:多维偏序问题相关推荐

  1. CDQ 分治算法模板

    CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...

  2. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  3. CDQ分治学习及例题总结

    文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...

  4. P3810 【模板】三维偏序(陌上花开)

    P3810 [模板]三维偏序(陌上花开) cdq分治的模板题目,用cdq分治处理点对的问题,首先按照第一维排序,然后分治,这样就可以每次考虑二三维即可,然后就可以利用树状数组求解了,然后一个核心的代码 ...

  5. 学习笔记——CDQ分治

    再次感谢这位大佬的博客:https://www.cnblogs.com/ljc20020730/p/10395866.html CDQ分治,是一种在分治合并中计算前面值对后面答案的贡献的一种算法.今天 ...

  6. Bzoj 2683: 简单题(CDQ分治)

    2683: 简单题 Time Limit: 50 Sec Memory Limit: 20M. Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两 ...

  7. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

  8. HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)

    题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...

  9. 【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

    题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​,从 (1,1)(1,1)(1,1) ...

最新文章

  1. 万能 Transformer,你应该知道的一切
  2. 运维和开发慌了,Redis突然 慢 了,到底谁背锅?
  3. (推荐)叮当——中文语音对话机器人
  4. 2018全球大学AI排名:清华位列亚洲大学综合排名首位
  5. json 反序列化 父子类型_json类序列化与反序列化参考
  6. Python 面向对象封装和继承
  7. java多态替换switch_第1章 重构,第一个案例(3):运用多态取代switch
  8. 一个程序员的一些想法(一)
  9. C语言位域(位段)详解
  10. 浅谈软件开发过程及项目管理
  11. 多线程的创建方式之实现Callable接口
  12. vscode开发环境
  13. MySQL之流程控制
  14. Mac和PC在工作中管理的对比(5)
  15. 13.卷1(套接字联网API)---守护进程和 inetd 超级服务器
  16. FX2N-2DA模拟量输出模块简述
  17. 智能电视软件安装(WIFI上网)
  18. 统计学中p值计算公式_P值计算公式
  19. input限制输入经纬度和java后台验证经纬度
  20. 2021-09-21用pyecharts做全球各个国家的gdp色彩深度图

热门文章

  1. Redis的安装部署
  2. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto
  3. Testin云测试:QQ(4.2.0)安卓版客户端可用性优秀
  4. WebService安全 身份验证与访问控制
  5. DataList编辑、更新、取消、删除、分页(分页控件 AspNetPager.dll)
  6. 开发WAP站点之---使用PC电脑浏览器访问WAP手机站点 (转)
  7. html onclick的方法里用js的变量
  8. 17、Spring Boot普通类调用bean【从零开始学Spring Boot】
  9. 一张图系列——为什么在DllMain里面创建了线程并Wait会卡死
  10. ThinkPHP分页实例