其他分享
首页 > 其他分享> > 【补】2022.7.24———HZOI【来自学长的馈赠4】

【补】2022.7.24———HZOI【来自学长的馈赠4】

作者:互联网

成绩综述


$ Rank 32/51 $

本场比赛随机化现象显著...

不过随机化真的好用

\(\mathfrak{T1}\ 活动投票\)

本来是个水题

然后看到了奇怪的东西

\(\color{red}{时限:0.5s\ 内存:2M}\)

\(?(缓缓打出一个问号)\)

先不说正解说说部分分,考场上我是怎么想的呢,既然我不能把数组全开完,那我不如就卡着空间开

然后,我对于输入的\(a_i\)以一定的概率加入数组

最后暴力统计

然后就成功地水到了\(30pts\)(因为subtask的原因,第二个子任务只通过了一半)

为什么没法\(A\)是很显然的。出题人应该是发现了我这样的小心思,然后就构造了类似如下的数据:

1, 1, 1, 1, 1....2, 2, 2, 2, 2, 2

2的数量只比11个。这样就很容易随机错误。

所以就拿了\(30pts\)跑路/kk

随机化代码

#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define _MARK "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ " "
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 400005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false);cin.tie(NULL), cout.tie(NULL);}
int n, mx, ider, tp;
// long long tim;
int q[N];
// int a[N];// 可恶
// map<int, int> mp;
void work(){
    // 我真服了,2MB能干啥
    // 睡觉用?
    // 我真服了
    // 那我不得写个随机化?
    // 我永远相信随机化!
    // 不过希望别MLE..
    random_device seed; mt19937 myrand(seed());
    cin >> n;// 可以搞一个n<50一类的东西,提高正确率
    if(n < 400000){
        q[0] = n;
        for(re i = 1 ; i <= n ; ++ i){
            cin >> q[i];
        }
        sort(q+1, q+n+1);
        // for(re i = 1 ; i <= q[0] ; ++ i)
        //     cout << q[i] << _;
        // Endl;
        for(re i = 2 ; i <= q[0] ; ++ i){
            if(q[i] == q[i-1]) ++ tp;
            else {
                if(tp > mx){
                    mx = tp, ider = q[i-1];
                }
                tp = 1;
            }
        }
        if(tp > mx){
            mx = tp, ider = q[q[0]];
        }
        cout << ider << '\n';
        return ;
    }
    for(re i = 1, qw ; i <= n ; ++ i){
        // cin >> qw, mp[qw] ++;
        cin >> qw;
        if((myrand() & 1) == 1 && (myrand() & 1) == 0 && (myrand() & 1) == 1){
            q[++ q[0]] = qw;// 理论上,额, 是1/8的概率
        }
        // if((double)(clock()-tim) * 1000 / CLOCKS_PER_SEC >= 490){
        //     break;
        // }
    }
    // cout << mp.find((n>>1)) << '\n';
    sort(q+1, q+q[0]+1); ider = q[1], tp = 1;
    // for(re i = 1 ; i <= q[0] ; ++ i)
    //     cout << q[i] << _;
    // Endl;
    for(re i = 2 ; i <= q[0] ; ++ i){
        if(q[i] == q[i-1]) ++ tp;
        else {
            if(tp > mx){
                mx = tp, ider = q[i-1];
            }
            tp = 1;
        }
    }
    if(tp > mx){
        mx = tp, ider = q[q[0]];
    }
    cout << ider << '\n';
}
// #define IXINGMY
char_phi main(){
    // tim = clock();
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

说正解

摩尔投票。摩尔投票正确性不用证明?我也懒得证了。。

这个是我扔到博客里的摩尔投票 但是没有证明((

代码

#include <iostream>
#include <iomanip>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define _MARK "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ " "
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false);cin.tie(NULL), cout.tie(NULL);}
int n, cnt, final_ans;
void work(){
    cin >> n;
    for(re i = 1, rs ; i <= n ; ++ i){
        cin >> rs;
        if(cnt == 0)
            cnt = 1, final_ans = rs;
        else {
            if(rs != final_ans)
                cnt --;
            else 
                cnt ++;
        }
    }
    cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

\(\mathfrak{T2}\ 大佬\)

说实话真不该回来补,这个题的思路已经完全没有了

也许当时贺了题解??

#include <iostream>
#include <iomanip>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define _MARK "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ " "
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 505
#define M 505
#define P 1000000007
#define mod %
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false);cin.tie(NULL), cout.tie(NULL);}
long long n, m, k, fz, final_ans;//\
     n个题 1~m难度 每天做k道
