Educational Codeforces Round 143 (Rated for Div. 2)(A~D)
创始人
2024-05-29 17:29:17
0

A. Two Towers

给出两个序列,有R有B,每次操作可以将一个序列后面的自负拿出来放到另一个序列的后面。是否能通过若干次操作,使得每一序列的相邻两个字符都不同。

思路:将其中一个序列翻转,判断一下即可。

AC Code:

#include typedef long long ll;
const int N = 1e5 + 5;
int t, n, m;
std::string a, b;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n >> m;std::cin >> a >> b;reverse(a.begin(), a.end());b = b + a;bool flag = true;int cnt = 0;for(int i = 1; i < n + m; i ++) {if(b[i] == b[i - 1]) {if(b[i] != b[i + 1] || i == n + m - 1)cnt ++;if(b[i] == b[i + 1] || cnt > 1) {flag = false;break;}}}std::cout << (flag ? "YES" : "NO") << '\n';}return 0;
}

B. Ideal Point

给出若干个区间,给出目标点k,问是否可以通过去掉若干个区间使得目标点在剩余区间的出现次数是最多的。

思路:对于每一个包含目标点的区间,缩小它的左右端点,若所有的区间内只有k出现次数最多才能满足条件。

AC Code:

#include typedef long long ll;
const int N = 105;
int t, n, k;
int l, r;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n >> k;int L = -100, R = 100;for(int i = 1; i <= n; i ++) {std::cin >> l >> r;if(l <= k && r >= k)L = std::max(l, L), R = std::min(r, R);}if(L == R && L == k) std::cout << "YES" << '\n';elsestd::cout << "NO" << '\n';}return 0;
}

C. Tea Tasting

给出n个人的喝茶的数量,和n种茶的数量,一开始i号人喝i号茶,然后向前走,i号人喝i-1号茶,求最后每个人能喝多少茶。

思路:求所有人喝茶数的前缀和,对于每种茶二分查找使得每个人能喝到自己预定的数量的茶,开头结尾两个点做差分标记,剩余的茶给下一个。然后每个人根据差分求前缀和得到答案。

AC Code:

#include typedef long long ll;
const int N = 2e5 + 5;
int t, n;
ll a[N], b[N], pre[N], ans[N], dif[N];int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n;for(int i = 0; i <= n + 1; i ++) {dif[i] = pre[i] = ans[i] = 0;}for(int i = 1; i <= n; i ++) {std::cin >> a[i];}for(int i = 1; i <= n; i ++) {std::cin >> b[i];pre[i] = pre[i - 1] + b[i];}for(int i = 1; i <= n; i ++) {int pos = std::lower_bound(pre + 1, pre + 1 + n, a[i] + pre[i - 1]) - pre;if(pre[pos] > a[i] + pre[i - 1] || pos == n + 1)pos --;dif[i] ++, dif[pos + 1] --;ans[pos + 1] += a[i] + pre[i - 1] - pre[pos]; }for(int i = 1; i <= n; i ++) {dif[i] += dif[i - 1];ans[i] += dif[i] * b[i];std::cout << ans[i] << " \n"[i == n];}}return 0;
}

D. Triangle Coloring

给出n个点,每三个分到一组中并两两相连,每条边有一个权值,且分成的三元组是偶数个。现在需要对每个点进行染色,染色需要满足两个条件,染色的颜色有红蓝两种,每种颜色染色的点必须是点数的一半。对于每种不同的染色,它的值是所有连着不同颜色点的边的权值之和。求最大的染色的值的种类有多少种。

思路:显然,每一个三元组对答案的最大贡献是两条边,既然要取到最大权值,那必然是每个三元组都贡献两条最长的边。计算种类时,对于一种颜色,要有一半的三元组是染两个点,这样的种类数是C(n / 3, n / 6)。然后在一个三元组中,当三条边同样长时,对答案的贡献是三种,即任意一个点染其他颜色;对于两条较短边一样长时,取最长边和任意一条短边,这样是两种选法,乘起来即可。

AC Code:

