SMU Summer 2024 Contest Round 7

Make Equal With Mod

题意

给定一个长度为 \(n\) 的数列 \(a\)。你可以执行若干次操作,每次操作选择一个大于等于 \(2\) 的整数 \(x\),然后对于所有的 \(1\leqslant i\leqslant n\),将 \(a_i\) 替换为 \(a_i\bmod x\)。

请判断是否有一种操作序列,使得依次执行完该操作序列中的所有操作之后,数列中的所有数都相等。

思路

最小模数为 2,因此原生的 0 和 1 是无法被消掉的,也就是说,只要存在 1 和 0 ,这个序列就不可能相等,相差为 1 的两个数不管怎么消都会存在一个 0 ,然后再判断下原来有没有 1 即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

void solve() {

    int n;
cin >> n; int one = 0;
vector<int>a(n + 1);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
one += a[i] == 1;
} sort(a.begin() + 1, a.end()); for (int i = 2; i <= n; i ++) {
if (a[i] == a[i - 1] + 1 && one) {
cout << "NO\n";
return ;
}
} cout << "YES\n"; return;
} int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int t;
cin >> t;
while (t--) {
solve();
} return 0;
}

Game on Ranges

题意

Alice 和 Bob 在玩一个和区间有关的有趣的游戏。他们手上有一个集合 \(S\),里面一开始只有一个区间 \([1,n]\)。我们定义一个区间 \([a,b]\) 是合法的,当且仅当 \(a\leqslant b\)。在每一步操作中,Alice 可以从集合 \(S\) 中选出一个区间 \([l,r]\),然后让 Bob 在这个区间中选择一个整数 \(d\),Alice 随后会把区间 \([l,r]\) 从集合 \(S\) 里面拿出,放入区间 \([l,d-1]\) 和 \([d+1,r]\) 中所有合法的区间。当集合 \(S\) 为空时,游戏结束。我们不难发现这个游戏进行了恰好 \(n\) 次操作。

游戏之后,Alice 记得所有她取出来的区间 \([l,r]\) 但是不记得取这些区间的先后顺序,而 Bob 完全忘记了他从每个区间中取出的整数 \(d\)。然而众所周知,Bob 是绝顶聪明的,因此他知道他可以根据 Alice 取出的区间来判断他在每个区间中选出了哪个整数 \(d\)。现在,请你帮助 Bob 完成这个工作。

思路

考虑从大区间往小区间判断顺序。

每次只会消掉一个数,也就是说每消掉第 i 个数,那么剩下的区间肯定还覆盖 n-i 个数,对区间用差分前缀和维护覆盖的数,然后每次判断那些数是新被消掉的即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

void solve() {

    int n;
cin >> n; vector<array<int, 2>> qu(n);
for (auto &[l, r] : qu) {
cin >> l >> r;
} sort(qu.begin(), qu.end(), [](auto x, auto y) {
return x[1] - x[0] > y[1] - y[0];
}); set<int> s;
for (int i = 0; i < n; i ++) { auto [lo, ro] = qu[i]; int len = 0;
vector<int> f(n + 2);
for (int j = i + 1; j < n; j ++) {
auto [l, r] = qu[j];
len += r - l + 1;
f[l]++, f[r + 1]--;
}
for (int j = 1; j <= n; j ++) {
f[j] += f[j - 1];
if (!f[j] && !s.count(j)) {
s.insert(j);
cout << lo << ' ' << ro << ' ' << j << '\n';
break;
}
}
} cout << '\n'; } int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int t;
cin >> t;
while (t--) {
solve();
} return 0;
}

Buy an Integer

题意

从 \(i=1\sim1e9\) 找到满足 \(A\times i + B\times d(i) \le X\) 的最大数 i,\(d(i)\) 表示 i 的位数。

思路

提示数据范围了,很明显二分。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); i64 A, B, X;
cin >> A >> B >> X; i64 l = 0, r = 1e9, ans = 0;
while (l <= r) {
i64 mid = l + r >> 1;
int len = to_string(mid).size();
if (A * mid + B * len <= X) l = mid + 1, ans = mid;
else r = mid - 1;
} cout << ans << '\n'; return 0;
}

String Formation

题意

给你个字符串 \(S\),\(Q\) 次操作,操作 1 翻转字符串,操作 2 根据 F 的值在字符串前后添加一个字符,问最终字符串。

思路

