zoukankan      html  css  js  c++  java
  • CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告

    T1 T2

    水题,不管

    T3

    构造题,证明大约感性理解一下

    我们想既然存在解

    (|a[n + i] - a[i]| = 1)

    这是必须要满足的

    既然这样,那么图必须是这样的

    ml79Fe.png

    (-),是相邻的两个数中的较小的一个,(+)是相邻的两个数中较大的

    这样分配是肯定有解的

    但是当n时偶数的时候,手玩一下就会发现,不可能满足+-交替,所以无解

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    #include<vector>
    #include<ctime>
    #define LL long long
    #define pii pair<int,int>
    #define mk make_pair
    #define fi first
    #define se second
    using namespace std;
    inline int read(){
    	int v = 0,c = 1;char ch = getchar();
    	while(!isdigit(ch)){
    		if(ch == '-') c = -1;
    		ch = getchar();
    	}
    	while(isdigit(ch)){
    		v = v * 10 + ch - 48;
    		ch = getchar();
    	}
    	return v * c;
    }
    const int N = 5e5 + 3;
    int a[N];
    int n;
    int main(){
    	n = read();
    	if(n & 1){
    		int now = 0;
    		for(int i = 1;i <= n;++i){
    			if(!now) a[i] = i * 2 - 1,a[i + n] = i * 2;
    			else a[i] = i * 2,a[i + n] = i * 2 - 1;
    			now ^= 1;
    		}
    		printf("YES
    ");
    		for(int i = 1;i <= 2 * n;++i) printf("%d ",a[i]);  
    	}	
    	else printf("NO
    ");
    	return 0;
    }
    
    

    T4

    分位考虑

    这道题的关键在于给你张图,求最小环

    由于点数和边数特别少,所以直接爆搜就好了

    但是考虑多项式做法

    最小环的本质是对于边((u,v)),去掉边后((u,v))的最短路径(+1)

    这可以在floyd的过程中搞一搞

    当然,这是在边有边权的前提下
    这道题目直接枚举每一条边然后bfs就好了

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    #include<vector>
    #include<ctime>
    #define LL long long
    #define pii pair<int,int>
    #define mk make_pair
    #define fi first
    #define se second
    const int INF = 0x3f3f3f3f;
    using namespace std;
    inline LL read(){
    	LL v = 0,c = 1;char ch = getchar();
    	while(!isdigit(ch)){
    		if(ch == '-') c = -1;
    		ch = getchar();
    	}
    	while(isdigit(ch)){
    		v = v * 10 + ch - 48;
    		ch = getchar();
    	}
    	return v * c;
    }
    const int N = 2e5 + 3;
    LL a[N];
    int n,ans;
    int xx[65],yy[65];
    int tot,rt;
    struct edge{
    	int to;
    	int from;
    	int nxt;	
    }e[N << 1];
    int head[N];
    int deep[N],fa[N];
    int book[N];
    int vis[N];
    inline void add(int x,int y){
    	e[++tot].to = y;
    	e[tot].nxt = head[x];
    	e[tot].from = x;
    	head[x] = tot;
    }
    inline void dfs(int x,int dep){
    //	book[x] = 1;
    	vis[x] = 1;
    	for(int i = head[x];i;i = e[i].nxt){
    		int y = e[i].to;
    		if(y == rt && dep > 2) ans = min(ans,dep);
    		else if(!vis[y]) dfs(y,dep + 1);
    	}
    	vis[x] = 0;
    }
    int main(){
    	//freopen("A.in","r",stdin);
    	//freopen("A.out","w",stdout);
    	n = read();
    	for(int i = 1;i <= n;++i) a[i] = read();
    	for(int i = 0;i <= 62;++i){
    		int sum = 0;
    		for(int j = 1;j <= n;++j){
    			if(a[j] & (1ll << i)){
    				if(!xx[i]) xx[i] = j;
    				else if(!yy[i]) yy[i] = j;
    				sum++;
    				if(sum == 3){
    					printf("3
    ");
    					return 0;	
    				}
    			}
    		
    		}
    		if(sum == 2) add(xx[i],yy[i]),add(yy[i],xx[i]);//printf("%d %d
    ",xx[i],yy[i]);
    	}
    	ans = INF;
    	for(int i = 1;i <= n;++i){
    		dfs(rt = i,1);
    		if(ans == 3){
    			printf("3
    ");return 0;	
    		}
    	}
    	if(ans > n) printf("-1
    ");
    	else printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/wyxdrqc/p/11375805.html
Copyright © 2011-2022 走看看