牛客多校2024-8

K - Haitang and Ava

怎么还有人签到题wa啊/kk
定义以下的字符串是合法的:

  1. 空字符串
  2. \(S\)是合法的,那么\(S\)+avaava+\(S\)都是合法的
  3. \(S\)是合法的,那么\(S\)+avavaavava+\(S\)都是合法的
    给定一个字符串,判断是否合法。

以v为分隔计数a,容易发现计数数组中除了开头和末尾不能有两个1相邻,2可以任意。
(然后发现可以直接从开头截取avava或者ava,前者优先,简单了114514倍)


int T = next();
while(T--)
{string str; cin>>str;bool no = 0;for(auto ch: str) if (ch != 'a' && ch != 'v') no = 1; if (no) { cout<<"No"<<endl; continue; }int cnt = 0;vector<int> a;rep(i, 0, str.size()){if (str[i] == 'a') cnt++;else a.push_back(cnt), cnt = 0;}if (cnt != 1 || a[0] != 1) no = 1; // 开头或末尾a个数>=2if (no) { cout<<"No"<<endl; continue; }a.erase(a.begin());rep(i, 0, a.size()){if (i && a[i] == a[i-1] && a[i] == 1) no = 1;if (!a[i] || a[i] > 2) no = 1; // 连续的v个数>1或连续的a个数>2}if (no) cout<<"No"<<endl;else cout<<"Yes"<<endl;
}

int T = next();
while(T--)
{string str; cin>>str;bool no = 0;int i = 0;while(i < str.size()){if (str[i] == 'a' && str[i+1] == 'v' && str[i+2] == 'a'){if (i+4 < str.size() && str[i+3] == 'v' && str[i+4] == 'a') i += 5;else i += 3;}else { no = 1; break; }}if (no) cout<<"No"<<endl;else cout<<"Yes"<<endl;
}


A - Haitang and Game

AliceBob 对于集合\(a\)中的数玩一个游戏。Alice 先行。一次行动为:
对于\(x, y \in S\)并且\(gcd(x, y) \notin S\),将\(gcd(x,y)\)插入\(S\)
没法行动的人输掉。理想情况下输出胜者。
\(T \leq 20,n \leq 1e5,a_i \leq 1e5\)


首先发现插入\(gcd(x,y)\)并不能让另一个玩家有更多操作选项,因此不存在博弈。
问题从而转化成了求\(gcd(x,y) \notin S\)的数量,从而得出奇偶。
思考一会儿发现,单从\(a_i\)的质因数讨论可能的\(gcd\)困难重重。观察到\(a_i \leq 1e5\),可以直接从值域入手。考虑一个数\(t \notin a\),记\(a'=\{kt\ |\ k \in \mathbb{N_+},kt \in a\}\),那么\(gcd(a')=pt(p \in \mathbb{N_+})\)。如果\(p=1\),则\(t\)会被加入进\(a\)。枚举\(t\)模拟上述过程即可。


int T = next();
while(T--)
{memset(vis, 0, sizeof(vis));int n = next();rep(i, 0, n) cin>>w[i], vis[w[i]] = 1;int cnt = 0;hrp(i, 1, 1e5) if (!vis[i]){vector<int> v;for(int j = i; j <= 1e5; j += i) if (vis[j]) v.push_back(j);if (v.empty()) continue;int gcd = v[0];rep(i, 1, v.size()) gcd = __gcd(gcd, v[i]);if (gcd == i) cnt++;}if (cnt%2) cout<<"dXqwq"<<endl;else cout<<"Haitang"<<endl;
}


E - Haitang and Math

定义\(S(m)\)\(m\)所有数位和。给定\(n\),求满足\(m \leq n\)\(n\mod m=S(m)\)\(m\)个数。
\(n \leq 1e12\)


因为\(n \leq 1e12\),所以\(S(m) \leq 108\)。从而将条件转化为\(n-S(m) \mod m = 0\)
考虑枚举\(S(m)\)的值,可以得到集合\(R=[n-108, n-1]\)。再判断\(R\)中元素的因数是否等于当前\(S(m)\)的值即可。


