Codeforces VK Cup 2016 - Round 1 (Div. 2 Edition)

A. Bear and Reverse Radewoosh

  按要求计算一下即可。

#include <bits/stdc++.h>

#define ll long long

using namespace std;

int p[111];
int t[111];

int main(){
    int n,c;
    cin>>n>>c;

    for(int i=1;i<=n;i++){
        cin>>p[i];
    }

    for(int i=1;i<=n;i++){
        cin>>t[i];
    }

    int sa = 0;
    int sb = 0;

    int tt = 0;
    for(int i=1;i<=n;i++){
        tt+=t[i];
        sa += max(0,p[i] - tt*c);
    }

    tt = 0;
    for(int i=n;i>=1;i--){
        tt+=t[i];
        sb += max(0,p[i] - tt*c);
    }

    if(sa>sb){
        cout<<"Limak"<<endl;
    }else if(sa == sb){
        cout<<"Tie"<<endl;
    }else{
        cout<<"Radewoosh"<<endl;
    }
    return 0;
}

B. Bear and Displayed Friends

  手写一个优先队列保存前k大的在线好友,每当好友上线时,像冒泡排序那样去维护队列。

#include <bits/stdc++.h>

#define ll long long

using namespace std;

int t[155555];
bool ol[155555];
int que[11];

int main(){
    int n,k,q;
    cin>>n>>k>>q;

    for(int i=1;i<=n;i++){
        scanf("%d",&t[i]);
    }

    int cnt = 0;
    while(q--){
        int op,id;
        scanf("%d%d",&op,&id);
        if(op==1){
            ol[id] = 1;
            que[k+1] = t[id];
            int cur = k+1;
            while(que[cur]>que[cur-1]){
                swap(que[cur],que[cur-1]);
                cur--;
                if(cur==1)break;
            }
        }else{
            if(ol[id]&& que[k]<=t[id]){
                printf("YES\n");
            }else{
                printf("NO\n");
            }
        }
    }

    return 0;
}

C. Bear and Forgotten Tree 3

  因为树的高度是h,首先造出一条高度为h的链,然后根据直径加边,从根或者根下面那个节点加,使得直径为d。

#include <bits/stdc++.h>

#define ll long long

using namespace std;



int main(){
    int n,d,h;
    while(cin>>n>>d>>h){
        if( (d>=h && d<=2*h) && !(n>2&&d==1)){
            //1st path
            int cnt = n-1;
            for(int i=1;i<=h;i++){
                printf("%d %d\n",i,i+1);
                cnt--;
            }

            int cur = h+2;
            int target = 1;

            int dep = 0;
            if(dep + h == d){
                h--;
                target++;
            }
            int pre = target;
            while(cnt--){
                printf("%d %d\n",pre,cur);
                pre = cur;
                cur++;
                dep++;
                if(dep + h==d){
                    pre = target;
                    dep = 0;
                }
            }
        }else{
            cout<<-1<<endl;
        }
    }
    return 0;
}

D. Bear and Polynomials

  由于x等于2,所以多项式每一项都是2的整数幂的整数倍。要使得多项式的值为0,有两个条件,一是项的前缀和的系数不能是奇数,二是项的后缀和的系数绝对值不能达到k。另外,除了最高次项以外,其他项的和不能是0。

#include <bits/stdc++.h>

#define ll long long

using namespace std;

ll a[200010];

ll need[200010];

int main(){
    ll n,k;
    cin>>n>>k;
    for(ll i=0;i<=n;i++){
        scanf("%I64d",&a[i]);
    }

    ll cur = 0;
    int l = 0;
    for(int i=n;i>=0;i--){
        need[i] = cur;
        cur+=a[i];
        if(cur>=k || cur<=-k){
            l=i;
            break;
        }
        cur*=2;
    }

    cur = 0;
    int r = n;
    int ans = 0;
    for(int i=0;i<=n;i++){
        if(i==n && cur==0){
            r=n-1;
            break;
        }
        if( i>=l && need[i]+cur>=-k && need[i]+cur<=k){
            ans++;
        }
        cur+=a[i];
        if(cur&1){
            r=i;
            break;
        }
        cur/=2;
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(codeforces)