Educational Codeforces Round 132 (Rated for Div. 2)

传送门https://codeforces.com/contest/1709

A. Three Doors

随便乱搞都行

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
signed main() {
    std::ios::sync_with_stdio(false);
    int t;std::cin>>t;
    while(t--){
        int x;std::cin>>x;
        int h[4]={0};
        for(int i=1;i<=3;i++)std::cin>>h[i];
        int p=x;
        int ans=0;
        while(p){
            p=h[p];
            ans++;
        }
        if(ans==3)std::cout<<"YES"<<std::endl;
        else std::cout<<"NO"<<std::endl;
    }
}

B. Also Try Minecraft

两个前缀和

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
int sl[N],sr[N];
signed main() {
    std::ios::sync_with_stdio(false);
    int n,m;std::cin>>n>>m;
    for(int i=1;i<=n;i++)std::cin>>a[i];
    for(int i=1;i<=n;i++)sl[i]=sl[i-1]+std::max(0ll,a[i]-a[i+1]);
    for(int i=1;i<=n;i++)sr[i]=sr[i-1]+std::max(0ll,a[i]-a[i-1]);
    while(m--){
        int s,t;std::cin>>s>>t;
        if(s<t)std::cout<<sl[t-1]-sl[s-1]<<"\n";
        else std::cout<<sr[s]-sr[t]<<"\n";
    }
}

C. Recover an RBS

有毒啊

#include <bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
std::string s;
signed main() {
    std::ios::sync_with_stdio(false);
    int t;std::cin>>t;
    while(t--){
        std::cin>>s;int n=s.length();
        std::vector<int>p;
        s[0]='(';s[n-1]=')';
        int cost[3]={0};bool f=1;
        for(int i=0;i<n;i++){
            if(s[i]=='(')cost[0]++;
            if(s[i]==')')cost[1]++;
            if(s[i]=='?')p.push_back(i);
        }
        int a=n/2-cost[0];
        int b=n/2-cost[1];
        for(int i=0;i<a;i++)s[p[i]]='(';
        for(int i=a;i<a+b;i++)s[p[i]]=')';
        if(a+b<1||!b||!a){
            std::cout<<"YES\n";
            continue;
        }
        std::swap(s[p[a-1]],s[p[a]]);
        cost[0]=cost[1]=0;
        bool ff=1;
        for(int i=0;i<n;i++){
            cost[(int)(s[i]!='(')]++;
            if(cost[1]>cost[0])ff=0;
        }
        if(ff)f=0;
        //std::cout<<s<<"\n";
        if(f)std::cout<<"YES"<<"\n";
        else std::cout<<"NO"<<"\n";
    }
}

D. Rorororobot

st表维护区间最大值

#include<bits/stdc++.h>
#define int long long 
const int N = 2e5+10;
int a[N];int n,m;        
int x1,Y1,x2,y2;
int st[N][30];
void init(){
    for(int i=1;i<=m;i++)st[i][0]=a[i];
    for(int j=1;j<=20;j++){
        for(int i=1;i+(1<<j)-1<=m;i++){
            st[i][j]=std::max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
        }
    }
}
int ask(int l,int r){
    int k=log2(r-l+1);
    return std::max(st[l][k],st[r-(1<<k)+1][k]);
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin>>n>>m;
    for(int i=1;i<=m;i++)std::cin>>a[i];
    init(); 
    int q;std::cin>>q;
    while(q--){
        int k;
        std::cin>>x1>>Y1>>x2>>y2;
        std::cin>>k;    
        if(std::abs(x1-x2)%k!=0||std::abs(Y1-y2)%k!=0){
            std::cout<<"NO\n";
            continue;
        }
        if(Y1>y2)std::swap(Y1,y2);
        if(x1>x2)std::swap(x1,x2);
        int maxs=ask(Y1,y2);
        if(x1>maxs){
            std::cout<<"YES\n";
            continue;
        }
        if(x2>maxs){
            std::cout<<"YES\n";
            continue;
        }
        int p=maxs-x2;
        p-=p%k;
        p+=k;
        maxs=p+x2;
        
        if(maxs<=n)std::cout<<"YES\n";
        else std::cout<<"NO\n";
    }
}

E. XOR Tree

启发式合并

题意:给一颗有点权的树,要求所有简单路径上经过的顶点的权值异或和不为0。求修改顶点权值的最少次数。

找到一个巨短的答案:

ac:

#include <bits/stdc++.h>
#define int long long
const int N = 2e5 + 10;
int a[N],v[N],cost;
std::vector<int>to[N];
std::set<int>s[N];
void merge(int u,int v,bool &f){
    if(s[u].size()>s[v].size())s[u].swap(s[v]);
    for(int p:s[u])f|=s[v].count(a[v]^p);
    for(int p:s[u])s[v].insert(p);
}
void dfs_qfshb(int now,int last){
    bool f=0;
    v[now]=v[last]^a[now];
    s[now].insert(v[now]);
    for(int i:to[now]){
        if(i!=last){
            dfs_qfshb(i,now);
            merge(i,now,f);
        }
    }
    if(f){
        cost++;
        s[now].clear();
    }
}
signed main() {
    std::ios::sync_with_stdio(false);  
    int n;std::cin>>n;
    for(int i=1;i<=n;i++)std::cin>>a[i];
    for(int i=1;i<n;i++){
        int x,y;std::cin>>x>>y;
        to[x].push_back(y);
        to[y].push_back(x);
    }
    dfs_qfshb(1,0);
    std::cout<<cost<<"\n";
}

考虑少了。没过样例3的版本。

#include <bits/stdc++.h>
#define int long long
const int N = 2e5 + 10;
int a[N];
std::vector<int>to[N];
int cost=0;
std::vector<int> dfs(int now,int last){
    std::vector<std::vector<int>>ve;
    std::vector<int>res;
    for(int i:to[now]){
        if(last!=i){
            ve.push_back(dfs(i,now));
        }
    }
    std::map<int,int>mp;
    for(int i=0;i<ve.size();i++){
        for(int j=0;j<ve[i].size();j++){
            if(mp[ve[i][j]^a[now]]){
                res.clear();
                cost++;
                return res;
            }
            mp[ve[i][j]]++;
            res.push_back(ve[i][j]^a[now]);
        }
    }
    if(!ve.size())res.push_back(a[now]);
    return res;
}
int get(int start){
    cost=0;
    dfs(start,0);
    return cost;
}
signed main() {
    std::ios::sync_with_stdio(false);
    int n;std::cin>>n;
    for(int i=1;i<=n;i++)std::cin>>a[i];
    for(int i=1;i<n;i++){
        int a,b;std::cin>>a>>b;
        to[a].push_back(b);
        to[b].push_back(a);
    }
    int ans=0;
    for(int i=1;i<=n;i++)ans=std::max(ans,get(i));
    std::cout<<ans<<"\n";
}
posted on 2022-07-24 17:15  wtn135687  阅读(46)  评论(0)    收藏  举报