2021牛客暑期多校训练营4

出题:4题
排名:252

I.Inverse Pair

WXL
签到题

const int N = 2e5+5;
int a[N];
bool vis[N],has[N];
map<int,int>pos;
int n,b[N],cnt;
void merge_sort(int a[],int l,int r)
{
    if (r-l<1)
        return ;
    int mid=(l+r)>>1;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);
    int i=l,j=mid+1;
    fir(k,l,r)
        if (j>r || i<=mid && a[i]<=a[j])
            b[k]=a[i++];
        else
            cnt+=mid-i+1,b[k]=a[j++];//统筹不满足的情况
    fir(k,l,r)
        a[k]=b[k];
}
 
signed main()
{
   IOS;
   cin >> n;
   rep(i,1,n)
   {
       cin >> a[i];
       pos[a[i]] = i;
   }
   per(i,n,1)
   {
       vis[a[i]] = 1;
       if(vis[a[i] - 1] && !has[a[i] - 1])
       {
           ++a[pos[a[i] - 1]];
           has[a[i] - 1] = 1;
           has[a[i]] = 1;
       }
   }
//    rep(i,1,n) cout << a[i] << ' ';
   merge_sort(a,1,n);
   cout << cnt;
}

J. Average

CY
在这里插入图片描述

#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 1e5 + 10;
const double eps = 1e-8;
int a[MAXN], b[MAXN];
ll sa[MAXN], sb[MAXN];
int dcmp(double x)
{
    if (std::fabs(x) < eps) return 0;
    if (x < 0) return -1;
    return 1;
}
bool check(ll *s, int n, int constraint, double v)
{
    double mini = 1e18;
    for (int i = constraint; i <= n; ++i)
    {
        mini = std::min(mini, s[i - constraint] - v * (i - constraint));
        double u = s[i] - v * i;
        if (dcmp(mini - u) <= 0) return true;
    }
    return false;
}
double solve(ll *s, int n, int constraint)
{
    double l = 0, r = 1e5;
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(s, n, constraint, mid)) l = mid;
        else r = mid;
    }
    return l;
}
int main()
{
    int n, m, x, y; scanf("%d%d%d%d", &n, &m, &x, &y);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    for (int i = 1; i <= m; ++i)
        scanf("%d", &b[i]);
    for (int i = 1; i <= n; ++i)
        sa[i] = sa[i - 1] + a[i];
    for (int i = 1; i <= m; ++i)
        sb[i] = sb[i - 1] + b[i];
    double ans = solve(sa, n, x) + solve(sb, m, y);
    printf("%.10lf\n", ans);
    return 0;
}

F.Just a joke

WYX
博弈游戏,给一个无环图,每次可以删除一条边或者一个连通分量。
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
int ru[maxn];
pair<int,int>a[maxn];
int par[maxn];
int find(int x)
{
    if(x==par[x]) return x;
    return par[x]=find(par[x]);
}
int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);  
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++)
    par[i]=i;
    for(int i=1;i<=m;i++)
    {
        int x,y;cin>>x>>y;
        ru[x]++;ru[y]++;
        par[find(x)]=find(y);
        a[i]={x,y};
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    if(find(i)==i) ans++;
    // for(int i=1;i<=m;i++)
    // {
    //     int x=a[i].first,y=a[i].second;
    //     if(ru[x]==1&&ru[y]==1) ans++;
    // }
    if((n+m)&1) cout<<"Alice\n";
    else cout<<"Bob\n";
 	return 0;
}

C.LCS

WYX

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
int a1,b1,c1,n;

