牛客多校赛时记录(第一场)

A 2090 virus

签到题

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int t;
int main()
{
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        if(s.size()==8&&
        (s[0]!='e'&&s[0]!='i'&&s[0]!='o'&&s[0]!='u'&&s[0]!='a')&&
        (s[2]!='e'&&s[2]!='i'&&s[2]!='o'&&s[2]!='u'&&s[2]!='a')&&
        (s[4]!='e'&&s[4]!='i'&&s[4]!='o'&&s[4]!='u'&&s[4]!='a')&&
           (s[6]!='e'&&s[6]!='i'&&s[6]!='o'&&s[6]!='u'&&s[6]!='a')&&
        (s[1]=='e'||s[1]=='i'||s[1]=='o'||s[1]=='u'||s[1]=='a')&&
        (s[3]=='e'||s[3]=='i'||s[3]=='o'||s[3]=='u'||s[3]=='a')&&
        (s[5]=='e'||s[5]=='i'||s[5]=='o'||s[5]=='u'||s[5]=='a')&&
          (s[7]=='e'||s[7]=='i'||s[7]=='o'||s[7]=='u'||s[7]=='a')){
        	cout<<"Suspected Virus"<<endl;
        }else{
        	
            cout<<"Well-Being"<<endl;
        }
    }
    
    return 0;
}

E Permutation Evaluation

签到题,统计每个位置的元素的加减次数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
long long n,tot;
long long a[200010],b[200010];
int main()
{
    tot=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        tot+=(-1)*a[i]*(n+1-i)+a[i]*i;
    }
    cout<<tot;
    return 0;
}

F Permutation Generation

刚开始感觉很神秘,搓了一会发现自己忘记了带模加减法的性质,即如果对整个排列的每个元素同时加上同一个数,那么 \(f(p)\) 的值不变。

所以对除了 \(p_k\) 之外的每个数,加上必要的处理中出现的差值 \(d=(x-ak+n)%n\),即可还原为原来的 \(f(p)\) 。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,k,x;
int a[200010];
int main()
{
    cin>>n>>k>>x;
    for(int i=0;i<n;i++) cin>>a[i];
    int d=(x-a[k]+n)%n;
    for(int i=0;i<n;i++) cout<<(a[i]+d)%n<<' ';
    return 0;
}

G Precision Error?!

很有意思的一道题目!

想法也很粗暴,感觉不是很像正解的样子,但是神奇的满足了所有性质。

在空间中,我们可以取z=0、z=1两个平面,A,B组点分别位于这两个面上,每组n个点。

对于每个点 \(i\) ,\(xy\) 坐标为

\(i/10\*0.011,i \\bmod 10\*0.011,0) \\

同理,对于B组点构造:

\(i/10\*0.011,i \\bmod 10\*0.011,1) \\

而后证性质

  1. 对于组内的每个元素,最大距离为 \(0.099=1-\epsilon\) ,不满足条件,故不会进入统计范围
  2. 对于组外的两个元素,最大距离为 1.009=1+\\epsilon ,满足条件,最小距离为1 。故每个点都可满足条件。

代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int t,n;

int main()
{
    cin>>t;
    cout << fixed << setprecision(10);
    while(t--)
    {
        cin>>n;
        cout << 2 * n << endl;
        int r,c;
        for(int i=0;i<n;i++)
        {
            r=i/10;
            c=i%10;
            cout<<r*0.011<<' '<<c*0.011<<' '<<1.000000000<<endl;
        }
        for(int i=0;i<n;i++)
        {
            r=i/10;
            c=i%10;
            cout<<r*0.011<<' '<<c*0.011<<' '<<0.000000000<<endl;
        }
    }
    
    return 0;
}