[并查集]染色问题
2013-10-17 08:30
330 查看
题目大意:
平面上有n个珠子排成一排, 每个珠子初始颜色为0,你要对他们进行m次染色,
每次你选定l和r,然后把[l,r]之间的珠子染成编号c的颜色,
每个珠子的最终颜色为它曾经染过的编号最大的颜色,统计每个珠子最终的颜色。
由于数据较大,为了减少输出所用的不必要的时间,请采取以下方法输出:
假如a[i]为第i个珠子的最终颜色
for i := 1 to n do ans := (ans * 1200007 + a[i]) mod 999911659;
solution:
把color从大到小排序,F[i]数组代表i左边第一个未被染色的点。
每次从要染色的段的右端不断往左寻找F[i]进行染色
F[R]->F[F[R]-1]-> F[F[F[R]-1]-1] ..-> L
从而避免了多次访问相同节点 。
平面上有n个珠子排成一排, 每个珠子初始颜色为0,你要对他们进行m次染色,
每次你选定l和r,然后把[l,r]之间的珠子染成编号c的颜色,
每个珠子的最终颜色为它曾经染过的编号最大的颜色,统计每个珠子最终的颜色。
由于数据较大,为了减少输出所用的不必要的时间,请采取以下方法输出:
假如a[i]为第i个珠子的最终颜色
for i := 1 to n do ans := (ans * 1200007 + a[i]) mod 999911659;
solution:
把color从大到小排序,F[i]数组代表i左边第一个未被染色的点。
每次从要染色的段的右端不断往左寻找F[i]进行染色
F[R]->F[F[R]-1]-> F[F[F[R]-1]-1] ..-> L
从而避免了多次访问相同节点 。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m,a[1000010]; int f[1000010]; long long res; struct Edge { int u; int v; int c; friend bool operator < (const Edge a,const Edge b) { return a.c>b.c; } }G[2000010]; int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } int main() { scanf("%d %d",&n,&m); for(int i=1;i<=m;++i) scanf("%d %d %d",&G[i].u,&G[i].v,&G[i].c); sort(G+1,G+1+m); for(int i=1;i<=n;++i)f[i]=i; for(int i=1;i<=m;++i) { int t=find(G[i].v); while(t>=G[i].u) { a[t]=G[i].c; f[t]=find(f[t-1]); t=f[t]; } } for(int i=1;i<=n;++i) res=(res*1200007+a[i])%999911659; printf("%lld\n",res); return 0; }
相关文章推荐
- hdu 4056 并查集处理线段树染色问题
- acdream 1725 哗啦啦的小彭玉染色问题 离散化并查集
- 【枚举优化/离散化/并查集】染色问题
- 树染色问题color a tree(贪心)
- poj1129Channel Allocation 图的染色问题
- BZOJ 2303: [Apio2011]方格染色 并查集神题
- [BZOJ4487][JSOI2015]染色问题(组合数学+容斥原理)
- 并查集问题
- [杂题 思维] 51nod1448 二染色问题
- ZOJ1610 Count the Colors 经典线段树染色问题
- poj 2777 Count Color(线段树区区+染色问题)
- 单词,紫书P169UVa10129(有向图求欧拉路径问题,并查集求连通分支)
- BZOJ_2303_[Apio2011]方格染色 _并查集
- AtCoder Beginner Contest 087 D - People on a Line 并查集(区间和问题)
- 并查集 深搜 nyoj 42 一笔画问题
- [置顶] 并查集解决最优灌溉问题(最小生成树问题)
- A Bug's Life (并查集,同性恋问题,注意处理性别)
- 【原创】【算法】【ygylca】狭义带权并查集求lca两点之间路径最大路问题。
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- 【数据结构】之利用并查集解决食物链问题