Educational Codeforces Round 170 (Rated for Div. 2) A-D

archer2333發表於2024-10-15

比賽連結
A. Two Screens
簡單對前面相同的個數進行判斷即可

點選檢視程式碼
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
void solve() {
    string a,b;cin>>a>>b;
    if(a.size()>b.size()){
        swap(a,b);
    }
    int same=0;
    for(int i=0;i<a.size();i++){
        if(a[i]==b[i])same++;
        else break;
    }
    if(same==0){
        cout<<a.size()+b.size()<<'\n';
    }else {
        cout<<1+a.size()+b.size()-same<<'\n';
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

B. Binomial Coefficients, Kind Of
快速打表發現為2的冥次 當且僅當i==j時為1

點選檢視程式碼
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
void solve() {
    int n;cin>>n;
    vector<int>a(n),b(n),c;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
    for(int i=0;i<n;i++){
        if(a[i]==b[i]){
            c.pb(1);
        }else {
            c.pb(qpw(2,b[i]));
        }
    }
    for(auto i:c){
        cout<<i<<'\n';
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
//    cin>>_;
    while(_--)solve();
}

C. New Game
用佇列維護前連續數對的值
然後透過每組都進行取mx即可

點選檢視程式碼
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
void solve() {
    map<int,int>mp;
    int n,k;cin>>n>>k;
    queue<int>q;
    set<int>s;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        mp[x]++;
        s.insert(x);
    }
    int mx=0,sum=0;
    for(auto &son:s){
        if(q.size()==k){
            int qp=q.front();
            q.pop();
            mx=max(mx,sum);
            sum-=mp[qp];
        }
        if(q.size()<k&&mp[son-1]){
            q.push(son);
            sum+=mp[son];
        }else {
            mx=max(mx,sum);
            while(q.size())q.pop();
            sum=0;
            sum+=mp[son];
            q.push(son);
        }
    }
    mx=max(mx,sum);
    cout<<mx<<'\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

D. Attribute Checks
發現m很小 但是n很大
於是對m進行維護
對於每個地方的值 其後方能獲得的透過數是固定的
於是提前預處理掉 該處的值
其他的就是m^2的轉移
唯一需要注意的點就是轉移時還需要注意 分別討論智力增長和力量增長(wa8)

點選檢視程式碼
#include<bits/stdc++.h>

//#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
const int mod=1e9+7;
int qpw(int a,int b){int ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
void solve() {
    int n,m;cin>>n>>m;
    vector<int>a(n+1);
    vector cnt1(m+1,vector<int>(m+1));
    vector cnt2(m+1,vector<int>(m+1));
    vector dp(m+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)cin>>a[i];
    int last=0;
    int ret=0;
    for(int i=1;i<=n;i++){
        if(!a[i])last=++ret;
        else if(a[i]>0){
            cnt1[last][a[i]]++;
        }else {
            cnt2[last][abs(a[i])]++;
        }
    }
    for(int i=1;i<=last;i++){
        for(int j=1;j<=i;j++){
            cnt1[i][j]+=cnt1[i][j-1];
            cnt2[i][j]+=cnt2[i][j-1];
        }
    }
    int mx=0;
    for(int i=1;i<=last;i++){
        for(int j=0;j<=i;j++){
            dp[i][j]=max(dp[i][j],dp[i-1][j]+cnt1[i][j]+cnt2[i][i-j]);
            if(j>=1){
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+cnt1[i][j]+cnt2[i][i-j]);
            }
            mx=max(mx,dp[i][j]);
        }
    }
    for(int j=0;j<=last;j++)mx=max(mx,dp[last][j]);
    cout<<mx<<'\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
//    cin>>_;
    while(_--)solve();
}

相關文章