Codeforces Round 969 (Div. 2)

A. Dora's Set

C. Dora and C++

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#define ll long long
const int N=100010;
ll x,y;
ll a[N];
ll b[N];
ll n,m;

ll gcd(ll x,ll y){
return y?gcd(y,x%y):x;
}

signed main(){
    ll T;cin>>T;
    while(T--){
            cin>>n>>x>>y;
    for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);

    ll gcdd=gcd(x,y);


    for(ll i=1;i<=n;i++){
        a[i]%=gcdd;
    }
    sort(a+1,a+n+1);
    ll ans=a[n]-a[1];
    for(int i=2;i<=n;i++){
        ans=min(ans,a[i-1]+gcdd-a[i]);
    }
    printf("%lld\n",ans);

/* ll mi=a[1];ll mx=a[1];
    for(ll i=1;i<=n;i++){
        mi=min(mi,a[i]);mx=max(mx,a[i]);
    }
    ll ans=mx-mi;

    for(ll i=1;i<=n;i++){
        if(a[i]<=gcdd/2)b[i]=a[i]+gcdd;
        else b[i]=a[i];
    }
    mi=b[1];mx=b[1];
for(ll i=1;i<=n;i++){
        mi=min(mi,b[i]);mx=max(mx,b[i]);
    }
    ans=min(ans,mx-mi);



    for(ll i=1;i<=n;i++){
        if(a[i]<=(gcdd+1)/2)b[i]=a[i]+gcdd;
        else b[i]=a[i];
    }
    mi=b[1];mx=b[1];
for(ll i=1;i<=n;i++){
        mi=min(mi,b[i]);mx=max(mx,b[i]);
    }
    ans=min(ans,mx-mi);

    printf("%lld\n",ans);
*/


    }

}

D. Iris and Game on the Tree

题意就是一棵树,树上每个节点有0和1两种,
每个节点由根到它的路径构成了一个字符串,比如说10110,如果10字串和01字串数量不同,那这个节点就是一个不平衡的
先手要的就是整个树不平衡的节点最多
它是一个博弈不是所有节点有01,有的是问号,要填的,问博弈之后有多少个不平衡的节点

发现只有由0到1和由1到0有用,把例如0001110010压缩成01010
随便列几个发现
0 平衡 1平衡
01 不平衡 10 不平衡
101 平衡 010 平衡
奇数是平衡偶数不平衡,也就是头尾相同平衡,不同不平衡

所以填的过程中只有根节点和它不同,获得一个不平衡,我们先手要获得最多不平衡的

如果根节点没填,那就抢占根节点,将它设为与较多的叶节点不同
之后抢占叶节点
发现样例?0????,0和1的叶节点一样多可以填中间无关紧要的,让后手填根节点。这时后手也会这么做
如果奇数,可以这样;如果偶数,就还是轮到自己了
如果根节点填了,就直接抢占叶节点。

综上:
如果根节点没填,那就抢占根节点,将它设为与较多的叶节点不同
如果一样多,如果奇数,可以多获得一个
如果偶数,不行
之后抢占叶节点
如果根节点填了,就直接抢占叶节点。

#include<iostream>
using namespace std;
#include<vector>
const int N=100010;
vector<int> G[N];int n;
char a[N];string str;
int cnt0,cnt1,cntw,z;
void dfs(int u,int fa){

for(auto v:G[u]){
    if(v==fa)continue;dfs(v,u);
}
if(G[u].size()==1&&u!=1){
        //cout<<"get"<<u<<endl;
    if(a[u]=='0')cnt0++;
    else if(a[u]=='1')cnt1++;
    else if(a[u]=='?')cntw++;
}

}

int main(){

int T;cin>>T;
while(T--){
cin>>n;cnt0=cnt1=cntw=z=0;
for(int i=1;i<=n;i++)G[i].clear();
for(int i=1;i<=n-1;i++){
    int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);
}
cin>>str;
for(int i=1;i<=n;i++){a[i]=str[i-1];if(a[i]=='?')z++;}
dfs(1,-1);

int ans=0;
if(a[1]=='?'){
    if(cnt0==cnt1){
        if((z-cntw-1)&1){
            ans+=cnt0;
            ans+=(cntw+1)/2;
        }else {
            ans+=cnt0;ans+=cntw/2;
        }
    }else {
   ans+=max(cnt0,cnt1);
  //  cout<<"????"<<cntw<<endl;
    ans+=cntw/2;
    }

}
else {
    if(a[1]=='0')ans+=cnt1;
    else ans+=cnt0;
    ans+=(cntw+1)/2;
}
printf("%d\n",ans);
}

}
posted @ 2025-07-10 19:58  arin876  阅读(9)  评论(0)    收藏  举报