【补】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
的数量只比1
多1
个。这样就很容易随机错误。
所以就拿了\(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