然而不幸的是,对于\(R\)中每个元素求质因数会TLE。因此需要优化,从而引出了区间筛这个东西(我也不知道这是什么?)。
对于每个质数\(p \leq sqrt(n)\),我们只需要考虑它们在\(R\)中的倍数即可。因此有两种方法:

  1. 如果\(n\%p \geq 108\),它不可能是\(R_i\)的因数,因此可以直接跳过。
  2. 只枚举\(R\)\(p\)的倍数。

实测两种方法都跑进了200ms,第一种略快。代码采用的是第一种。


const int U = 1e6+500;
bool isPrime[U];
vector<int> prime;
void Eratosthenes(int n)
{isPrime[0] = isPrime[1] = 0;hrp(i, 2, n) isPrime[i] = 1;hrp(i, 2, n) if (isPrime[i]){prime.push_back(i);for(int j = i; j <= n; j += i) isPrime[j] = 0;}
}
vector<pair<int, int>> fac[120];
vector<int> fs[120];
int ms[120];
int S(int e)
{int ans = 0;while(e) ans += e%10, e /= 10;return ans;
}
void dfs(int p, int e, int num)
{if (e == fac[p].size()){fs[p].push_back(num);return;}dfs(p, e+1, num);hrp(i, 1, fac[p][e].second) dfs(p, e+1, num *= fac[p][e].first);
}Eratosthenes(1e6+100);int T = next();
while(T--)
{int n = next(), cnt = 0;hrp(i, 1, 108) ms[i] = n-i, fs[i].clear(), fac[i].clear();for(int i = 0; prime[i]*prime[i] <= n; i++){if (prime[i] < 108) hrp(j, 1, 108) {if (ms[j] < prime[i]) continue;int cnt = 0;while(ms[j]%prime[i] == 0) ms[j] /= prime[i], cnt++;if (cnt) fac[j].push_back({prime[i], cnt});}else{int j = n%prime[i], cnt = 0;if (j > 0 && j <= 108) while(ms[j]%prime[i] == 0) ms[j] /= prime[i], cnt++;if (cnt) fac[j].push_back({prime[i], cnt});}}hrp(i, 1, 108) if (ms[i] > 1) fac[i].push_back({ms[i], 1});hrp(i, 1, 108) if (ms[i] > 0) dfs(i, 0, 1);hrp(i, 1, 108) for(auto v: fs[i]) if (v != i && S(v) == i) cnt++;cout<<cnt<<endl;
}

J - Haitang and Triangle

给定\(n,m\),构造一个满足以下条件的排列,或输出无解:
恰好有\(m\)个长度为\(3\)的子区间,使得这个子区间内的三个数能构成三角形。


显然:\(1,2,3,4,5,...\)是使\(m\)最大的排列。
这道题的关键在于观察到\(m=0\)的排列如何构成,锻炼观察力从现在做起!
观察到如果\(n\)\(3\)的倍数,记\(d=n/3\),那么\(d,2d,3d,d-1,2d-1,3d-1,d-2,...,d+1,2d+1\)\(m=0\)时的一种排列。考虑扩增这个排列,那么\(3d+1\)可以放在左边,\(3d+2\)可以放在右边,分别对应了\(n=3k+1\)\(n=3k+2\)的情况。
再考虑\(m \neq 0\)的情况,可以将\(a=n-m\)先按上述过程排列好。再将剩下\(m\)个数全都排列在排列右边。这种方法对于\(n=3k\)(\(3d+1 > d+1+2d+1\))和\(n=3k+2\)(\(3d+3>3d+2+2d+1\))的情况都成立,但对于\(n=3k+1\)(\(3d+2 = 2d+1+d+1\))的情况不成立。因此当\(m \neq 0\)的时候可以将\(3d+1\)\(3d+2\)换位后再将剩下\(m\)个数全都排列在排列右边。


int T = next();
while(T--)
{int n, m;cin>>n>>m;if (m >= n-2) { cout<<-1<<endl; continue; }int a = n-m, d = a/3;deque<int> dq;rev(i, d, 1) dq.push_back(i), dq.push_back(i+d), dq.push_back(i+2*d);if (a%3 == 1){if (!m) dq.push_front(a);else{dq.push_back(a);dq.push_front(a+1);hrp(i, a+2, n) dq.push_back(i);}}else{if (a%3 == 2) dq.push_front(a-1), dq.push_back(a);hrp(i, a+1, n) dq.push_back(i);}for(auto v: dq) cout<<v<<' ';cout<<endl;
}


D - Haitang and Uma Musume

非常困难的题目,当然题目指题面
![[Pasted image 20240915203300.png]]
进行一个赛马娘训练的模拟。


一个坑:只有summer值等于\(1\)的训练需要计数。


const double eps = 1e-6;
const int base[5][5][6] = {{{10, 0, 5, 0, 0, 2}, {0, 9, 0, 4, 0, 2}, {0, 5, 8, 0, 0, 2}, {4, 0, 4, 8, 0, 2}, {2, 0, 0, 0, 9, 4}},{{11, 0, 5, 0, 0, 2}, {0, 10, 0, 4, 0, 2}, {0, 5, 9, 0, 0, 2}, {4, 0, 4, 9, 0, 2}, {2, 0, 0, 0, 10, 4}},{{12, 0, 5, 0, 0, 2}, {0, 11, 0, 4, 0, 2}, {0, 6, 10, 0, 0, 2}, {4, 0, 4, 10, 0, 2}, {3, 0, 0, 0, 11, 4}},{{13, 0, 5, 0, 0, 2}, {0, 12, 0, 4, 0, 2}, {0, 6, 11, 0, 0, 2}, {4, 0, 4, 11, 0, 2}, {3, 0, 0, 0, 12, 4}},{{14, 0, 5, 0, 0, 2}, {0, 13, 0, 4, 0, 2}, {0, 7, 12, 0, 0, 2}, {5, 0, 5, 12, 0, 2}, {4, 0, 0, 0, 13, 4}}};
int cnt[10];
double coe[10] = {-0.2, -0.1, 0, 0.1, 0.2};
// base[lv][type][X]
struct SupportCard
{int friendd, drive, train;int initial[20], bonus[20];void input(void){cin>>friendd>>drive>>train;rep(i, 0, 5) cin>>initial[i];rep(i, 0, 5) cin>>bonus[i];}
} sc[10];
struct UmaMusume
{int attribute[20];int bonus[20];void input(void){rep(i, 0, 5) cin>>attribute[i];rep(i, 0, 5) cin>>bonus[i];}void check(void){rep(i, 0, 5) attribute[i] = min(attribute[i], 1200LL);}void init(void){attribute[5] = 120;rep(i, 0, 5) rep(j, 0, 6) attribute[i] += sc[j].initial[i];check();}
} uma;
struct Training
{int summer, weight, drive, type, lv, num;int card[20], friendd[20];void input(void){cin>>summer>>weight>>drive>>type>>num;rep(i, 0, num) cin>>card[i]>>friendd[i], card[i]--;}void level(void){if (summer) lv = 4;else lv = min(4LL, cnt[type]/4);}double stimulate(int ability){if (weight && !ability) return 0;level();double delta[10] = {base[lv][type][ability], 1, 1, 1, 1, 1};int sumPresentBonus = 0;rep(i, 0, num) sumPresentBonus += sc[card[i]].bonus[ability];delta[0] += sumPresentBonus;rep(i, 0, num) if (friendd[i]) delta[1] *= (1+0.01*sc[card[i]].friendd);int sumPresentTrain = 0;rep(i, 0, num) sumPresentTrain += sc[card[i]].train;delta[2] += 0.01*sumPresentTrain;int sumPresentDrive = 0;rep(i, 0, num) sumPresentDrive += sc[card[i]].drive;delta[3] += coe[drive]*(1+0.01*sumPresentDrive);delta[4] += 0.01*uma.bonus[ability];delta[5] += 0.05*num;double res = 1;rep(i, 0, 6) res *= delta[i];return res;}
} tr[100];uma.input();
rep(i, 0, 6) sc[i].input();
int n = next();
rep(i, 0, n) tr[i].input();
uma.init();rep(i, 0, n)
{rep(j, 0, 6){int t = tr[i].stimulate(j);uma.attribute[j] += t+eps; }uma.check();if (!tr[i].summer) cnt[tr[i].type]++;rep(j, 0, 6) cout<<uma.attribute[j]<<' ';cout<<endl;
}