int dp[maxn][maxn];
int lcs(string a,string b,int n,int m)
{
    memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
	else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
	return dp[n][m];
}
int f1(string s,string s1)
{
    return lcs(s,s1,n,n);
}
bool f(string s1,string s2,string s3)
{
    if(f1(s1,s2)==a1&&f1(s2,s3)==b1&&f1(s3,s1)==c1) return true;
    return false;
}
int cc[5];
int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);  
    int a,b,c;
    cin>>a>>b>>c>>n;
    a1=cc[1]=a;b1=cc[2]=b;c1=cc[3]=c;
    sort(cc+1,cc+4);
    a=cc[3];b=cc[2];c=cc[1];
    //cout<<a<<" "<<b<<" "<<c<<endl;
    string s1,s2,s3;
    for(int i=1;i<=a;i++)
    s1+='a',s2+='a';
    for(int i=a+1;i<=n;i++)
    s1+='b',s2+='c';
    for(int i=1;i<=c;i++)
    s3+='a';
    for(int i=1;i<=b-c;i++)
    s3+='c';
    //cout<<s1<<" "<<s2<<" "<<s3<<endl;
    while(s3.size()<n) s3+='d';
    if(f(s1,s2,s3)) cout<<s1<<endl<<s2<<endl<<s3<<endl;
    else if(f(s1,s3,s2)) cout<<s1<<endl<<s3<<endl<<s2<<endl;
    else if(f(s2,s1,s3)) cout<<s2<<endl<<s1<<endl<<s3<<endl;
    else if(f(s2,s3,s1)) cout<<s2<<endl<<s3<<endl<<s1<<endl;
    else if(f(s3,s1,s2)) cout<<s3<<endl<<s1<<endl<<s2<<endl;
    else if(f(s3,s2,s1)) cout<<s3<<endl<<s2<<endl<<s1<<endl;
    else cout<<"NO\n";
 	return 0;
}

B.Sample Game

每个数都有一个生成的期望,只要生成的值是最大的就可以一直生成,问生成的个数 x 2 x^2 x2的期望值是多少。
优质题解
在这里插入图片描述
期望dp或者直接推式子
上述链接中有两种做法

#include <bits/stdc++.h>
#include <iostream>
#include <ctime>
#include <cstdio>
#include <cctype>
#define inf 0x3f3f3f3f
#define IOS                       \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define per(i, a, n) for (int i = n; i >= a; --i)
//#define ONLINE_JUDGE
using namespace std;
typedef long long ll;
const int mod = 998244353;
namespace FastIO
{
    char buf[1 << 21], buf2[1 << 21], a[20], *p1 = buf, *p2 = buf, hh = '\n';
    int p, p3 = -1;
    void read() {}
    void print() {}
    inline int getc()
    {
        return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
    }
    inline void flush()
    {
        fwrite(buf2, 1, p3 + 1, stdout), p3 = -1;
    }
    template <typename T, typename... T2>
    inline void read(T &x, T2 &...oth)
    {
        int f = 0;
        x = 0;
        char ch = getc();
        while (!isdigit(ch))
        {
            if (ch == '-')
                f = 1;
            ch = getc();
        }
        while (isdigit(ch))
        {
            x = x * 10 + ch - 48;
            ch = getc();
        }
        x = f ? -x : x;
        read(oth...);
    }
    template <typename T, typename... T2>
    inline void print(T x, T2... oth)
    {
        if (p3 > 1 << 20)
            flush();
        if (x < 0)
            buf2[++p3] = 45, x = -x;
        do
        {
            a[++p] = x % 10 + 48;
        } while (x /= 10);
        do
        {
            buf2[++p3] = a[p];
        } while (--p);
        print(oth...);
    }
} // namespace FastIO
#define read FastIO::read
#define write FastIO::print
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b) { return a / gcd(a, b) * b; };
ll ksm(ll a, ll n)
{
    ll ans = 1;
    while (n)
    {
        if (n & 1)
            ans = (ans * a) % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans % mod;
}
//==============================================================
const int maxn=105;
#define MOD(x) (((x)%mod+mod)%mod)
ll n,p[maxn];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    //clock_t c1 = clock();
    //===========================================================
    read(n);
    int sum=0;
    rep(i,1,n)read(p[i]),sum=(sum+p[i]);
    for(int i=1;i<=n;++i){
        p[i]=MOD(p[i]*ksm(sum,mod-2));
    }
    ll fval=1;
    for(int i=1;i<=n;++i){
        fval*=ksm(1-p[i],mod-2);
        fval=MOD(fval);
    }
    ll gval=0;
    for(int i=1;i<=n;++i){
        gval+=1ll*p[i]*ksm(1-p[i],mod-2);
        gval=MOD(gval);
    }
    ll f_val=gval*fval;
    cout<<MOD(f_val*2%mod+fval)<<endl;
    //===========================================================
    FastIO::flush();
    //std::cerr << "Time:" << clock() - c1 << "ms" << std::endl;
    return 0;
}

总结:概率论薄弱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值