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

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

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

#include<cstdio>
#include<algorithm>
typedef long long i64;
const int R=5e6,N=,P=;
char buf[R],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
long long hx[P];
int hy[P];
int n,ans=-;
int e[N][],ep[N],col[N],cc[N],*cl[N],*cr[N],_c[N],*cp=_c,v[N];
int fa[N],sz[N],son[N],dep[N],top[N],id[N],idp=;
void chk(int a,int b,int id){
if(a>b)std::swap(a,b);
i64 h=i64(a)<<|b;
int w=h%P;
while(hy[w]){
if(hx[w]==h){
e[hy[w]][ep[hy[w]]++]=id;
e[id][ep[id]++]=hy[w];
return;
}
if((w+=)>=P)w-=P;
}
hx[w]=h;hy[w]=id;
}
void f1(int w,int pa){
fa[w]=pa;
dep[w]=dep[pa]+;
sz[w]=;
for(int i=;i<ep[w];++i){
int u=e[w][i];
if(u==pa)continue;
f1(u,w);
sz[w]+=sz[u];
if(sz[son[w]]<sz[u])son[w]=u;
}
}
void f2(int w,int tp){
top[w]=tp;
id[w]=++idp;
if(son[w])f2(son[w],tp);
for(int i=;i<ep[w];++i){
int u=e[w][i];
if(u==fa[w]||u==son[w])continue;
f2(u,u);
}
}
void f3(int w){
for(int i=;i<ep[w];++i){
int u=e[w][i];
if(u==fa[w])continue;
f3(u);
v[w]+=v[u];
}
if(!v[w])++ans;
}
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
x=fa[a];a=top[x];
}
return dep[x]<dep[y]?x:y;
}
bool cmp(int a,int b){
return id[a]<id[b];
}
int main(){
fread(buf,,R,stdin);
n=_()-;
for(int i=;i<=n;++i){
int a=_(),b=_(),c=_();
chk(a,b,i);
chk(a,c,i);
chk(c,b,i);
++cc[col[i]=_()];
}
for(int i=;i<=n;++i)cl[i]=cr[i]=cp,cp+=cc[i];
for(int i=;i<=n;++i)*(cr[col[i]]++)=i;
f1(,);
f2(,);
for(int i=;i<=n;++i)if(cl[i]!=cr[i]){
std::sort(cl[i],cr[i],cmp);
for(int p=;p<cc[i];++p){
int x=cl[i][p],y=cl[i][p-],z=lca(x,y);
++v[x];++v[y];v[z]-=;
}
}
f3();
printf("%d",ans);
return ;
}

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. 从Wordpress迁移到Jekyll

    http://pinkyjie.com/2013/10/24/migrate-from-wordpress-to-jekyll/ 上周末闲着没事干突然想把博客从Wordpress迁移到Github p ...

  2. MySQL复制的基本概念和实现

    MySQL的复制的概念是完成水平扩展的架构 MySQL性能方面的扩展方式有scale on(向上扩展,垂直扩展)                          scale out(向外扩展,水平扩 ...

  3. HDU 1061 Rightmost Digit --- 快速幂取模

    HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...

  4. CentOS搭建LNMP环境

    安装开发工具包: yum groupinstall -y "Development Tools*" 50多个,安装了好久…… 下载Nginx: http://nginx.org/e ...

  5. poj1502 最短路

    题意:有n个处理器,给出n*n的邻接矩阵的一半,表示相互之间传输信息的花费(另一半与给出的一半对称,即双向都可传输),x表示不能传输,问从第一个处理器传输到所有处理器的最小花费总和是多少. 就是跑一遍 ...

  6. android开源项目---blog篇

    本文转载于:http://blog.csdn.net/likebamboo/article/details/19081241 主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织.Follow大 ...

  7. display:none,overflow:hidden,visibility:hidden之间的区别

    一,display:none; 隐藏元素,不占网页中的任何空间,让这个元素彻底消失(看不见也摸不着) 二,overflow:hidden; 让超出的元素隐藏,就是在设置该属性的时候他会根据你设置的宽高 ...

  8. 29个要点帮你完成java代码优化

    通过java代码规范来优化程序,优化内存使用情况,防止内存泄露 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容 ...

  9. cookies的理解

    设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId=828"; 如果 ...

  10. Java实现一个字符串的反转

    Java小程序实现字符串的反转: 方法一: public class reverseString { public static void main(String[] args) { String s ...