G - Haitang and Rock Paper Scissors

dp套dp,咕咕咕



I - Haitang and Ranking

三位偏序,但单点修改第三维。只会cdq的有福了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI老照片修复神器,Anole下载介绍

最近AI老照片修复上色,再一次火出圈,一些社交平台关于此话题内容流量满满,尤其是在小红书和抖音火的不得了,本期文章就来给大家分享下AI修复老照片的方式方法 本文主要介绍使用Anole修复老照片的方法,只需输入一张黑白或彩色照片,即可得到修复后的彩色结果,让往日的老照…

肖健飞的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 进行自我评估,熟悉博客园的使用方法,阐述自己的课程期望姓名-学号 肖健飞-2022329301124一、自我介绍 (一)基本情况及爱好 我叫肖健飞,来自江苏泰州,是信息科学与工程学院22级自动化(2)班…

2024ICPC网络赛第一场题解(部分)

2024ICPC网络赛第一场题解和参考代码以及部分思路说明这一场基本纯挂件,给队友翻译翻译题面,帮队友打打板子了,可惜最后40sL题冲了一个 \(O(\frac{n^3}{w})\) 的bitset最后wa了,所以下面的题解我也只能看着队友代码说说大概,主要参考一下代码吧。 A 题意 给出32个队伍的能…

sign与unsigned的原理、数据存储与硬件的关系

目录关键字unsigned和signed数据在计算机中的存储原码 与 补码的转化与硬件关系原,反,补的原理:整型存储的本质变量存取的过程类型目前的作用十进制与二进制快速转换大小端字节序判断当前机器的字节序"负零"(-128)的理解截断建议在无符号类型的数值后带上u, 关键字un…

C++中对象的延迟构造

本文并不讨论“延迟初始化”或者是“懒加载的单例”那样的东西,本文要讨论的是分配某一类型所需的空间后不对类型进行构造(即对象的lifetime没有开始),更通俗点说,就是跳过对象的构造函数执行。 使用场景 我们知道,不管是定义某个类型的对象还是用operator new申请内存,…

黑客失误?76.2万车主,家庭住址信息泄露

​据Cybernews研究团队发现,一个包含76.2W名车主及其车辆详细信息的敏感数据库已经在网上泄露。这些数据托管在一个美国的IP地址上,首次发现是在8月4日,至少暴露了48小时。据该团队称,泄露的数据揭示了车主的敏感信息。泄露的细节几乎揭示了拥有车辆的个人的所有信息,包括…

C++ 在 Visual Studio 如何将指针星号设置成靠近变量而不是类型

“工具”->“选项”->“文本编辑器”->“C/C++”->“代码样式”->“格式设置”->“间距”->“指针/引用对齐方式”->“右对齐”。

Git冲突解决技巧

在多人协作的软件开发项目中,Git 冲突是不可避免的现象。当两个或更多的开发者同时修改了同一段代码,并且尝试将这些修改合并到一起时,冲突就发生了。解决这些冲突是确保代码库健康和项目顺利进行的关键。在多人协作的软件开发项目中,Git 冲突是不可避免的现象。当两个或更…

AI写作助手哪些好用?6款强大的AI写作助手值得收藏!

在内容创作日益重要的今天,AI写作助手已经成为许多创作者的得力工具。它们不仅能够提高写作效率,还能在一定程度上保证文章质量。面对市场上琳琅满目的AI写作助手,如何选择一款好用且适合自己的工具呢?以下推荐6款强大的AI写作助手,它们各具优势,助力创作者轻松应对各种写…

1928.规定时间内到达终点的最小话费,题解

1928. 规定时间内到达终点的最小花费 - 力扣(LeetCode) 有点难,参考官方题解代码: 利用了动态规划思想,逐步计算从起点到各个城市在不同时间下的最小费用。 1.代码解释,涉及,static关键字,constexpr关键字,INT_MAX除以2赋值的含义static constexpr int INFTY = INT_MA…

软件技术基础的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 向教师和助教介绍自己,并熟悉博客园 对课程的期望姓名 颜宇航学号 20223293011251.个人介绍 大家好,我是22自动化2班的颜宇航,来自浙江台州。很高兴能够在这里与大家分享自己的生活!我是一个…