丽泽普及2022交流赛day15 社论
前言
太牛逼了,补完我一定放代码 .
orz 越看越牛逼 orz .
时间复杂度都是口胡,不要信 .
以下是目录
缺省源
/*
_/_/_/_/ _/_/_/_/_/ _/_/_/
_/ _/ _/ _/ _/
_/ _/ _/ _/ _/
_/ _/ _/ _/ _/
_/ _/ _/ _/ _/ _/
_/ _/ _/ _/ _/ _/_/
_/_/_/_/ _/_/ _/_/_/_/_/
_/_/_/_/ _/ _/ _/ _/
_/ _/ _/ _/ _/_/ _/_/
_/ _/ _/_/ _/ _/_/ _/
_/ _/ _/ _/ _/ _/
_/ _/ _/_/ _/ _/
_/ _/ _/ _/ _/ _/
_/_/_/_/ _/ _/ _/ _/
_/_/_/_/_/ _/_/_/_/_/ _/_/_/_/_/
_/ _/ _/
_/ _/ _/
_/ _/ _/_/_/_/
_/ _/ _/
_/ _/ _/
_/ _/_/_/_/_/ _/_/_/_/_/
_/_/_/_/_/ _/_/_/_/_/ _/_/_/_/_/
_/ _/ _/
_/ _/ _/
_/ _/ _/_/_/_/
_/ _/ _/
_/ _/ _/
_/ _/_/_/_/_/ _/_/_/_/_/
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <set>
前排膜拜 SoyTony
A
题面
小 S 手上有一个长度为 \(n\) 的单词。
现在,小 S 发现这个单词有M处被污染了(用 # 代替),已经看不出原来是什么了。
现在知道每个被污染的地方都有 \(K\) 个备选的可能字母。
现在,小 S 想要知道,在所有可能的单词里面,字典序第 \(X\) 小的是哪个?
题解
\(X-1\) 分解成 \(K\) 进制然后选 .
时间复杂度 \(O(X\log K)\) .
题解写的谔分 
代码
不知道为什么有人挂 \(60pts\) .
这题我倒是过得挺快,其他题全他妈挂飞 /ll.
using namespace std;
const int N = 1e5 + 500;
int n, m, k, x, cc;
string s;
struct Node
{
int pos;
string val;
}Q[N];
vector<int> vec;
int main()
{
scanf("%d%d%d%d", &n, &m, &k, &x); --x;
cin >> s; int l = s.length();
for (int i=0; i<l; i++)
if (s[i] == '#') Q[++cc].pos = i;
for (int i=1; i<=cc; i++)
{
cin >> Q[i].val;
sort(Q[i].val.begin(), Q[i].val.end());
}
for (int i=cc; i>=1; i--)
{
int now = x % k;
s[Q[i].pos] = Q[i].val[now];
x /= k;
}
cout << s << "\n";
return 0;
}
B
题面
一棵有点权的树,定义一条路径的权值是点权积除以点数量 .
求权值最小的路径权值 .
题解
牛逼结论题 .
SoyTony 说 APJ 说是屑题
显然有 \(1\) 都选上 .
然后可以选一个 \(2\),要不然答案会更劣 .
于是就随便做了 .
stO SoyTony Orz
时间复杂度 \(O(n)\) .
代码
看 SoyTony 的博客 .
枚举二,然后贡献分两半 .
完了 .
似乎错了,看 SoyTony 的吧 qwq
using namespace std;
inline int chkmin(int& a, const int& b){if (a > b) a = b; return a;}
inline int chkmax(int& a, const int& b){if (a < b) a = b; return a;}
const int N = 1e6 + 500, INF = 0x3f3f3f3f;
int n, v[N], f[N][2], g[N], ans1, ans2;
vector<int> G[N];
inline void addedge(int u, int v){G[u].emplace_back(v);}
inline void ade(int u, int v){addedge(u, v); addedge(v, u);}
void dfs1(int u, int fa)
{
int fst=0, sec=0;
for (int v : G[u])
{
if (v == fa) continue;
dfs1(v, u);
if (f[v][0] > fst){sec = fst; fst = f[v][0];}
else if (f[v][9] > sec) sec = f[v][0];
}
if (v[u] == 1){f[u][0] = fst+1; if (sec) f[u][1] = sec+1;}
}
void dfs2(int u, int fa)
{
if (v[fa] == 1)
{
g[u] = f[fa][f[u][0]+1 == f[fa][0]];
chkmax(g[u], g[fa]+1);
}
for (int v : G[u]) if (v != fa) dfs2(v, u);
}
void dfs3(int u, int fa)
{
if (v[u] == 1) chkmax(ans1, max(f[u][0]+f[u][1]-1, f[u][0]+g[u]));
else if (v[u] == 2)
{
int maxn = 0;
for (int v : G[u])
if (v != fa) chkmax(maxn, f[v][0]);
chkmax(ans2, max(maxn+f[u][1]-1, maxn+g[u]));
}
for (int v : G[u]) if (v != fa) dfs3(v, u);
}
int main()
{
scanf("%d", &n);
for (int i=1, u, v; i<n; i++) scanf("%d%d", &u, &v), ade(u, v);
int minn = INF;
for (int i=1; i<=n; i++) scanf("%d", v+i), chkmin(minn, v[i]);
if (minn > 1){printf("%d/1\n", minn); return 0;}
dfs1(1, 0); dfs2(1, 0); dfs3(1, 0);
++ans2;
if (ans1 * 2 >= ans2) printf("1/%d\n", ans1);
else
{
if (ans2 & 1) printf("1/%d\n", ans2>>1);
else printf("2/%d\n", ans2);
} return 0;
}
C
题面
小 S 在玩一个叫丢手绢的游戏 .
一共 \(n\) 个小朋友围成一圈,其中第 \(i\) 个小朋友的能力值是 \(P_i\) .
小 S 一共会丢 \(n\) 个手绢,其中第 \(i\) 个的能力值是 \(V_i\),且在丢第 \(i\) 个手绢的时候,他会先站在第 \(A_i\) 个小朋友身后。如果当前这个小朋友手上没有手绢,他就会把当前这个手绢交给这个小朋友。否则,他就会走向下一个人 .
现在,小 S 想要让尽量多的人得到的手绢能力值比他本身的能力值大。小 S 可以以任意顺序发放手绢 .
请问这个最大值是多少?
题解
链做法显然,就是随便贪心一下 .
大眼观察,可以发现必然存在一个位置 \(pos\) 可以把小朋友破环成链,于是我们只需找到这个位置 .
如果能破显然意味着没有手绢会经过 \(pos\to pos+1\)(模意义)
令 \(\Delta(l,r)\) 表示区间 \([l,r]\) 内手绢数量减小朋友数量 .
于是:
\]
\(j\) 是一个位置 .
然后分类推一下可以知道 \(\Delta(0,i)\) 最小 .
于是扫一遍就完了 .
时间复杂度 \(O(n\log n)\) .
代码
// set
using namespace std;
inline int chkmin(int& a, const int& b){if (a > b) a = b; return a;}
inline int chkmax(int& a, const int& b){if (a < b) a = b; return a;}
const int N = 5e5+500, INF = 0x3f3f3f3f;
int n, a[N], p[N], delta[N];
vector<int> c[N]; // children
set<int> s;
int main()
{
scanf("%d", &n);
for (int i=1; i<=n; i++) scanf("%d", a+i);
for (int i=1; i<=n; i++) scanf("%d", p+i);
for (int i=1, x; i<=n; i++) scanf("%d", &x), c[a[i]].emplace_back(x);
for (int i=1; i<=n; i++) delta[i] = delta[i-1] + c[i].size() - 1;
int minn = 0x3f3f3f3f, pos = 0, ans = 0;
for (int i=1; i<=n; i++)
if (minn > delta[i]){minn = delta[i]; pos = i;}
for (int i=1; i<=n; i++)
{
int tmp = (pos+i) % n;
if (!tmp) tmp = n;
for (int _ : c[tmp]) s.insert(_);
auto it = s.upper_bound(p[tmp]);
if (it == s.end()) s.erase(s.begin());
else{s.erase(it); ++ans;}
} printf("%d\n", ans);
return 0;
}
D
题面
给 \(n\) 个字符串 \(\{s_i\}\),可以任意打乱,最小化 Trie 的节点总数 .
题解
两个字符串 \(s_1,s_2\) 存在字典树里需要 \(|s_1|+|s_2|-|s_{\operatorname{lcp}(s_1,s_2)}|\) 个节点 .
因为可以随机打乱,于是 \(\operatorname{lcp}\) 只需要记每个字母存在的次数即可 .
然后显然这个玩意可以拆成两两合并的形式,于是状压 dp 即可 .
口胡了一个 Trie 算法,好像和 Keven_He 写的一样,保龄力
(枚举子集是 \(O(3^n)\) 的)
时间复杂度 \(O(\text{能过})\) .
代码
using namespace std;
inline int chkmin(int& a, const int& b){if (a > b) a = b; return a;}
inline int chkmax(int& a, const int& b){if (a < b) a = b; return a;}
const int N = 17, M = 1e6+500, Sig = 33, INF = 0x3f3f3f3f;
int n, cnt[N][Sig], dp[1<<N], pre[Sig];
string s;
int main()
{
scanf("%d", &n);
for (int i=1; i<=n; i++)
{
cin >> s; int l = s.length();
s = "$" + s;
for (int j=1; j<=l; j++) ++cnt[i][s[j]-'a'];
}
for (int i=0; i<(1<<n); i++)
{
dp[i] = 0;
memset(pre, 0x3f, sizeof pre);
for (int j=1; j<=n; j++)
if (i & (1<<(j-1)))
for (int k=0; k<26; k++){dp[i] += cnt[j][k]; chkmin(pre[k], cnt[j][k]);}
int _ = 0;
for (int j=0; j<26; j++) _ += pre[j];
for (int j = i&(i-1); j ; j = i&(j-1)) chkmin(dp[i], dp[j] + dp[i^j] - _);
}
printf("%d\n", dp[(1<<n)-1]+1);
return 0;
}
丽泽普及2022交流赛day15 社论的更多相关文章
- 丽泽普及2022交流赛day21 社论
A 暴力 . greater<double> -> greater<int> \(100\) -> \(50\) 代码丢了 . B dp . 考场上代码抢救一下就过 ...
- 丽泽普及2022交流赛day18 社论
A 暴力扫一遍 B 算法 0 似乎是二分 算法 1 随便贪心 C 算法 1 枚举一个点作为最大值 / 最小值,用单调栈维护其作为答案的左右端点即可轻易计算 . 时间复杂度 \(O(n)\) . 算法 ...
- 丽泽普及2022交流赛day17 社论
http://zhengruioi.com/contest/1088 SoyTony 重新 rk1 . stO SoyTony Orz 省流:俩计数 . 目录 目录 A 题面 题解 Key 算法 1( ...
- 丽泽普及2022交流赛day16 社论
这场比较平凡吧 . 省流: http://zhengruioi.com/contest/1087 目录 目录 A. Gene 题面 题解 算法一(正解) 算法二 B. Fight 题面 题解 算法一( ...
- 丽泽普及2022交流赛day20 1/4社论
目录 T1 正方形 T2 玩蛇 T3 嗷呜 T4 开车 T1 正方形 略 T2 玩蛇 略 T3 嗷呜 (插一个删一个?) 找出相同的,丢掉循环节 . 感觉非常离谱,,, 正确性存疑 正确性问 SoyT ...
- 丽泽普及2022交流赛day22 无社论
开始掉分模式 . T3 有人上费用流了???(id) 不用 TOC 了 . T1 暴力 T2 没看见 任意两圆不相交,gg 包含关系容易维护,特判相切 . 单调栈即可 T3 贪心 T4 神秘题
- 丽泽普及2022交流赛day19 半社论
目录 No Problem Str Not TSP 题面 题解 代码 Game 题面 题解 代码 No Problem 暴力 Str 存在循环节,大力找出来即可,长度显然不超过 \(10^3\) . ...
- 丽泽普及2022交流赛day14
目录 A 题面 题解 B 题面 题解 C 题面 题解 D 题面 题解 A 题面 一个 \(1\dots n\) 的排列 \(p\) 和一个 \(1\dots n-1\) 的排列 \(q\) 满足 对排 ...
- 记:青岛理工ACM交流赛筹备工作总结篇
这几天筹备青岛理工ACM交流赛的过程中遇到了不少问题也涨了不少经验.对非常多事也有了和曾经不一样的看法, 一直在想事后把这几天的流水帐记一遍,一直没空直到今天考完C++才坐下来開始动笔.将这几天的忙 ...
随机推荐
- 百万数据 mysql count(*)优化
一.故事背景有一张 500w 左右的表做 select count(*) 速度特别慢. 二.原 SQL 分析Server version: 5.7.24-log MySQL Community Ser ...
- 好客租房17-jsx的样式处理
1行内样式-style <h1 style={{color:"red",backgroundColor:"skyblue"}}> jsx的样式处理 ...
- 给小白的 PG 容器化部署教程(下)
作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,< ...
- Spring AOP快速使用教程
Spring是方法级别的AOP框架,我们主要也是以某个类的某个方法作为连接点,用动态代理的理论来说,就是要拦截哪个方法织入对应的AOP通知.为了更方便的测试我们首先创建一个接口 public in ...
- 001 手把手用Git,Git从入门到上传本地项目到Github,看这篇就够了
安装git 下载Git 下载好后,一路next即可 安装好后,打开Git bash,进行配置 首先配置自己的身份 git config --global user.name "Name&qu ...
- LVGL库入门教程01-移植到STM32(触摸屏)
LVGL库移植STM32 LVGL库简介 LVGL(Light and Versatile Graphics Library)是一个免费.开源的嵌入式图形库,可以创建丰富.美观的界面,具有许多可以自定 ...
- 七、服务器硬件及RAID配置实战
一.RAID磁盘阵列介绍 磁盘阵列的全名(Redundant Arrays of Inexpensive Disk,RAID),中文简称是独立冗余磁盘阵列.冗余(如果磁盘出现故障,可以保证数据不丢) ...
- QT字符串高效拼接原理QStringBuilder
这一篇文章讨论QT框架中QT字符串是如何实现高效拼接的. 1. QStringBuilder实例与原理 QT字符串高效拼接例子 备注: (a)上述代码仅仅在s2 = b1时一次性分配能够容纳所有字符串 ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- FS2K人脸素描属性识别
人脸素描属性识别 代码:https://github.com/linkcao/FS2K_extract 问题分析 需要根据FS2K数据集进行训练和测试,实现输入一张图片,输出该图片的属性特征信息,提取 ...