long long p[N];// p[i]最大值不超过i的概率 显然有p[1] = (1/m)^k, p[2] = (2/m)^k...\
                  然后再按照前缀和的思想,搞一下难度为i时的概率,就完了
inline long long ksm(long long A, long long B){
    long long res(1);
    while(B != 0){
        if((B & 1) == 1) res = res * A mod P;
        A = A * A mod P;
        B >>= 1;
    }
    return res;
}
void work(){
    cin >> n >> m >> k;
    // 注意到p[1]、p[2]..的分母都是一样的,所以我们只需要搞分子i^k
    for(re i = 1, rs ; i <= m ; ++ i){
        cin >> rs;
        p[i] = ksm(i, k);// i^k
        // 所以本次的概率就是p[i]-p[i-1](前缀和)
        fz = (fz + (rs*(p[i]-p[i-1] + P) mod P)) mod P;// 因为有 mod P,所以可能p[i]-p[i-1]变为负数
    }
    final_ans = (fz * ksm(ksm(m, k), P-2) mod P) * (n-k+1) mod P;
    cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

\(\mathfrak{T3}\ dp搬运工3\)

预设型\(dp\)。。好像也是贺的题解

部分分没什么好讲的,双层next_permutation

#include <iostream>
#include <iomanip>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define _MARK "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ " "
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
// 两个空的的数量 two_empty 小容斥一把
#define twem (n-( ((i-1)<<1) - j ) )
// 一个空一个有的数量 one_empty
#define onem ((i-1)-j)
#define N 55
#define P 998244353
#define mod %
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false);cin.tie(NULL), cout.tie(NULL);}
long long n, K, final_ans;
long long f[N][N][N*N];//\
  f[i][j][k] 该放数字i,有j个重复位置,有k的贡献(目前的∑MAX(Ai,Bi))
void work(){
    cin >> n >> K; f[0][0][0] = 1;
    for (re i = 1 ; i <= n ; ++ i){// 放数字i
        for (re j = 0 ; j <= i ; ++ j){// j个重复
            for (re k = 0 ; k <= n*n ; ++ k){// 有k的贡献
                if(f[i-1][j][k] == 0) continue;
                if (twem >= 0) 
                    f[i][j][k] = ( f[i][j][k] + ( f[i-1][j][k]*(twem * (twem-1) mod P) mod P) ) mod P;//让i直接暂时无用()\
                                                  直接转移过来    有这些种i放置的情况()
                if (twem >= 0) 
                    f[i][j+1][k+i] = ( f[i][j+1][k+i] + (f[i-1][j][k]*((( ( (twem*onem)<<1) mod P ) + twem) mod P ) mod P)) mod P;
                f[i][j+2][k+(i<<1)] = (f[i][j+2][k+(i<<1)] + (f[i-1][j][k] * (onem * onem mod P) mod P)) mod P;
            }
        }
    }
    for (re i = K ; i <= n*n ; ++ i)
        final_ans = (final_ans + f[n][n][i]) mod P;
    cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

Beautiful

这个弔题

部分分是爆搜+next_permutation

没\(A\)呢

所以又水了一篇博客

标签:24,include,cout,long,学长,tp,HZOI,mod,define
来源: https://www.cnblogs.com/charphi/p/16655755.html