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:这个自动取模的板子太好用了吧!

相关内容

热门资讯

2025年河北中考总分多少?2... 河北省教育厅发布关于做好2025年初中学业水平考试工作的通知↓↓↓河北省教育厅关于做好2025年初中...
花旗预计2026年阿里巴巴电商... 观点网讯:5月16日,花旗分析师在阿里巴巴公布3月份当季业绩后发布研究报告称,预计2026年阿里巴巴...
荒谬!网友相亲相到了“宋仲基”... 来源:新闻晨报 “相亲相到了宋仲基!”近日,有网友在社交网站上发帖称,有媒婆为其介绍相亲对象,不料发...
从“借船出海”到“造船远航”:... 转自:央视网央视网消息:今年以来,中国多家自主品牌车企纷纷加力布局海外市场,加大投入组建远洋运输船队...
外国记者走进乌兰哈达火山 看“... 转自:上观新闻“中国扩大免签政策之后,来旅行的外国游客是否有增加?”“每年淡季旺季的收入如何?”“在...
中美互降关税提振全球市场信心 “立即发货!”5月12日凌晨,美国玩具商福尔曼得知关税将调整的消息后,连夜催促中国供应商将因关税滞留...
兰州市城关区:实践硬举措涵养文... 城关区:实践硬举措涵养文明软实力  在城关区,文明实践活动蓬勃开展,一场场别出心裁的实践活动、一堂堂...
SOTA!上海AI独角兽发布新... 转自:上观新闻近日,来自上海的AI独角兽MiniMax稀宇极智发布新一代语音大模型Speech-02...
151只股中线走稳 站上半年线 证券时报·数据宝统计,截至今日上午收盘,上证综指3363.32点,收于半年线之上,涨跌幅-0.52%...
前4个月江苏对拉美进出口115... 2025年是中拉论坛正式运行10周年。跨越山海、万里为邻,证券时报记者了解到,当前,江苏企业正以开放...
中行贵州省分行原副行长徐鸿周离... 运营商财经网 赵鑫雨/文日前,官方网站发布了中国银行贵州省分行原副行长徐鸿周被开除党籍的相关消息。...
遏制克扣押金、随意涨租违约,房... 来源:央广网 央广网北京5月16日消息(记者安垚)据国家市场监督管理总局消息,近日,市场监管总局发布...
封顶!昆明这所三甲医院预计10... 5月14日,记者从云南省妇幼保健院获悉,位于官渡区、总投资超13亿元的云南省妇幼保健院新院主体结构正...
突然拉升20%涨停!批量封板,... 汽车产业链早间全线走强,其中豪恩汽电大幅拉升20%涨停。今日早盘,A股小幅震荡整理,科创50指数失守...
瑞银:阿里巴巴第四季度业绩整体... 观点网讯:5月16日,瑞银研究报告指出,阿里巴巴(BABA.US)2025财年第四季度业绩整体收入及...
从吉利博越L看自主紧凑型SUV... 来源:@经济观察报微博记者 周信5月13日,吉利第四代博越L在杭州富春江畔上市,限时售价9.29万元...
深圳龙华区福城街道冼屋老村片区... 观点网讯:5月16日,深圳市龙华区福城街道冼屋老村片区东侧地块城市更新项目(一期)、(二期)实施主体...
重磅!国务院国资委最新部署,深... 5月15日,国务院国资委全面深化改革领导小组召开2025年第一次全体会议。2025年是国企改革深化提...
母亲殴打女儿致死?当地通报:刑... 近日,网传浙江温州市瓯海区“一母亲因殴打女儿致其死亡”。5月15日,瓯海区郭溪街道办事处发布情况通报...
弘扬好家教 传承好家风!这个主... 转自:草原云5月14日,鄂尔多斯市准格尔旗精神文明建设办公室、准格尔旗新时代文明实践服务中心联合准格...