难点在于翻转,考虑翻转对操作 2 的影响其实就是操作 2 的两个操作相反,所以只要记录一个值代表当前字符串是否翻转即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); string s;
cin >> s; int q;
cin >> q; int re = 0;
while (q--) {
int op;
cin >> op;
if (op == 1) {
re ^= 1;
} else {
int f;
char c;
cin >> f >> c;
if (re) {
if (f == 1) s += c;
else s = c + s;
} else {
if (f == 2) s += c;
else s = c + s;
}
}
} if (re) reverse(s.begin(), s.end()); cout << s << '\n'; return 0;
}

Bouquet

题意

你有 n 种不同的花,每种花只有一朵,问你选出的方案数其种类数量不为 a 或 b 的方案数。

思路

根据题意,即求 :

\[2^n-C_n^a-C_n^b
\]

n 大到 1e9 ,直接求肯定不现实,考虑转化 \(C_n^a=\frac{n\times(n-1)\times\dots\times(n-a+1)}{A_a^a}\),b 同理。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

const i64 mod = 1e9 + 7;

i64 ksm(i64 x, i64 y) {
i64 res = 1;
while (y) {
if (y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
} i64 A(i64 n, i64 m) {
i64 res = 1;
for (int i = m; i >= 1; i--) {
res = res * n % mod;
n--;
}
return res % mod;
} int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); i64 n, a, b;
cin >> n >> a >> b; i64 x = 1, y = 1;
for (int i = 0; i < a; i ++) {
x = x * (n - i) % mod;
} x = x * ksm(A(a, a), mod - 2) % mod; for (int i = 0; i < b; i ++) {
y = y * (n - i) % mod;
} y = y * ksm(A(b, b), mod - 2) % mod; cout << (ksm(2, n) - x - y - 1 + mod + mod) % mod << '\n'; return 0;
}

Permutation

题意

第一行给定 \(n\) 和 \(m\)。后 \(m\) 行,每行给定一个规则。

  • 规则:后 \(m\) 行每行给出三个整数 \(X_i,Y_i,Z_i\),表示在排列的前 \(X_i\) 个数字中最多只能有 \(Z_i\) 个数字小于等于 \(Y_i\)。

构造长度为 \(n\) 的排列,求最多可以构造多少个满足所有规则的排列。

思路

考虑状压。

以 i 为状态,每个位置上有 1 则说明选了一个数,用 __builtin_popcount这个函数计算出二进制中的 1 ,当选的个数小于 \(X_j\) 时,用 \(i \& ((1<<Y_j)-1)\) 判断这个状态在前 \(Y_j\) 的位置上放置的个数有没有大于 \(Z_j\) ,存在则说明该状态不合法,跳过即可。

之后就是判断每一位是否为 1 ,是就加上把不放这个数,也就是把这个位置置为 0 的方案数。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, m;
cin >> n >> m; vector<array<int, 3>> a(m);
for (auto &[x, y, z] : a)
cin >> x >> y >> z; vector<i64> dp(1 << n);
dp[0] = 1;
for (int i = 0; i < (1 << n); i ++) {
bool f = 1;
for (int j = 0; j < m; j ++) {
auto [x, y, z] = a[j];
if (__builtin_popcount(i) <= x && __builtin_popcount(i & ((1 << y) - 1)) > z)
f = 0;
} if (!f) continue; for (int j = 0; j < n; j ++) {
if (i >> j & 1)
dp[i] += dp[i - (1 << j)];
}
} cout << dp[(1 << n) - 1] << '\n'; return 0;
}

String Cards

题意

给出 N 个串,请你在其中选出 K 个串,使得这 K 个串前后拼接形成的串字典序最小。

思路

乍一看是简单题,可能认为排序而已,但是2 2 b ba 该数据就可以卡掉。

考虑按照 \(s_i+s_{i+1}>s_{i+1}+s_i\) 这样排序使得其相对拼接后更小,然后采用 dp 的方式滚掉第一维倒序选取 k 个字符串。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, k;
cin >> n >> k; vector<string> s(n + 1);
for (int i = 1; i <= n; i ++)
cin >> s[i]; sort(s.begin() + 1, s.end(), [](auto x, auto y) {
return x + y > y + x;
}); vector<string> dp(k + 1, string(1, 'z' + 1)); dp[0] = "";
for (int i = 1; i <= n; i ++) {
for (int j = min(i, k); j >= 1; j --) {
dp[j] = min(dp[j], s[i] + dp[j - 1]);
}
} cout << dp[k] << '\n'; return 0;
}

