给定一个多边形的三角剖分(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. (基础篇)PHP字符串函数

    1查找字符位置函数:   strpos($str,search,[int]):查找search在$str中的第一次位置从int开始: stripos($str,search,[int]):函数返回字符 ...

  2. js部分---类型,变量;

    <script type="text/javascript">1.注释:用“//或者/**/”2.数据类型: (1)整型 int (2)小数类型 单精度float 双精 ...

  3. JavaScript学习记录总结(七)——dom对象应用之用户简单管理

    <!DOCTYPE html><html><head><title>users.html</title> <meta name=&qu ...

  4. zf2 中 new Express 的用法

    在使用联表查询时,如查联表条件有多个也可以,但是连接条件在zf2中会自动给列加``符号,所以要加像id = 1 这样的,他自动给1加``就无示执行了,这时候可以使用new Express(''),他里 ...

  5. Android Studio + gradle多渠道打包

    通过工具栏的Build->Build Apk 好像只能打包第一个Module(eclipse里面是Project的概念),怎么多渠道打包呢?目前好像只能一个一个的打 首先在清单文件里设置个变量: ...

  6. 浅谈 Active Learning

    1. Active Query Driven by Uncertainty and Diversity for Incremental Multi-Label Learning The key tas ...

  7. 论文阅读之 A Convex Optimization Framework for Active Learning

    A Convex Optimization Framework for Active Learning Active learning is the problem of progressively ...

  8. set and Sequence theory

    https://en.wikipedia.org/wiki/Class_(set_theory) https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraen ...

  9. Softmax回归(使用theano)

    # coding:utf8 import numpy as np import cPickle import theano import os import theano.tensor as T cl ...

  10. C#学习之LinqtoSql类的简单例子

    LinqtoSql类把访问.操作数据库的细节封装了起来,把连接操作数据库变得相当简单.下面是简单的例子. 第一步:添加LinqtoSql类 1.创建一个控制台应用程序项目,下载一个NrothWind ...