『模拟赛』NOIP2024加赛6
Rank
大奋场,T3 没切有点菜
A. 草莓
和前天多校 T3 很像,所以一眼鉴定为贪心,从大到小选比从小到大选一眼优,代价一样时横竖无所谓先后,然后 sort 一遍就做完了,复杂度
点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x) = (y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x) = (y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch = getchar();lx x = 0 , f = 1;
for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;
for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);
return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define P_B(x) push_back(x)
#define pii pair<int , int>
const int Ratio = 0;
const int N = 2e5 + 5;
int n, m;
pii a[N << 1];
ll ans;
namespace Wisadel
{
short main()
{
freopen("guiltiness.in", "r", stdin) , freopen("guiltiness.out", "w", stdout);
n = qr, m = qr;
int tot = n + m - 2;
fo(i, 1, n - 1) a[i].fi = qr, a[i].se = 1;
fo(i, 1, m - 1) a[n - 1 + i].fi = qr, a[n + i].se = 2;
sort(a + 1, a + 1 + tot, [](pii A, pii B){return A.fi > B.fi;});
int timn = 0, timm = 0;
fo(i, 1, tot)
{
int zc = (a[i].se == 1 ? timm : timn) + 1;
ans += 1ll * a[i].fi * zc;
a[i].se == 1 ? timn++ : timm++;
}
printf("%lld\n", ans);
return Ratio;
}
}
signed main(){return Wisadel::main();}
为什么强调 10min 切的🤔🤔?猜猜后面 4h20min 在干嘛(
B. 三色
赛时处于一种很疲倦的状态,本来不困的,但看到周围的人都困,就困了。没想到 dp 我是 fw。
考虑优化到
最后转移到右端点为
点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch = getchar(); lx x = 0, f = 1;
for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
return x * f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define pii pair<int, int>
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
const int Ratio = 0;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n, m;
ll s[N], zc[N];
pii d1[N], d2[N];
vector<ll> A[N], B[N], p, q, f;
namespace Wisadel
{
short main()
{
freopen("color.in", "r", stdin), freopen("color.out", "w", stdout);
int T = qr;
while(T--)
{
n = qr, m = qr;
fo(i, 0, n) d1[i] = d2[i] = M_P(0, 1e9), s[i] = 0, A[i].clear(), B[i].clear();
f.clear(), p.clear(), q.clear();
fo(i, 1, m)
{
int l = qr, r = qr, d = qr;
if(d == 1) d2[r].se = min(d2[r].se, l - 1);
if(d == 2) d2[r].fi = max(d2[r].fi, l), d1[r].se = min(d1[r].se, l - 1);
if(d == 3) d1[r].fi = max(d1[r].fi, l);
}
ll ans = 0;
A[0].P_B(f.size()), B[0].P_B(f.size()), s[0] = 2, f.P_B(1);
p.P_B(0), q.P_B(0);
fo(i, 0, n)
{
fo(j, 0, i)
{
if(j < d2[i].fi || j > d2[i].se)
{
for(int x : A[j]) s[p[x]] = (s[p[x]] - f[x] + mod) % mod, s[q[x]] = (s[q[x]] - f[x] + mod) % mod, f[x] = 0;
A[j].clear();
}
if(j < d1[i].fi || j > d1[i].se)
{
for(int x : B[j]) s[p[x]] = (s[p[x]] - f[x] + mod) % mod, s[q[x]] = (s[q[x]] - f[x] + mod) % mod, f[x] = 0;
B[j].clear();
}
}
if(i < n)
{
fo(j, 0, i) zc[j] = s[j];
fo(j, 0, i) if(zc[j]) A[i].P_B(f.size()), B[j].P_B(f.size()), f.P_B(zc[j]), p.P_B(i), q.P_B(j), s[i] = (s[i] + zc[j]) % mod, s[j] = (s[j] + zc[j]) % mod;
}
else fo(j, 0, n) ans = (ans + s[j]) % mod;
}
printf("%lld\n", ans * 500000004 % mod);
}
return Ratio;
}
}
signed main(){return Wisadel::main();}
C. 博弈
看到博弈,啪的一下,很快啊,就点进来了,然后发现不会做。
其实会做的,只是赛时少考虑了亿点点先手必败的局面(
设留下的数为
已知当
有什么用呢?来证三者互不相等时一定先手必胜。考虑当
那么考虑三者有相等时怎么做。比较显然三者都相等时先手必败,故只考虑
研究下这是什么,容易想到 lowbit 位数为偶时必胜。
然后考虑实现。由于用到 lowbit 为某值时的个数,所以倒着建一棵 trie,读入时插入每个数,排序后扫一遍,简单容斥
点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch = getchar(); lx x = 0 , f = 1;
for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;
for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);
return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define P_B(x) push_back(x)
#define pii pair<int, int>
const int Ratio = 0;
const int N = 5e5 + 5;
int n, tot;
ll a[N];
ll C[N][4];
int t[N << 6][2], cnt[N << 6];
namespace Wisadel
{
inline void Wclear(int x){t[x][0] = t[x][1] = cnt[x] = 0;}
inline void Wins(ll x)
{
int now = 0;
fo(i, 0, 60)
{
int to = (x >> i) & 1;
if(!t[now][to]) t[now][to] = ++tot, Wclear(tot);
now = t[now][to], cnt[now]++;
}
}
inline int Wq(ll x)
{
int now = 0, res = 0;
fo(i, 0, 60)
{
int to = (x >> i) & 1;
if(i & 1) res += cnt[t[now][to ^ 1]];
now = t[now][to];
}
return res;
}
short main()
{
freopen("game.in", "r", stdin), freopen("game.out", "w", stdout);
int T = qr;
C[1][1] = C[2][2] = C[3][3] = C[3][0] = 1;
C[2][1] = 2, C[3][1] = C[3][2] = 3;
fo(i, 4, N - 5)
{
C[i][0] = 1;
fo(j, 1, 3) C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
while(T--)
{
n = qr; tot = 0;
Wclear(0);
fo(i, 1, n) a[i] = qr, Wins(a[i]);
sort(a + 1, a + 1 + n);
a[n + 1] = -1;
ll ans = C[n][3];
int num = 0;
fo(i, 1, n)
{
num++;
if(a[i] != a[i + 1])
{
ans -= C[num][3] + C[num][2] * (n - num - Wq(a[i]));
num = 0;
}
}
printf("%lld\n", ans);
}
return Ratio;
}
}
signed main(){return Wisadel::main();}
D. 后缀数组
不会。暴力也不会。
末
开学第一场,大家的状态和放假前那一场一样好啊!
赛时小睡了一会,然后 T3 疯狂漏容斥,然后 T2 T4 疯狂不会,然后结束了。
睡着了,呼~ 呼~
完结撒花~
醒了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探