SMU Summer 2024 Contest Round 7的更多相关文章

  1. 2015 Astar Contest - Round 3 题解

    1001 数长方形 题目大意 平面内有N条平行于坐标轴的线段,且不会在端点处相交 问共形成多少个矩形 算法思路 枚举4条线段的全部组合.分别作为矩形四条边.推断是否合法 时间复杂度: O(N4) 代码 ...

  2. Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression

    题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...

  3. Codeforces Round #284 (Div. 2)A B C 模拟 数学

    A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. Sending messages to non-windowed applications -- AllocateHWnd, DeallocateHWnd

    http://delphi.about.com/od/windowsshellapi/l/aa093003a.htm Page 1: How Delphi dispatches messages in ...

  5. Codeforces 240 F. TorCoder

    F. TorCoder time limit per test 3 seconds memory limit per test 256 megabytes input input.txt output ...

  6. cf499B-Lecture 【map】

    http://codeforces.com/problemset/problem/499/B B. Lecture     You have a new professor of graph theo ...

  7. Codeforces 240F. TorCoder 线段树

    线段树统计和维护某一区间内的字母个数.. . . F. TorCoder time limit per test 3 seconds memory limit per test 256 megabyt ...

  8. 物联网学生科协第三届H-star现场编程比赛

    问题 A: 剪纸片 时间限制: 1 Sec 内存限制: 128 MB 题目描写叙述 这是一道简单的题目,假如你身边有一张纸.一把剪刀.在H-star的比赛现场,你会这么做: 1. 将这张纸剪成两片(平 ...

  9. [cf contest 893(edu round 33)] F - Subtree Minimum Query

    [cf contest 893(edu round 33)] F - Subtree Minimum Query time limit per test 6 seconds memory limit ...

  10. 水题 Codeforces Round #307 (Div. 2) A. GukiZ and Contest

    题目传送门 /* 水题:开个结构体,rk记录排名,相同的值有相同的排名 */ #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. java并发的发布和订阅测试

    现在编码的时候,为了处理消息,大家动不动就上个重器,例如MQ之类的.但很多时候,并不是那么有必要,因为数据量和并发其实远远不够. 可以替代的方案非常多,其中一个是java.util.concurren ...

  2. jsp---------------------复选框,全选按钮

    js部分:注意:<script type="text/javascript" ></script>内不能有其他内容,否则会无效,若有则另起一对<scr ...

  3. 使用flume将数据sink到HBase

    ===========>先创建Hbase表和列族<================案例1:源数据一行对应Hbase的一列存储(hbase-1.12没有问题)================ ...

  4. 【ClickHouse】1:clickhouse安装 (CentOS7)

    一:安装clickhouse 官网地址:https://clickhouse.tech/#quick-start 按照官网提供的方法快速安装:(依次执行) sudo yum install yum-u ...

  5. IOS浏览器返回刷新页面

    $(function () { var isPageHide = false; window.addEventListener('pageshow', function () { if (isPage ...

  6. 分布式文件系统 FastDFS 整理

    1.FastDFS 1.1.了解基础概念 1.1.1.什么是分布式文件系统? 全称:Distributed File System,即简称的DFS 这个东西可以是一个软件,也可以说是服务器,和tomc ...

  7. 手把手教你解决spring boot导入swagger2版本冲突问题,刘老师教编程

    手把手教你解决spring boot导入swagger2版本冲突问题 本文仅为个人理解,欢迎大家批评指错 首先Spring Boot 3 和 Swagger 2 不兼容.在 Spring Boot 3 ...

  8. debian12 安装ch343驱动

    前言 最近心血来潮,装了一台debian12玩,安装完毕arduino后发现没有ch343驱动,倒是在 ls /lib/modules/6.1.0-13-amd64/kernel/drivers/us ...

  9. java 高效递归查询树 find_in_set 处理递归树

    建表语句 DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `sys_dept` ( `id` bigint(20) NOT NULL AUTO_INCREM ...

  10. 存储器与CPU的连接

    存储器与CPU连接分主要看前五步 1.首先根据给出的地址范围写出二进制码 2.确定芯片的类型和数量 3.确定地址线 4.确定片选信号 要注意MREQ是低电平有效,要连到138译码器的低电平