D.Drop Voicing

最后队友猜了一发结论是最长上升子序列,过了。。。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
#define sc(a) scanf("%d",&a)
const int mod=1e9+9;
const int N=501;
int n,a[N],dp[N],s[N];
int ans=1e9;
int main()
{
    sc(n);
    for(int i=1;i<=n;i++)sc(a[i]);
    for(int k=1;k<=n;k++)
    {
        int cnt=0;
        for(int i=k;i<=n;i++)
            s[++cnt]=a[i];
        for(int i=1;i<k;i++)s[++cnt]=a[i];
        cnt=1;
        dp[1]=s[1];
        for(int i=2;i<=n;i++)
        {
            if(s[i]>dp[cnt])
                dp[++cnt]=s[i];
            else {
                int l=lower_bound(dp+1,dp+1+cnt,s[i])-dp;
                dp[l]=s[i];
            }
        }
        //cout<<cnt<<endl;
        ans=min(ans,n-cnt);
    }cout<<ans;
    return 0;
}

E.Bogo Sort

找环,将所有环的大小求lcm,我们用到了大数乘法,最后还判了前导零(没判的时候wa了),结果题解说不用取模???

代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=1e9+9;
const int maxn=1e5+10;
ll s[maxn],f,x;
int n,a[maxn],m[maxn],cnt=1;
ll gcd(ll c,ll b)
{  
    if(b==0)
        return c;
    else if(c%b==0)
        return b;
    else
        return gcd(b,c%b);
}
void chenfa()       //s*=f
{
    for(int i=0;i<cnt;i++)
        s[i]=s[i]*f;
    for(int i=0;i<cnt;i++)
        s[i+1]+=s[i]/10,s[i]%=10;
    while(s[cnt]>=10)
        s[cnt+1]+=s[cnt]/10,s[cnt]%=10,cnt++;
    if(s[cnt]>0)
        cnt++;
}
void chufa()        //s/=x
{
    ll sum=0;
    int b[cnt+5],k=0,c=0;
    for(int i=cnt-1;i>=0;i--)
    {
        sum*=10;
        sum+=s[i];
        b[k++]=sum/x;
        sum%=x;
        s[i]=0;
    }
    while(b[c]==0&&c<k)
        c++;
    cnt=0;
    for(int i=c;i<k;i++)
        b[cnt++]=b[i];
    for(int i=0;i<cnt;i++)
        s[cnt-1-i]=b[i];
}
ll quyu()           //return s%f
{
    ll sum=0;
    for(int i=cnt-1;i>=0;i--)
    {
        sum*=10;
        sum+=s[i];
        sum%=f;
    }
    return sum;
}
int main()
{
    s[0]=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        a[x]=i;
    }
    for(int i=1;i<=n;i++)
    {
        if(m[i])
            continue;
        m[i]++;
        x=a[i];
        f=1;
        while(x!=i)
            m[x]++,x=a[x],f++;
        x=gcd(f,quyu());
        //cout<<2;
        chenfa();       //s*=f
        chufa();        //s/=x
    }
    //cout<<cnt<<endl;
    x=min(n,cnt)-1;
    while(s[x]==0&&x>=0)
        x--;
    for(int i=x;i>=0;i--)
        printf("%lld",s[i]);
    if(x<0)
        cout<<0;
    return 0;
}

F.DPS

签到

代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=1e9+9;
const int maxn=1e5+10;
int t,n,ans,m;
int a[maxn],vis[maxn],s;
int main()
{
    cin>>n;
    s=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s=max(s,a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        m=(int)ceil(1ll*50*a[i]*1.0/s);
        cout<<'+';
        for(int j=1;j<=m;j++)
        {
            cout<<'-';
        }
        cout<<'+'<<endl;
        cout<<'|';
        for(int j=1;j<m;j++)
        {
            cout<<' ';
        }
        if(m!=0)
        {
            if(s==a[i])
                cout<<'*';
            else
                cout<<" ";
        }
 
        cout<<'|'<<a[i]<<endl;
        cout<<'+';
        for(int j=1;j<=m;j++)
        {
            cout<<'-';
        }
        cout<<'+'<<endl;
    }
    return 0;
}

I.Hard Math Problem

结论题,试出来的。。。答案是2/3.。。。