2019CCPC哈尔滨 Gym102394

比赛链接:Gym102394

E. Exchanging Gifts

题意:有n个操作,每个操作决定Si,op==1表示后面Si为当前给出的序列,op==2表示Si是Sx+Sy,由此得到最后的Sn,Sn随意交换得到H,问H与Sn最多有多少个不同;

分析:假设我们已经得到Sn,长度为len,出现次数最多的数是x,出现次数为num,如果num*2>len,ans=2*(len-num),否则答案为len;那么问题就转化为如何得到num和len;

如果Sn的op==1,那么可以直接考虑,如果op==2,那么就只需要考虑对最后Sn有影响的Si;

那么就可以先找到出现次数最多的数x是什么,然后扫一遍记录x出现的真实次数;

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=1e6+7;
typedef long long ll;
ll num[maxn];
int f[maxn][3];
vector<int> a[maxn];
ll rua()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        a[i].clear();num[i]=0;
        int op;scanf("%d",&op);f[i][0]=op;
        if(op==1)
        {
            int k,x;scanf("%d",&k);
            for(int j=0;j<k;j++) scanf("%d",&x),a[i].pb(j);
        }
        else scanf("%d%d",&f[i][1],&f[i][2]);
    }
    num[n]=1;
    for(int i=n;i>0;i--)
        if(f[i][0]==2) num[f[i][1]]+=num[i],num[f[i][2]]+=num[i];
    ll mx=0,mxnum=0,sum=0;
    for(int i=1;i<=n;i++)
        if(f[i][0]==1 && num[i])
            for(auto j:a[i])
            {
                if(mx==0) mx=j,mxnum+=num[i];
                else if(mx==j) mxnum+=num[i];
                else 
                {
                    if(num[i]>mxnum) mx=j,mxnum=num[i]-mxnum;
                    else mxnum-=num[i];
                }
                sum+=num[i];
            }
    ll tot=0;
    for(int i=1;i<=n;i++)
        if(f[i][0]==1 && num[i])
            for(auto j:a[i])
                if(j==mx) tot+=num[i];
    if(tot*2>sum) return 2*(sum-tot);
    else return sum;
}
int main()
{
    int t;scanf("%d",&t);
    while(t--) printf("%lld\n",rua());
    return 0;
}

F. Fixing Banners

预处理+全排列

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+7;
char s[maxn];
int vis[10][30];
char a[]="harbin";
void rua()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<6;i++) 
    {
        scanf("%s",s);
        int st=strlen(s);
        for(int j=0;j<st;j++) vis[i][s[j]-'a']=1;
    }
    bool ff=false;
    sort(a,a+6);
    do
    {
        bool flag=true;
        for(int i=0;i<6;i++) if(!vis[i][a[i]-'a']) {flag=false;break;}
        if(flag) {ff=true;break;}
    }
    while(next_permutation(a,a+6));
    if(ff) printf("Yes\n");
    else printf("No\n");
}
int main()
{
    int t;scanf("%d",&t);
    while(t--) rua();

    return 0;
}

I.Interesting Permutation

先特判掉无解的情况;如果h[i]>h[i-1],那么说明a[i]要么是前i个数的最大值,要么是最小值,那么就可以给当前答案*2,同时对h没有影响的位置+(h[i]-h[i-1]+1),如果相等,那么说明ai是在对h没有影响的位置中找了一个,那么答案*位置个数,同时个数--;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+7;
int h[maxn];
ll rua()
{
    int n;scanf("%d",&n);
    bool flag=true;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&h[i]);
        if(h[i]<h[i-1]) flag=false;
        if(h[i]>=n) flag=false;
    }
    if(h[1]!=0) flag=false;
    if(!flag) return 0;
    int res=0;
    ll ans=1;
    for(int i=2;i<=n;i++)
    {
        if(h[i]>h[i-1])
        {
            ans=(ans*2)%mod;
            res+=(h[i]-h[i-1]-1);
        }
        else if(h[i]==h[i-1]) ans=(ans*res)%mod,res--;
    }
    return ans;
}
int main()
{
    int t;scanf("%d",&t);
    while(t--) printf("%lld\n",rua());
    return 0;
}

J.Justifying the Conjecture

傻逼题

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n;scanf("%d",&n);
        if(n<6) printf("-1\n");
        else
        {
            if(n%2==0) printf("2 %d\n",n-2);
            else printf("3 %d\n",n-3);
        }
    }
    return 0;
}

K.Keeping Rabbits

队友说是傻逼题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];
double ans[maxn];
int main(){
    int t,n,k;scanf("%d",&t);
    while (t--){
        scanf("%d%d",&n,&k);
        ll sum=0;
        for (int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i]; 
        for (int i=1;i<=n;i++){
            ans[i]=1.0*a[i]+1.0*k*a[i]/sum;
        }
        for (int i=1;i<=n;i++)
            if (i<n) printf("%.8f ",ans[i]);
            else printf("%.8f\n",ans[i]);
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_43813163/article/details/102883590