给定一个多边形的三角剖分(n<=1e5),且每个三角形有其颜色,问最多可以把这个三角剖分分成几个联通的部分,使任何一种颜色不出现在多个连通块中

建出三角剖分对应的树,同种颜色的点之间的路径是不能被切开的,因此将同色的点间路径标记一下,未标记的边数即为答案

具体实现可以用树上差分进行标记,树链剖分lca,同色的点按dfs序排序并将排序后相邻的点间路径标记

  1. #include<cstdio>
  2. #include<algorithm>
  3. typedef long long i64;
  4. const int R=5e6,N=,P=;
  5. char buf[R],*ptr=buf-;
  6. int _(){
  7. int x=,c=*++ptr;
  8. while(c<)c=*++ptr;
  9. while(c>)x=x*+c-,c=*++ptr;
  10. return x;
  11. }
  12. long long hx[P];
  13. int hy[P];
  14. int n,ans=-;
  15. int e[N][],ep[N],col[N],cc[N],*cl[N],*cr[N],_c[N],*cp=_c,v[N];
  16. int fa[N],sz[N],son[N],dep[N],top[N],id[N],idp=;
  17. void chk(int a,int b,int id){
  18. if(a>b)std::swap(a,b);
  19. i64 h=i64(a)<<|b;
  20. int w=h%P;
  21. while(hy[w]){
  22. if(hx[w]==h){
  23. e[hy[w]][ep[hy[w]]++]=id;
  24. e[id][ep[id]++]=hy[w];
  25. return;
  26. }
  27. if((w+=)>=P)w-=P;
  28. }
  29. hx[w]=h;hy[w]=id;
  30. }
  31. void f1(int w,int pa){
  32. fa[w]=pa;
  33. dep[w]=dep[pa]+;
  34. sz[w]=;
  35. for(int i=;i<ep[w];++i){
  36. int u=e[w][i];
  37. if(u==pa)continue;
  38. f1(u,w);
  39. sz[w]+=sz[u];
  40. if(sz[son[w]]<sz[u])son[w]=u;
  41. }
  42. }
  43. void f2(int w,int tp){
  44. top[w]=tp;
  45. id[w]=++idp;
  46. if(son[w])f2(son[w],tp);
  47. for(int i=;i<ep[w];++i){
  48. int u=e[w][i];
  49. if(u==fa[w]||u==son[w])continue;
  50. f2(u,u);
  51. }
  52. }
  53. void f3(int w){
  54. for(int i=;i<ep[w];++i){
  55. int u=e[w][i];
  56. if(u==fa[w])continue;
  57. f3(u);
  58. v[w]+=v[u];
  59. }
  60. if(!v[w])++ans;
  61. }
  62. int lca(int x,int y){
  63. int a=top[x],b=top[y];
  64. while(a!=b){
  65. if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
  66. x=fa[a];a=top[x];
  67. }
  68. return dep[x]<dep[y]?x:y;
  69. }
  70. bool cmp(int a,int b){
  71. return id[a]<id[b];
  72. }
  73. int main(){
  74. fread(buf,,R,stdin);
  75. n=_()-;
  76. for(int i=;i<=n;++i){
  77. int a=_(),b=_(),c=_();
  78. chk(a,b,i);
  79. chk(a,c,i);
  80. chk(c,b,i);
  81. ++cc[col[i]=_()];
  82. }
  83. for(int i=;i<=n;++i)cl[i]=cr[i]=cp,cp+=cc[i];
  84. for(int i=;i<=n;++i)*(cr[col[i]]++)=i;
  85. f1(,);
  86. f2(,);
  87. for(int i=;i<=n;++i)if(cl[i]!=cr[i]){
  88. std::sort(cl[i],cr[i],cmp);
  89. for(int p=;p<cc[i];++p){
  90. int x=cl[i][p],y=cl[i][p-],z=lca(x,y);
  91. ++v[x];++v[y];v[z]-=;
  92. }
  93. }
  94. f3();
  95. printf("%d",ans);
  96. return ;
  97. }

bzoj1760 [Baltic2009]Triangulation的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Delaunay Triangulation in OpenCascade

    Delaunay Triangulation in OpenCascade eryar@163.com 摘要:本文简要介绍了Delaunay三角剖分的基础理论,并使用OpenCascade的三角剖分算 ...

  3. bzoj1355: [Baltic2009]Radio Transmission

    将原串看成是循环节的后缀加上若干个循环节,那么考虑每种情况都会发现n-next[n]就是最小循环节.(一开始总输出n...然后发现build_next连调用都没有,%%% #include<cs ...

  4. bzoj 1761: [Baltic2009]beetle 区间dp

    1761: [Baltic2009]beetle Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 255  Solved: 92[Submit][Statu ...

  5. BZOJ 1355: [Baltic2009]Radio Transmission( kmp )

    自己YY一下可以发现answer =  n - fail[ n ] ------------------------------------------------------------------ ...

  6. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

  7. OpenCASCADE BRepMesh - 2D Delaunay Triangulation

    OpenCASCADE BRepMesh - 2D Delaunay Triangulation eryar@163.com Abstract. OpenCASCADE package BRepMes ...

  8. BZOJ 1355: [Baltic2009]Radio Transmission [KMP 循环节]

    1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 792  Solved: 535 ...

  9. [Baltic2009]Radio Transmission

    bzoj 1355: [Baltic2009]Radio Transmission http://www.lydsy.com/JudgeOnline/problem.php?id=1355 Time ...

随机推荐

  1. JMS生产者+单线程发送-我们到底能走多远系列(29)

    我们到底能走多远系列(29) 扯淡: “然后我俩各自一端/望着大河弯弯/终于敢放胆/嘻皮笑脸/面对/人生的难”      --- <山丘> “迎着风/迎向远方的天空/路上也有艰难/也有那解 ...

  2. 获取元素高度及定位js

    <script type="text/javascript">                                   $(window).scroll(f ...

  3. mysql导入sql文件过大或连接超时的解决办法

    前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个神奇sql语句交给实施,只要导入出错就把如下语句执行就可以了.至今屡试不爽. 1 2 3 4 5 6 7 set global max ...

  4. 将Excel生成实体类

    package com.excel.test; import java.util.List; public class createUtil { public static String append ...

  5. Apache的虚拟主机配置

    使用虚拟主机要先取消中心主机,注释掉DocumentRoot #DocumentRoot "/www/htdoc" 虚拟主机的单独配置: 用户认证 访问日志 错误日志 别名 脚本别 ...

  6. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  7. [BeiJing2010组队][BZOJ 1977]次小生成树 Tree

    话说这个[BeiJing2010组队]是个什喵玩意? 这是一道严格次小生成树,而次小生成树的做法是层出不穷的 MATO IS NO.1 的博客里对两种算法都有很好的解释,值得拥有:  (果然除我以外, ...

  8. eclipse使用jetty插件出现内存溢出解决方案

    系统运行在MAVEN中的jetty插件下,当在ECLIPSE运 clean jetty:run时系统提示 OutOfMemoryError: PermGen space. 解决办法:设置run as ...

  9. caffe: train error: Serializing 25 layers--- Check failed: proto.SerializeToOstream(&output)

    I0221 21:47:41.826748  6797 solver.cpp:259]     Train net output #0: loss = 0.00413362 (* 1 = 0.0041 ...

  10. HTML5 拖放(Drag 和 Drop)

    拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. <!DOCTYPE HTML> <html> <hea ...