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;
    }
    
  • 相关阅读:
    (转)一篇教会你写90%的shell脚本
    (转)printf命令详解
    (转)linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
    (转)Shell中read的选项及用法
    (转)linux中shell变量$#,$@,$0,$1,$2的含义解释/Shell中的${}、##和%%使用范例/export
    (转)linux运维人员必会的22道shell编程面试题及视频讲解
    (转)李文周的博客
    ROS报错“An error occurred during the signature verification”的解决办法
    RRT and RRT Variants
    ROS LocalPlanner 基于自行车模型的DWA
  • 原文地址:https://www.cnblogs.com/wyxdrqc/p/11375805.html
Copyright © 2011-2022 走看看