• [AGC010E] Rearranging [拓扑排序+堆]


    题面

    传送门

    思路

    首先,一个显然的结论是:Alice调整过后的序列中任意两个不互质的数的相对顺序无法改变

    那么我们可以以这个性质为突破口

    我们在两个不互质的权值的点之间连一条边(没错这是个图论题!!!),那么每个联通块的一个拓扑序就会是这个块最终被Bob变成的样子

    显然,Alice可以贪心操作,使得这个拓扑序中越小的越靠前

    那么我们把所有数从小到大排序,然后从小的开始dfs,每次dfs时从最小的开始先走,得到一个$DAG$

    然后把所有的$DAG$的拓扑排序的那个队列插到一个堆里面,每次取出最小的,就是Bob得到的序列的当前这一位

    (相当于是并行做拓扑排序啦)

    Code

    给给全真给给

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cassert>
    #include<cmath>
    #include<queue>
    #define ll long long
    using namespace std;
    inline int read(){
    	int re=0,flag=1;char ch=getchar();
    	while(ch>'9'||ch<'0'){
    		if(ch=='-') flag=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
    	return re*flag;
    }
    int n,g[2010][2010],a[2010],vis[2010],in[2010];
    int first[2010],cnte;
    struct edge{
    	int to,next;
    }e[10010];
    inline void add(int u,int v){
    	e[++cnte]=(edge){v,first[u]};first[u]=cnte;in[v]++;
    }
    int gcd(int x,int y){
    	if(y==0) return x;
    	return gcd(y,x%y);
    }
    void dfs(int u){
    	vis[u]=1;int i;
    	for(i=1;i<=n;i++){
    		if(!vis[i]&&!g[u][i]) add(u,i),dfs(i);
    	}
    }
    struct gaygayquan{
    	int val,id;
    };
    inline bool operator <(gaygayquan x,gaygayquan b){
    	return x.val<b.val;
    }
    gaygayquan mp(int l,int r){
    	return (gaygayquan){l,r};
    }
    priority_queue<gaygayquan>q;
    int main(){
    	memset(first,-1,sizeof(first));
    	n=read();int i,j,v;gaygayquan gay;
    	for(i=1;i<=n;i++) a[i]=read();
    	sort(a+1,a+n+1);
    	for(i=1;i<=n;i++){
    		for(j=1;j<i;j++){
    			if(gcd(a[i],a[j])==1) g[i][j]=g[j][i]=1;
    		}
    	}
    	for(i=1;i<=n;i++) if(!vis[i]) dfs(i);
    	for(i=1;i<=n;i++) if(!in[i]) q.push(mp(a[i],i));
    	while(!q.empty()){
    		gay=q.top();q.pop();
    		printf("%d ",gay.val);
    		for(i=first[gay.id];~i;i=e[i].next){
    			v=e[i].to;in[v]--;
    			if(in[v]==0) q.push(mp(a[v],v));
    		}
    	}
    }
    
    
  • 相关阅读:
    有趣的网抑云
    [扩展阅读] timeit 模块详解(准确测量小段代码的执行时间)
    第044讲:魔法方法:简单定制
    第043讲:魔法方法:算术运算2
    第042讲:魔法方法:算术运算1
    第041讲:魔法方法:构造和析构
    吴恩达深度学习 第一课第四周课后编程作业 assignment4_2
    吴恩达深度学习 第一课第四周课后编程作业 assignment4_1
    第040讲:类和对象:一些相关的BIF
    [扩展阅读] property 的详细使用方法
  • 原文地址:https://www.cnblogs.com/dedicatus545/p/9475424.html
Copyright © 2020-2023  润新知