#include typedef long long ll;
const int N = 3e5 + 5;
int t, n;
ll w[N];template
struct ModInt {const static int mod = T;int x;ModInt(int x = 0) : x(x % mod) {}ModInt(ll x) : x(int(x % mod)) {} int val() { return x; }ModInt operator + (const ModInt &a) const { int x0 = x + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }ModInt operator - (const ModInt &a) const { int x0 = x - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }ModInt operator * (const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator / (const ModInt &a) const { return *this * a.inv(); }void operator += (const ModInt &a) { x += a.x; if (x >= mod) x -= mod; }void operator -= (const ModInt &a) { x -= a.x; if (x < 0) x += mod; }void operator *= (const ModInt &a) { x = 1LL * x * a.x % mod; }void operator /= (const ModInt &a) { *this = *this / a; }friend std::ostream &operator<<(std::ostream &os, const ModInt &a) { return os << a.x;}ModInt pow(int64_t n) const {ModInt res(1), mul(x);while(n){if (n & 1) res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b; std::swap(a, b);u -= t * v; std::swap(u, v);}if (u < 0) u += mod;return u;}};
typedef ModInt<998244353> mint;mint fact[N], invfact[N];void init(){fact[0] = invfact[0] = 1;for(int i = 1; i < N; i++) fact[i] = fact[i - 1] * i;invfact[N - 1] = fact[N - 1].inv();for(int i = N - 2; i; i--)invfact[i] = invfact[i + 1] * (i + 1);  
}inline mint C(int a, int b){if (a < 0 || b < 0 || a < b) return 0;return fact[a] * invfact[b] * invfact[a - b];
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);init();std::cin >> n;for(int i = 1; i <= n; i ++) {std::cin >> w[i];}mint ans = 1;int a[4] = {0};for(int i = 1; i <= n / 3; i ++) {a[3] = std::max({w[i * 3 - 2], w[i * 3 - 1], w[i * 3]});a[1] = std::min({w[i * 3 - 2], w[i * 3 - 1], w[i * 3]});a[2] = w[i * 3 - 2] + w[i * 3 - 1] + w[i * 3] - a[1] - a[3];if(a[1] == a[2] && a[1] == a[3]) ans *= 3;else if(a[1] == a[2])ans *= 2;}ans *= C(n / 3, n / 6);std::cout << ans << '\n';return 0;
}

os:这个自动取模的板子太好用了吧!

相关内容

热门资讯

尚德教育的老师教的怎么样? 尚德教育的老师教的怎么样?尚德教育机构有他们独有的教育方式,直播课程可以互动,没听懂的可以看回放反复...
真三赵云龙之心怎么合成 真三赵云龙之心怎么合成真三赵云龙之心怎么合成杀黄龙掉出来的。不过杀黄龙需要一些装备建议在单人模式下练...
小冰 和 小兵 的英文分别怎么... 小冰 和 小兵 的英文分别怎么写?拜托了各位 谢谢little ice little solder ...
进监狱为什么会被其他的犯人打? 进监狱为什么会被其他的犯人打?为什么呢?因为他们和大家一样相信弱肉强食的丛林法则!!!让你看看他们有...
有一本小说女主角叫林小溪男主角... 有一本小说女主角叫林小溪男主角叫李什么琛一不小心爱上总裁作者:聿天使主角:林小溪,李聿旻你问错地方了
百万新娘之爱无悔英杰是敏君亲生... 百万新娘之爱无悔英杰是敏君亲生的吗王英杰是林敏君跟王绍华的儿子,五十九集说了:王英杰是:林敏君、王绍...
女人在恋爱中通常有哪些误区?如... 女人在恋爱中通常有哪些误区?如何避免?女人在恋爱中误区有付出的多少与爱的程度为正比,如果你总觉得如果...
俩人去马尔代夫旅行结婚需要多少... 俩人去马尔代夫旅行结婚需要多少钱?从天津到马尔代夫旅行结婚需要多少钱 什么时候去合适 待上7天左右 ...
人是不是年龄越大越不敢动感情? 人是不是年龄越大越不敢动感情?人并不是年龄越大越不敢动感情,而是因为年龄越大就看透了这世间所有的感情...
说男主重生如何开加盟鞋店如何赚... 说男主重生如何开加盟鞋店如何赚钱的过程的小说。小说重生之超级商业帝国重生之最强富翁重生1978重生1...
拔萝卜儿歌改编歌曲 拔萝卜儿歌改编歌曲儿歌拔萝卜 拔萝卜. 嗨吆嗨吆,拔萝卜,嗨吆嗨吆,拔不动, 老太婆,快快来,快来帮...
为啥所有的付出再他就是一文不值... 为啥所有的付出再他就是一文不值你人与人之间"心已走远"。。。那就不在付出了,既然看透了,那就没必要付...
贝利亚奥特曼 贝利亚奥特曼贝利亚奥特曼有什么故事?他的性格很不好吗?赛罗奥特曼VS黑暗独眼巨人赛罗大怪兽大战!超银...
找一部日剧~~ 找一部日剧~~之前看到有人推荐过一部日剧,前两个字是“非常”后面几个字我忘了,请问有谁知道吗?应该是...
“一往如初”是什么意思? “一往如初”是什么意思?一往如初是什么意思还是像以前一样。一往:一直,始终。如:像。初:以前那样,一...
闲情倩意后面能连个什么句 闲情倩意后面能连个什么句连词后面也可以加有动词的句子. recoveries accrued to...
世界上最( )的( )... 世界上最( )的( )是世界上最(奇妙)的(感觉)是你爱上一个人的时候.世界上最(舒服)的(...
备胎说车:打蜡 封釉 镀膜 镀... 备胎说车:打蜡 封釉 镀膜 镀晶哪个好常规的保养漆面的方法有打蜡封釉,保持时间长久,和提升漆面的硬度...
下背痛的诊断 下背痛的诊断下背痛的诊断
金鼎猜一个数字 金鼎猜一个数字不知道啊啊啊啊金鼎猜一个数字是9