2023 Hubei Provincial Collegiate Programming Contest

发布时间 2023-05-22 02:22:38作者: sakuya726

记录一下和队友VP的这场湖北省赛,有空会加上赛后自己的复盘分析和补题情况。

C.Darkness I

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 105050
#define int long long
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
int n,m;
signed main()
{
    n=read();
    m=read();
    cout<<min(n,m)+ceil((max(n,m)-min(n,m))/2.0);
}
View Code

F. Inverse Manacher

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 2850500
#define mod 998244353
#define int long long 
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
int n;
int a[maxn];
char ans[maxn];
int max_r;
signed main()
{
    n=read();
    for(rg int i=0;i<2*n+2;++i) a[i]=read();
    ans[2]='a';
    max_r=2;
    for(rg int i=3;i<2*n+2;++i)
    {
        if(i%2==0)
        {
            for(rg int j=max_r+2;j<=i-1+a[i];j+=2)
            {
                ans[j]=ans[2*i-j];
                max_r=j;
            }
        //    cout<<"i="<<i<<" maxr="<<max_r<<"  rr="<<i-1+a[i]<<endl;
            if(2*i-max_r-2>0&&max_r+2<=i+1+a[i]) 
            {
                max_r+=2;
                ans[max_r]=((ans[2*i-max_r]=='a')?'b':'a');    
            }
        }
        else          
        {
            for(rg int j=max_r+2;j<=i-1+a[i];j+=2)
            {
                ans[j]=ans[2*i-j];
                max_r=j;
            }
        //    cout<<"i="<<i<<" maxr="<<max_r<<"  rr="<<i-1+a[i]<<endl;
            if(2*i-max_r-2>0&&max_r+2<=i+1+a[i]) 
            {
                max_r+=2;
                ans[max_r]=((ans[2*i-max_r]=='a')?'b':'a');    
            }        
        }
    }
    for(rg int i=2;i<2*n+2;i+=2) 
    {
        cout<<ans[i];
    }
}
View Code

H. Binary Craziness

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 1850500
#define mod 998244353
#define int long long 
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
int n,m;
int dg[maxn];
int num[maxn],temp[maxn];
bool flag[maxn];
struct node
{
    int val,tot; 
};
stack<node> q;
inline int f(int a,int b)
{
    return (a&b)*(a|b)*(a^b)%mod;
}
int ans;
signed main()
{
    n=read();
    m=read();
    for(rg int i=1;i<=m;++i)
    {
        int a,b;
        a=read();
        b=read();
        dg[a]++;
        dg[b]++;
    } 
    for(rg int i=1;i<=n;++i) num[dg[i]]++;
    for(rg int i=1;i<=n;++i)
    {
        if(flag[dg[i]]==0)
        {
            flag[dg[i]]=1;
            node a;
            a.val=dg[i];
            a.tot=num[dg[i]];
            q.push(a);
            temp[q.size()]=a.val;
        }
    }
    int cnt=q.size();
    for(rg int i=1;i<=cnt;++i)
    {
        int val=temp[i];
        int tot=(num[val]+1)*num[val]/2;
        ans+=f(val,val)*tot;
        ans%=mod; 
        for(rg int j=i+1;j<=cnt;++j) 
        {
            ans+=((num[temp[i]]*num[temp[j]])*f(val,temp[j]));
            ans%=mod;
        }
    }
    cout<<ans;
}
View Code

J. Expansion

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 550500
#define mod 998244353
#define int long long 
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
int n;
int a[maxn];
int t;
int s[maxn],max_top;
inline int find(int now)
{
    for(rg int i=now+1;i<=n;++i)
    {
        if(s[i]>=max_top&&s[i+1]<s[i]) return i;
    }
    return n;
}
inline int get(int l,int r)
{
    int minn=99999999999;
    int sum=0;
    for(rg int i=l+1;i<=r;++i) 
    {
        sum+=s[i];
        minn=min(minn,sum);
        max_top=max(max_top,s[i]);
    }
    return minn;
}
int sum,st;
signed main()
{
    n=read();
    for(rg int i=1;i<=n;++i) a[i]=read(),s[i]=s[i-1]+a[i];
    for(rg int i=1;i<=n;++i)
    {
        sum+=s[i];
        if(s[i+1]<=s[i]&&s[i]>0)
        {
            st=i;
            max_top=s[i];
            break;
        }
        if(s[i]<0) 
        {
            cout<<-1;
            return 0;
        }
    }
    if(s[n]<0) 
    {
        cout<<-1;
        return 0;
    }
    for(rg int i=st;i<n;++i)
    {
        int nxt=find(i);
        int nd=get(i,nxt);
    //    cout<<"i="<<i<<" sum="<<sum<<" nxt="<<nxt<<" nd="<<nd<<endl;
        if(sum>=abs(nd))
        {
            for(rg int j=i+1;j<=nxt;++j) sum+=s[j];
            i=nxt-1;
            continue;
        }
        else
        {
        //    cout<<"i="<<i<<"  sum="<<sum<<"  nd="<<nd<<"  nxt="<<nxt<<"  s[i]="<<s[i]<<" t+="<<ceil((double)(1.0*(abs(sum+nd)))/(double)(1.0*s[i]))<<" t="<<t<<endl;
            t+=ceil((double)(1.0*(abs(sum+nd)))/(double)(1.0*s[i]));
            sum=ceil((double)(1.0*(abs(sum+nd)))/(double)(1.0*s[i]))*s[i]+sum;
            for(rg int j=i+1;j<=nxt;++j) sum+=s[j];
            i=nxt-1;
        }
    }
//    cout<<"t="<<t<<endl;
    cout<<t+n;
}
View Code

K. Dice Game

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 105050
#define int long long
#define mod 998244353
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
inline long long qp(long long a,long long b)
{
    long long ans=1;
    while(b>0)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(long long)(a*a)%mod;
        b>>=1;
    }
    return ans%mod;
}
int n,m; 
//p/q    p*q^(998244351) mod 998244353
signed main()
{
    n=read();
    m=read();
//    cout<<qp(64,998244351)*27%mod;
    for(rg int i=1;i<=m;++i)//[1,m]---x      [1,x-1]   [x+1,m]      (x-1)/m的概率赢    (m-x)/m的概率输 
    {
        cout<<qp((int)qp(m-1,n),998244351)*(int)qp(m-i,n)%mod<<" ";    
    }
}
View Code

M. Different Billing

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define maxn 105050
#define int long long
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return x*f;
}    
int x,y; //1000 2500
signed main()
{
    x=read();
    y=read();
    for(rg int i=0;i<=x;++i)
    {
        long long sumb=i*1000;
        if((y-sumb)==0)
        {
            cout<<x-i<<" "<<i<<" "<<0;
            return 0;
        }
        else if((y-sumb)>0&&(y-sumb)%2500==0)
        {
            cout<<max((int)0,x-i-(y-sumb)/2500)<<" "<<i<<" "<<(y-sumb)/2500;
            return 0;
        }
    }
    cout<<-1;
    return 0;
}
View Code