ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-09-04 19:32:40  阅读:178  来源: 互联网

标签:24 include cout long 学长 tp HZOI mod define


成绩综述


$ 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有