不难发现题中过程对应着动态维护关于$C$的最大生成树。

为了让$D$最大,同时让字典序最大,那么最后得到的一定是按$pair(C,D,编号)$排序的最大生成树。

对于每条非树边$(u,v,C)$,那么它要早于树上$u$到$v$路径上任意一条同$C$值的边出现。

而非树边之间显然不存在限制关系,因此非树边一定是按编号从小到大出现。

从大到小考虑每条非树边,在树上找到$u,v$向上最近的同$C$值的边,然后暴力往上染色到LCA,加入限制关系。

找往上最近的同$C$值的边可以通过离线dfs一遍树,维护每个$C$最近出现的位置来得到。

暴力染色可以通过并查集路径压缩来优化时间复杂度。

找到所有$O(m)$条限制关系后,用堆贪心求出字典序最小的解即可。

时间复杂度$O(m\log m)$。

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=50010,M=100010,BUF=3500000;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
int n,m,i,j,k,f[N],g[N],v[N<<1],w[N<<1],nxt[N<<1],ed;bool on[M];
int G[M],V[M<<1],W[M<<1],NXT[M<<1],ED,q[M][2];bool d[M];
int vis[M],c[N],fa[N],st[N],en[N],dfn,fin[M],tot;
priority_queue<int,vector<int>,greater<int> >Q;
struct E{int x,y,c,d,p;}e[M],a[M];
inline bool cmp(const E&a,const E&b){if(a.c!=b.c)return a.c<b.c;if(a.d!=b.d)return a.d<b.d;return a.p<b.p;
}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline void addq(int x,int y,int z){V[++ED]=y;W[ED]=z;NXT[ED]=G[x];G[x]=ED;}
void dfs(int x,int y){st[x]=++dfn;fa[x]=vis[a[c[x]].c];f[x]=x;vis[a[c[x]].c]=x;for(int i=G[x];i;i=NXT[i])if(W[i]<0)q[-W[i]][0]=vis[V[i]];else q[W[i]][1]=vis[V[i]];for(int i=g[x];i;i=nxt[i])if(v[i]!=y)c[v[i]]=w[i],dfs(v[i],x);vis[a[c[x]].c]=fa[x];en[x]=dfn;
}
inline void ADD(int x,int y){d[V[++ED]=y]=1;NXT[ED]=G[x];G[x]=ED;}
inline bool have(int x,int y){return st[x]<=st[y]&&en[y]<=en[x];}
inline void col(int x,int y,int p){for(int i=0;i<2;i++)for(int o=q[p][i];;f[o]=fa[o]){o=F(o);if(have(o,x)&&have(o,y))break;ADD(p,c[o]);}
}
int main(){fread(Buf,1,BUF,stdin);read(n),read(m);for(i=1;i<=m;i++)read(e[i].x),read(e[i].y),read(e[i].c),read(e[i].d),e[i].p=i;sort(e+1,e+m+1,cmp);for(i=1;i<=m;i=j){for(j=i;j<=m&&e[i].c==e[j].c;j++);for(k=i;k<j;k++)e[k].c=i;}for(i=1;i<=n;i++)f[i]=i;for(i=m;i;i--)if(F(e[i].x)!=F(e[i].y)){on[e[i].p]=1;f[f[e[i].x]]=f[e[i].y];add(e[i].x,e[i].y,e[i].p);add(e[i].y,e[i].x,e[i].p);}for(i=1;i<=m;i++)a[e[i].p]=e[i];for(i=m;i;i--)if(!on[i]){addq(a[i].x,a[i].c,-i);addq(a[i].y,a[i].c,i);}for(i=0;i<=m;i++)vis[i]=1;dfs(1,0);for(ED=0,i=1;i<=m;i++)G[i]=0;for(i=m;i;i--)if(!on[i])col(a[i].x,a[i].y,i);for(i=1;i<=m;i++)if(!d[i])Q.push(i);while(!Q.empty()){fin[++tot]=i=Q.top();Q.pop();for(j=G[i];j;j=NXT[j])Q.push(V[j]);}for(i=1;i<=tot;i++)printf("%d%c",fin[i],i<tot?' ':'\n');return 0;
}

  

BZOJ2042 : [2009国家集训队]Will的烦恼相关推荐

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  2. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门

    题目链接:2038: [2009国家集训队]小Z的袜子(hose) 题目: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再 ...

  3. BZOJ 2039: [2009国家集训队]employ人员雇佣

    二次联通门 : BZOJ 2039: [2009国家集训队]employ人员雇佣 /*BZOJ 2039: [2009国家集训队]employ人员雇佣最小割先全部雇佣每个人向汇点连边后源点分别向i,j ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  5. BZOJ2038 : [2009国家集训队]小Z的袜子(hose)(莫队算法)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 19269 Solved: 8851 [Sub ...

  6. 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)

    题目传送门 1 /* 2 莫队算法:求出[l, r]上取出两只相同袜子的个数. 3 莫队算法是离线处理一类区间不修改查询类问题的算法.如果你知道了[L,R]的答案,可以在O(1)的时间下得到 4 [L ...

  7. 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 15879  Solved: 7205 [S ...

  8. bzoj2038[2009国家集训队]小Z的袜子(hose)

    bzoj2038[2009国家集训队]小Z的袜子(hose) 题意: 把N只袜子从1到N编号,每次求从编号为L到R的袜子中抽两只,有多大的概率抽到颜色相同的袜子. 题解: 不知道要用什么数据结构,但是 ...

  9. bzoj2039[2009国家集训队]employ人员雇佣

    bzoj2039[2009国家集训队]employ人员雇佣 题意: 有N个经理,Ei,j表示i经理对j经理的了解程度,当经理i和经理j同时被雇佣时,利润增加Ei,j*2.同时,雇佣每一个经理都需要花费 ...

最新文章

  1. SQL 全角半角转换-(摘抄)
  2. 今天,你比赛加班了吗?
  3. 大一暑假第三周学习体会
  4. 实现序列化与反序列化,一定要绕开这些坑!
  5. mysql主从复制思考_Mysql主从复制(拓展博客文章分享及思考)
  6. Java-代理模式的理解
  7. Android 自定义操作成功的loading动画
  8. 高并发下如何生成唯一订单号?
  9. 从招聘信息看-数据分析师(数据分析报告)
  10. eclipse-embed
  11. Golang ------ torrent文件解析
  12. C语言五子棋双人模式
  13. Andriod studio 学习 之 Recyclerview
  14. iOS内购实现及测试Check List
  15. 无涯教程:Node.js - Streams介绍
  16. 电磁场仿真软件ANSYS Electronics下载附安装教程
  17. vue-element-admin 默认英文版改回中文版
  18. matlab bsxfun memory,matlab函数bsxfun浅谈(转载)
  19. 如何区分好老师和坏老师?以及中国的音乐培训圈都多不要脸
  20. jfinal的简单使用(一)

热门文章

  1. 网络七层协议_IT人计算机网络浅析
  2. iptables原理知识
  3. HBase模式设计之ID顺序增长(rowkey顺序增长)
  4. linux 中用vi编辑器替换字符
  5. 在Linux上安装ant环境
  6. linux内核分析--异步io(二)
  7. Maven pom.xml配置详解
  8. linux如何修改文件或目录的权限(chmod)
  9. 40岁,将站到哪里(转)
  10. [转]ExtJs中使用中碰到的三个问题的解决方法