The 2018 ACM-ICPC Asia Qingdao Regional Contest

这里写图片描述
正常发挥吧,没倒数就非常开心了。。。红黑树那题敲慢了,也不知道想对了没有

A Live Love

水题略

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=(int)1e9+7;
const int maxn=100005;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);

        int n0=n-m,n1=m;
        printf("%d ",m);
        printf("%d\n",(n1+n0)/(n0+1));

    }
    return 0;
}

K XOR Clique

水题略

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1e6+9;
const LL mod=1e9+7;
LL read(){ LL ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}

int bit[40];

int main(){
    int t=read();
    while(t--){
        memset(bit,0,sizeof(bit));
        int ans=0;
        int n=read();
        while(n--){
            int a=read();
            int ca=0;
            while(a){
                ca++;a>>=1;
            }
            bit[ca]++;ans=max(ans,bit[ca]);
        }
        printf("%d\n",ans);

    }
}

C Halting Problem

n个操作,每个操作为:符合要求便走到固定的操作前,否则便走到下一个位置,问是否可以走到n+1的位置,那么可以知道有一片操作可能为一个循环节,如果有循环节便走不到

vis数组如果每次清零发现T了,用bitset优化才过

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=(int)1e9+7;
const int maxn=100005;
int n;
char op[10005][5];
bitset<10005> state[300];
int v[10005],k[10005];
int main(){
    int t;
    cin>>t;
    while(t--){
        for(int i=0;i<260;i++)state[i].reset();
        int now=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",op[i]+1);
            scanf("%d",&v[i]);
            if(op[i][1]!='a'){
                scanf("%d",&k[i]);
            }
        }
        int nd=1,flag=0;
        while(nd!=n+1){
            if(state[now][nd]) {
                flag=1;
                break;
            }
            state[now][nd]=1;
            if(op[nd][1]=='a'){
                now=(now+v[nd])%256;
                nd++;
            }
            else if(op[nd][2]=='e'){
                if(now==v[nd]) nd=k[nd];
                else nd++;
            }
            else if(op[nd][2]=='n'){
                if(now!=v[nd]) nd=k[nd];
                else nd++;
            }
            else if(op[nd][2]=='l'){
                if(now<v[nd]) nd=k[nd];
                else nd++;
            }
            else if(op[nd][2]=='g'){
                if(now>v[nd]) nd=k[nd];
                else nd++;
            }
        }
        if(flag) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

H Traveling on the Axis

走红路灯,0红要等一秒,一秒后01转置。1绿直接走到下一个位置。用Ans(q,p)表示q点走到p点的时间,求 i = 1 n 1 j = i + 1 n 用dp[i]表示以第i个位置为起点的段的和

不够,因为红灯等一秒走一秒后面不会变,但是绿灯走一秒后面要变的,所以要用dp[0][i]表示原来的走到i的答案,dp[1][i]表示翻转后走到i的答案,那么转移方程为:

i位为1时:

d p [ 0 ] [ i ] = d p [ 1 ] [ i + 1 ] + n i + 1 d p [ 1 ] [ i ] = d p [ 1 ] [ i + 1 ] + 2 ( n i + 1 )

i位为0时:

d p [ 0 ] [ i ] = d p [ 0 ] [ i + 1 ] + 2 ( n i + 1 ) d p [ 1 ] [ i ] = d p [ 0 ] [ i + 1 ] + n i + 1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
char a[100005];
ll dp[2][100005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",a+1);
        int n=strlen(a+1);
        if(a[n]=='1')   dp[1][n]=2,dp[0][n]=1;
        else dp[1][n]=1,dp[0][n]=2;
        for(int i=n-1;i>=1;i--)
        {
            if(a[i]=='1')
            {
                dp[0][i]=dp[1][i+1]+n-i+1;
                dp[1][i]=dp[1][i+1]+2*(n-i+1);
            }
            else
            {
                dp[0][i]=dp[0][i+1]+2*(n-i+1);
                dp[1][i]=dp[0][i+1]+n-i+1;
            }
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
            ans+=dp[0][i];//printf("dp[0][%d] = %lld ,dp[1][%d] = %lld\n",i,dp[0][i],i,dp[1][i]),
        printf("%lld\n",ans);
    }
    return 0;
}

J Press the Button

暴力lcm为一个循环节,把a的倍数和c的倍数塞进优先队列,一个一个取出来

结果优先队列T了,改成数组就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int mod=(int)1e9+7;
const int maxn=100005;
//priority_queue<pii, vector<pii>,greater<pii>  > aim;
pii aim[4000009];
int n;
ll a,b,c,d,v,t;
int main(){
    int T;
    cin>>T;
    while(T--){
        n=0;
        scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&v,&t);
        ll lcm=a*c/__gcd(a,c);
        ll upa=lcm/a;
        ll upb=lcm/c;

        ll ar1=1,ar2=1;
        while(ar1<=upa&&ar2<=upb){
            if(a*ar1<=c*ar2)aim[++n]={a*ar1,1},ar1++;
            else aim[++n]={c*ar2,2},ar2++;
        }
        while(ar1<=upa)aim[++n]={a*ar1,1},ar1++;
        while(ar2<=upb)aim[++n]={c*ar2,2},ar2++;

        ll nowti=0,ans=b+d-1,tmp=0,tmp2=0,yu=t%lcm,bei=t/lcm;

        for(int ar=1;ar<=n;ar++){
            ll fi=aim[ar].first;
            if(aim[ar].second==1){
                if(fi<=nowti+v){
                    tmp+=b;
                    if(fi<=yu){
                        tmp2+=b;
                    }
                }
                else {
                    tmp+=b-1;
                    if(fi<=yu){
                        tmp2+=b-1;
                    }
                }
            }
            else{
                if(fi<=nowti+v){
                    tmp+=d;
                    if(fi<=yu){
                        tmp2+=d;
                    }
                }
                else {
                    tmp+=d-1;
                    if(fi<=yu){
                        tmp2+=d-1;
                    }
                }
            }
            nowti=fi;
        }
        ans+=bei*tmp+tmp2;
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/82728282