Codeforces Round #531 (Div. 3)

不会F啊。。。投了。。。剩下的好像都很简单

A:瞎猜。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     ios::sync_with_stdio(false);
 5     int n;
 6     cin>>n;
 7     if(n%4==0||n%4==3){
 8         cout<<0<<endl;
 9     } else{
10         cout<<1<<endl;
11     }
12 }
View Code

B:随便搞

#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[6666],ans[6666];
set<int>s[6666];
void cloro(int id,int clo){
    while (s[a[id]].count(clo)){
        clo++;
        if(clo==k+1){
            clo=1;
        }
    }
    ans[id]=clo;
    s[a[id]].insert(clo);
}
int main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int now = 1;
    bool flag = false;
    for(int i=1;i<=n;i++){
        if(s[a[i]].size()==k){
            cout<<"NO"<<endl;
            exit(0);
        }
        cloro(i,now);
        now++;
        if(now==k+1) {
            now = 1;
            flag = true;
        }
    }
    if(!flag&&now<k){
        cout<<"NO"<<endl;
        exit(0);
    }
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<' ';
}
View Code

C:傻逼题

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,x,y,a[105];
 4 int dp[100005];
 5 set<int> s;
 6 int main() {
 7     ios::sync_with_stdio(false);
 8     cin>>n>>x>>y;
 9     for(int i=1;i<=n;i++)
10         cin>>a[i];
11     if(x>y){
12         cout<<n<<endl;
13     } else if(x<=y){
14         int num = 0;
15         for(int i=1;i<=n;i++){
16             if(a[i]<=x){
17                 num++;
18             }
19         }
20         int ans = 0;
21         while (num>0){
22             ans++;
23             num-=2;
24         }
25         cout<<ans<<endl;
26     }
27 }
View Code

D:贪心的 六种变换随便搞

我写的应该是有问题的,但是ppt了就不想改了,估计会掉。  因为我觉着 我先贪心的 情况会影响到后贪心的。其实加个vis就可以但是我比较懒。。。

#include <bits/stdc++.h>
using namespace std;
string s;int n;
int a[3];
void slove(int c01,int c02,int c10,int c12,int c20,int c21){
    for(int i=n-1;i>=0;i--){
        if(s[i]=='0'){
            if(c02) {
                s[i] = '2';
                c02--;
            }
            else if(c01) {
                s[i] = '1';
                c01--;
            }

        } else if(s[i]=='1'){
            if(c12){
                c12--;
                s[i]='2';
            }
        }
    }
    for(int i=0;i<n;i++){
        if(s[i]=='2'){
            if(c20){
                c20--;
                s[i]='0';
            } else if(c21){
                c21--;
                s[i]='1';
            }
        } else if(s[i]=='1'){
            if(c10){
                s[i]='0';
                c10--;
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin>>n>>s;
    for(int i=0;i<n;i++){
        a[s[i]-'0']++;
    }
    int c01=0,c02=0,c10=0,c12=0,c20=0,c21=0;
    if(a[0]>n/3){
        if(a[1]>n/3){
            c02=a[0]-n/3;
            c12=a[1]-n/3;
        } else{
            c01=n/3-a[1];
            c02=n/3-a[2];
        }
    } else if(a[1]>n/3){
        if(a[2]>n/3){
            c10=a[1]-n/3;
            c20=a[2]-n/3;
        } else{
            c10=n/3-a[0];
            c12=n/3-a[2];
        }
    } else if(a[2]>n/3){
        c20=n/3-a[0];
        c21=n/3-a[1];
    }
    slove(c01,c02,c10,c12,c20,c21);
    cout<<s<<endl;
}
View Code

E:每个数都可以确定一个区间,然后我们求不确定的区间的长度,答案就是 1<<(len-1)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod = 998244353;
 5 int n;int a[200005];
 6 ll qpow(ll a,ll x){
 7     ll res = 1;
 8     while (x){
 9         if(x&1)
10             res=(res*a)%mod;
11         a=(a*a)%mod;
12         x/=2;
13     }
14     return res;
15 }
16 map<int,int> m;
17 vector<int> v [200005];
18 int pre[200005];
19 int main() {
20     ios::sync_with_stdio(false);
21     cin>>n;
22     int id = 1;
23     for(int i=1;i<=n;i++) {
24         cin >> a[i];
25         if(m.count(a[i])){
26             v[m[a[i]]].push_back(i);
27         } else{
28             m[a[i]]=id;
29             v[id].push_back(i);
30             id++;
31         }
32     }
33     for(int i=1;i<id;i++){
34         pre[v[i][0]]++;
35         pre[v[i][v[i].size()-1]]--;
36     }
37     ll cnt = 0;
38     for(int i=1;i<=n;i++){
39         pre[i]+=pre[i-1];
40         if(pre[i]==0)
41             cnt++;
42     }
43     cout<<qpow(2,cnt-1)<<endl;
44 }
View Code

F:状压dp。 数据范围很明显了。。 先预处理出来每两行相邻的时候对答案的贡献,然后dp,dp的时候枚举第一行是啥。

猜你喜欢

转载自www.cnblogs.com/MXang/p/10247704.html