Codeforces Round 613(div2) 解題報告

2020.1.12 星期六
昨天上經濟課真是刺激,本來沒打算打這場div2的,後來看到羣裏好多人都去了,心裏癢癢,正好在路上有了第一題的思路,就交上去了,全然不顧我已經比別人晚了45分鐘以及我馬上要去上economic of risk的事實,試試就逝世。

上課我習慣性地坐在了第一排,結果忘了我今天還有別的任務,結果電腦打開就開始做題了,後面的三位中國同學很好奇經濟課上爲什麼會有計科學生亂入,紛紛投來好奇的目光,第一排坐着個在看電腦的人,然後後一排人全在看第一排的人,這想都不用想絕對是走神了,當場被老師拉出來制裁了,結果我才交完第一題就被繳了械。。。哭了,掉分預定,綠名也能掉分屬實厲害。

然後說比賽吧,感覺真的不難,這幾個都是構思特別精巧的題,a和c基本都是秒出,然而b卡住了,後來還是因爲國內老姐給我的思路,最後ac了,然後最後一題d,再往下就是不可做題了,這道題分治的優勢很明顯(雖然我逆序數都能寫掛好幾次沒資格說這個話),但是具體怎麼做我也是後來從別人那裏得到的啓發,畢竟對位運算還不算太老練,答題思路是對每一位進行分治,查在這個位置上0和1的情況,就是這個位置上如果既有0,也有1,那麼完蛋了,這個位置上的1八成是跑不掉了,如果只有0或者只有1那麼就可以把這一位對應地設置成0或1來取到0,感覺不難,但是寫起來真的有一定的難度,後來還是A了。
下面是A. Mezo Playing Zoma 的AC代碼

#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef unsigned long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
    int x;
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    return x;
}//快讀
int n;
int main(){
    //freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
    string str;
    cin>>n>>str;
    cout<<(str.length() + 1)<<endl;
}

B. Just eat it 的AC代碼

#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
    int x;
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    return x;
}//快讀
int n;
int kase;
ll a[limit];
int main(){
    //freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
    kase = read();
    while(kase--){
        n = read();
 
        for(int i = 1 ; i <= n ; ++i){
            cin>>a[i];
        }
        ll sum1 = 0, sum2 = 0;
        int flag = 1;
        for(int i = 1 ; i <= n ; ++i){
            sum1 += a[i];
            if(sum1 <= 0){
                flag = 0;
                break;
            }
        }
        for(int i = n ; i >= 1 ; --i){
            sum2 += a[i];
            if(sum2 <= 0){
                flag = 0;
                break;
            }
        }
        puts(flag ? "YES" : "NO");
    }
}

C. Fadi and LCM 的AC代碼(記得開ull)

#include <bits/stdc++.h>
using namespace std;
#define limit 200000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef unsigned long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
    int x;
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    return x;
}//快讀
ll n;
int kase;
ll a[limit];
int cnt = 0;
int main(){
    //freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin);
    cin>>n;
    for(ll i = 1 ; i * i <= n; ++i){
        //枚舉所有的divisor
        if(n % i == 0){
            a[++cnt] = i;//記錄所有的divisor
        }
    }
    ll ans1 = inf, ans2 = inf;
    for(int i = 1 ; i <= cnt ; ++i){
        if(gcd(a[i] , n / a[i]) == 1){
            //如果這兩個互質
            if(max(ans1, ans2) > max(a[i] , n / a[i])){
                ans1 = a[i];
                ans2 = n / a[i];
            }
        }
    }
    printf("%lld %lld\n", ans1, ans2);
}

D. Dr. Evil Underscores的AC代碼,不要問我你是不是抄答案了,我這幾天的代碼和標準答案真的很像,但不一樣

#include <bits/stdc++.h>
using namespace std;
#define limit 100000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3ff
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define Modulo 1000000
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
#define FOPEN freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt", stdin)
typedef unsigned long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快讀
int read(){
    int x;
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    return x;
}//快讀
int n;
vector<int>v;
int dfs(int cur, vector<int>&vect){
    if(cur < 0){
        return 0;
    }
    vector<int>zero, one;//當前位置上兩個數字的開合情況
    for(auto i : vect){
        if((i >> cur) & 1){
            //如果當前位置上有1
            one.push_back(i);
        }else{
            zero.push_back(i);
        }
    }
    if(one.empty()){
        return dfs(cur - 1, zero);
    }else if(zero.empty()){
        return dfs(cur - 1, one);
    }
    return min(dfs(cur - 1, zero) , dfs(cur - 1, one)) + (1 << cur);//記錄本單位
}
int main(){
    //FOPEN;
    n = read();
    for(int i = 1 ; i <= n ; ++i){
        int a = read();
        v.push_back(a);
    }
    int ans = dfs(30 , v);
    printf("%d\n", ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章