不难发现题中过程对应着动态维护关于$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 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

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

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  5. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  6. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  7. BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 3577  Solved: 1652[Subm ...

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

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

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

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

随机推荐

  1. 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁

    拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...

  2. XML使用与总结

    xml是一种比较方便的数据储存方式,它适用于小数据的存储.最常见的适用地方莫过于各种web.config与app.config了.   一.创建一个简单的xml路径 public static str ...

  3. 关于 java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String

    今天遇到了这个异常,其实是自己经验欠缺所致.我是通过mybatis查询到数据库传过来的主键,是一个32位的char类型. 代码: //查询总账表的该组织总账记录,包括该条记录的主键id.账户余额Dzz ...

  4. 将Elasticsearch的快照备份到HDFS

    1.安装Elasticsearch插件repository-hdfs 下载地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins ...

  5. (原创)C# 压缩解压那些事儿

    吐槽: 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗的太垃圾了,获取下来的压缩包使用正常方式无法解压!!没有专门的API ...

  6. BeautifulSoup下Unicode乱码解决

    今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...

  7. UIImageView的常用方法

    //初始化 init(image: UIImage!) @availability(iOS, introduced=3.0)//初始化,highlightedImage 高亮图片 init(image ...

  8. [转]PL/SQL Developer 导入导出csv文件

    PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡, ...

  9. 一次BurpSuite无法抓https包定位

  10. Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂

    原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...