Codeforces Round #306 (Div. 2) D.E. 解题报告

D题:Regular Bridge

乱搞。构造

这题乱搞一下就行了。构造一个有桥而且每个点的度数都为k的无向图。方法很多,也不好叙述。。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#define INF 0x3f3f3f3f
#define LL long long
const int mod=1e9+7;
using namespace std ;
int main()
{
    int k, i, j;
    while(scanf("%d",&k)!=EOF){
        if(k==1){
            puts("YES\n2 1\n1 2");
            continue ;
        }
        if(!(k&1)) {
            puts("NO");
            continue ;
        }
        puts("YES");
        printf("%d %d\n",2*k+4,(k+2)*k);
        printf("1 2\n1 %d\n",k+2);
        for(i=1;i<=(k-3)/2;i++){
            printf("1 %d\n1 %d\n",i+2,k+2-i);
        }
        for(i=2;i<=k+2;i++){
            for(j=i+1;j<=k+2;j++){
                if(i==2&&j==k+2) continue ;
                if(i<=(k-3)/2+2&&i>=3&&i+j==k+4) continue ;
                printf("%d %d\n",i,j);
            }
        }
        printf("%d %d\n%d %d\n",k+3,k+4,k+3,2*k+4);
        for(i=1;i<=(k-3)/2;i++){
            printf("%d %d\n%d %d\n",k+3,k+4+i,k+3,2*k+4-i);
        }
        for(i=k+4;i<=2*k+4;i++){
            for(j=i+1;j<=2*k+4;j++){
                if(i==k+4&&j==2*k+4) continue ;
                if(i>=k+5&&i<=k+4+(k-3)/2&&j+i==3*k+8) continue ;
                printf("%d %d\n",i,j);
            }
        }
        printf("1 %d\n",k+3);
    }
    return 0 ;
}

E题:Brackets in Implications

乱搞。构造。

首先可以注意到只有1->0的结果为0.所以必须要构造出一个1->0来,所以最后一个必须为0,否则无论如何也构造不出最后的0.然后只要在最后一位的0前面构造出一个1就可以了,因为不管前面的结果是什么,只要加上这个1,结果肯定为1,就可以跟最后一位的0构造出0来了。

然后再看第n-1位,第n-1位如果是1,那么就直接按原样输出就可以了。

这时候第n-1位为0.然后可以注意到第n-1位的前面只要有1个0就可以了。因为0加上任意一个数都是1,所以可以变成这种形式(0->(1->(1->(1……0))…)->0。假如前面没有0的话,那么就是全是1,那么无论怎么构造也都是变成1->0->0。所以前面必须有个0,而只要有一个0,构造方法就出来了。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#define INF 0x3f3f3f3f
#define LL long long
const int mod=1e9+7;
using namespace std ;
int a[1100000];
int main()
{
    int n, i, pos, flag;
    while(scanf("%d",&n)!=EOF){
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        if(a[n]){
            puts("NO");
            continue ;
        }
        if(n==1){
            puts("YES\n0\n");
            continue ;
        }
        if(a[n-1]){
            puts("YES\n");
            for(i=1;i<=n;i++){
                printf("%d",a[i]);
                if(i!=n) printf("->");
            }
            continue ;
        }
        if(n==2){
            puts("NO");
            continue ;
        }
        flag=0;
        for(i=n-2;i>=1;i--){
            if(!a[i]){
                flag=1;
                pos=i;
                break;
            }
        }
        if(!flag) {
            puts("NO");
            continue ;
        }
        puts("YES");
        for(i=1;i<pos;i++){
            printf("%d->",a[i]);
        }
        for(i=pos;i<=n-2;i++){
            printf("(%d->",a[i]);
        }
        printf("%d",a[n-1]);
        for(i=pos;i<=n-2;i++){
            printf(")");
        }
        printf("->%d\n",a[n]);
    }
    return 0 ;
}
时间: 2024-09-29 18:56:50

Codeforces Round #306 (Div. 2) D.E. 解题报告的相关文章

DFS Codeforces Round #306 (Div. 2) B. Preparing Olympiad

题目传送门 1 /* 2 DFS: 排序后一个一个出发往后找,找到>r为止,比赛写了return : 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 #include <vector> 10 #include <map> 11 #include

数学/找规律/暴力 Codeforces Round #306 (Div. 2) C. Divisibility by Eight

题目传送门 1 /* 2 数学/暴力:只要一个数的最后三位能被8整除,那么它就是答案:用到sprintf把数字转移成字符读入 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <iostream> 8 #include <cmath> 9 #include <vector> 10 using namespace std; 11

Codeforces Round #306 (Div. 2) (ABCE题解)

比赛链接:http://codeforces.com/contest/550 A. Two Substrings time limit per test 2 seconds memory limit per test 256 megabytes You are given string s. Your task is to determine if the given string s contains two non-overlapping substrings "AB" and &

Codeforces Round #306 (Div. 2)

Two Substrings 题意:问是否存在不重叠的串AB和BA. 思路:注意ABABA.BABAB这两种情况都应该是YES.所以可以找第一个AB,最后一个BA,如果两者不重叠(即两者不是ABA和BAB这样)可以确保一定是YES,同样如果找第一个BA和最后一个AB可以不重叠一样也是YES. 在python中,str的方法s1.find(s2)可以从字符串s1查找s2第一次出现的位置,找不到则返回-1.rfind()是查找最后一次出现位置. s=raw_input() x1,y1=s.find(

Codeforces Round #315 (Div. 2) A. Music 解题心得

原题: Description Little Lesha loves listening to music via his smartphone. But the smartphone doesn't have much memory, so Lesha listens to his favorite songs in a well-known social network InTalk. Unfortunately, internet is not that fast in the city

Codeforces Round #306 (Div. 2)——C模拟——Divisibility by Eight

You are given a non-negative integer n, its decimal representation consists of at most 100 digits and doesn't contain leading zeroes. Your task is to determine if it is possible in this case to remove some of the digits (possibly not remove any digit

Codeforces Round #306 (Div. 2)——A——Two Substrings

You are given string s. Your task is to determine if the given string s contains two non-overlapping substrings "AB" and "BA" (the substrings can go in any order). Input The only line of input contains a string s of length between 1 an

Codeforces Round #306 (Div. 2) (构造)

A. Two Substrings 题意:给一个字符串,求是否含有不重叠的子串"AB"和"BA",长度1e5. 题解:看起来很简单,但是一直错,各种考虑不周全,最后只能很蠢的暴力,把所有的AB和BA的位置求出来,能有一对AB和BA不重叠即可. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 char a[100005]; 5 vector<int> ab; 6 vector<i

Codeforces Round #306 (Div. 2) A

题意 给一个字符串(长度<=10^5).问当中有没有一个"BA"和一个"AB"呢?假设都有而且它们不反复(即ABA不算),输出YES.否则输出NO. 思路 一開始想简单了-.. 我们扫一遍,把全部"AB"字符串中A的索引放入一个vector a,把全部"BA"字符串中B的索引放入还有一个vector b.最后扫一遍两个vector.假设发现一个b的值既不是一个a的值+1,也不是那个a的值-1,那么肯定就存在不反复的&qu