比赛链接
本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。
跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18869039
开题 + 补题情况
最近一直在准备期中考试,好久没写代码了,这场有点糖,前一个小时一题没开,实属红温,尤其是 1007,想了好久好久。
下周打南昌,自己第一次参加全国性的比赛,希望自己加油发挥吧!
1010 - 绳子切割
此题考查并查集(实际暴力也可以)。
我们删点是从大到小删,那么倒过来就是加点,加点就是从小到大加。
对于每一个点,连向比它小的结点的连通块,看是否能和 \(0\) 在同一块,如果不在,那么直接输出 \(0\),因为这个时候,它不和横梁同属一个连通块,说明它到 \(0\) 之间有点被删除了,进而导致该点被提前删除了。
点击查看代码- #include <bits/stdc++.h>
- #define inf32 1e9
- #define inf64 2e18
- #define ls o << 1
- #define rs o << 1 | 1
- using i64 = long long;
- using u64 = unsigned long long;
- using u32 = unsigned int;
- const int N = 2e5 + 9;
- struct DSU {
- std::vector<int> fa;
- DSU(int n) {
- fa.resize(n + 1);
- std::iota(fa.begin(), fa.end(), 0);
- }
- int root(int x) {
- return (fa[x] == x) ? x : (fa[x] = root(fa[x]));
- }
- void merge(int u, int v) {
- if(root(u) == 0) {
- fa[root(v)] = root(fa[u]);
- } else {
- fa[root(u)] = root(fa[v]);
- }
- }
- };
- void solve()
- {
- int n, m;std::cin >> n >> m;
- DSU dsu(n);
- std::vector<std::vector<int>> g(n + 1);
- for(int i = 1;i <= m;i ++) {
- int u, v;std::cin >> u >> v;
- g[u].push_back(v);
- g[v].push_back(u);
- }
- for(int i = 1;i <= n;i ++) {
- for(auto &x : g[i]) {
- if(i < x)continue;
- dsu.merge(i, x);
- }
- if(dsu.root(i) != 0) {
- std::cout << 0 << '\n';
- return;
- }
- }
- std::cout << 1 << '\n';
- }
- int main()
- {
- std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
- int t = 1;std::cin >> t;
- while(t --)solve();
- return 0;
- }
复制代码 1005 - 真爱口上
这个题看似是一个非常恶心的模拟题,但是题目有一个很重要的信息:所有的字符串都是符合规则的音节序列。也就意味着我们不需要判断串的合法性,只需要根据特征计数就行了。
- 基本音节结构:不难发现,一定是以元音结尾,因此只需要计算元音有多少个即可。
- 鼻音:单算 nn 相连的情况,特别注意比如 nnna 的情况,此时不能算为两个鼻音。
- 促音:计算 pp tt kk ss 的数量即可。
点击查看代码- #include <bits/stdc++.h>
- #define inf32 1e9
- #define inf64 2e18
- #define ls o << 1
- #define rs o << 1 | 1
- using i64 = long long;
- using u64 = unsigned long long;
- using u32 = unsigned int;
- const int N = 2e5 + 9;
- template<typename T>
- T up(T x, T y) {
- return (x + y - 1) / y;
- }
- void solve()
- {
- int v, w;std::cin >> v >> w;
- int h = w / 2 + 1;
- int l = w - h;
- int sum = v / h;
- v -= sum * h;
- int ans = 0;
- if(sum) {
- if(v > l)ans = sum + 1;
- else ans = sum;
- } else {
- ans = 1;
- }
- std::cout << ans << '\n';
- }
- int main()
- {
- std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
- int t = 1;std::cin >> t;
- while(t --)solve();
- return 0;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |