给定一个多边形的三角剖分(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. Java-->IO流模拟实现用户登录以及登录信息

    --> Test 测试类 package com.dragon.java.hwlogin; import java.io.FileNotFoundException; import java.u ...

  2. mysql 操作突然断网,MySQL: “lock wait timeout exceeded”

    show processlist;//显示所有进程select * from information_schema.innodb_trx;//查询锁的进程-- kill 310;//杀掉锁进程

  3. Pickpic和FarStone走好..GreenShot上岗

    很早前就看過這丫的,以前就是拒絕改變,換過n多切圖工具了,除了題目中倆 還自己用AHK過一款,但最後還是停在Pickpic因為要上FTP比較快 今天在SourceForge亂逛邂逅了這貨,才知道原來” ...

  4. SpringSecurity相关配置【SpringSecurityConfig】

    SpringSecurity的配置相对来说有些复杂,如果是完整的bean配置,则需要配置大量的bean,所以xml配置时使用了命名空间来简化配置,同样,spring为我们提供了一个抽象类WebSecu ...

  5. leetcode 116 Populating Next Right Pointers in Each Node ----- java

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  6. Ansible安装配置及使用

    一.Ansible特点 1.不需要安装客户端,通过sshd通信 2.基于模块工作,模块可以由任何序言开发 3.不仅支持命令行使用模块,也支持编写yaml格式的playbook 4.支持sudo 5.有 ...

  7. IOS中货币高精度要求使用NSDecialNumber、

    float a = 0.01;        int b =99999999;        double c = 0.0;        c = a * b; //如果单纯的使用double会导致数 ...

  8. Tutorial: Triplet Loss Layer Design for CNN

    Tutorial:  Triplet Loss Layer Design for CNN Xiao Wang  2016.05.02 Triplet Loss Layer could be a tri ...

  9. linux概念之IPC

    一切皆文件,文件类型为普通,目录,管道,socket,链接,块设备,字符设备cd /proc/2305/fd/ 该进程打开了6个文件描述符,三个为字符设备即012,三个为socket即345,sock ...

  10. MySQL之选择字段数据类型

    MySQL支持的数据类型很多,选择正确的数据类型对于 获得高性能至关重要.在选择时有个简单的原则有助于做出更好的选择. 简单的原则: A.通常最小的是最好的 因为这样可以用更少的磁盘.内容.CPU缓存 ...