Educational Codeforces Round 176

news/2025/3/22 13:28:10/文章来源:https://www.cnblogs.com/wenqizhi/p/18786466

Dashboard - Educational Codeforces Round 176 (Rated for Div. 2) - Codeforces

A 贪心 数学 模拟
B 贪心 构造
C 组合数学
D 暴力

Problem - E - Codeforces ^e8e652

题意:
给定 \(n,m,A,B\),你需要计算数组对 \((a,b)\) 的个数,满足 \(a\) 的长度为 \(n\)\(a_i\in [0,A]\)\(b\) 的长度为 \(m\)\(b_i\in [0,B]\),令矩阵 \(X_{i,j}=a_i\oplus b_j\),且 \(X\) 矩阵中至多有两种值。

题解:
如果某一个数组有超过 \(2\) 种值,一定不满足要求,可以分类讨论出以下四种情况:

\(case1\)\(a,b\) 都只有一种值,方案数为 \((A+1)(B+1)\)

\(case2,3\)\(a,b\) 一个有一种值,一个有两种值,方案数为 $$(2^n-2)\times \binom{A+1}{2}\times(B+1)+(2^m-2)\times \binom{B+1}{2}\times(A+1)$$
\(case4\)\(a,b\) 都各有两种值,设为 \(a_1,a_2,b_1,b_2\),此时需要满足 \(a_1\oplus b_1=a_2\oplus b_2\),化简得到 \(a_1\oplus a_2=b_1\oplus b_2\)

设这个值为 \(x\),不妨设 \(a_2<a_1,b_2<b_1\),只需要统计以下数对 \((a_1,b_1,x)\) 的个数。

考虑数位 \(dp[i][f_a][f_b][f_x]\) 表示已经确定前 \(i\) 位,\(a_1\) 是否卡住上界,\(b_1\) 是否卡住上界,\(x\) 是否有值的方案数。

\(x:0\to 1\) 转移时,需要保证这一位 \(a_1,b_1\) 取值都为 \(1\)

#include<bits/stdc++.h>
using namespace std;#define ll long long
#define ull unsigned long longll read()
{ll x = 0; bool f = false; char c = getchar();while(c < '0' || c > '9') f |= (c == '-'), c = getchar();while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c & 15), c = getchar();return f ? -x : x;
}const ll mod = 998244353;ll qpow(ll a, ll b, ll mod)
{ll ans = 1;while(b){if(b & 1) ans = ans * a % mod;b >>= 1;a = a * a % mod;}return ans;
}ll C2(ll n){ return 1ll * n * (n - 1) / 2 % mod; }ll dp[31][2][2][2];void add(ll &x, ll y){ x = (x + y >= mod) ? x + y - mod : x + y; }void solve()
{ll n = read(), m = read(), A = read(), B = read();ll ans1 = (A + 1) * (B + 1) % mod;ll ans2 = (qpow(2, n, mod) - 2) * C2(A + 1) % mod * (B + 1) % mod;ll ans3 = (qpow(2, m, mod) - 2) * C2(B + 1) % mod * (A + 1) % mod;for(int i = 0; i < 31; ++i)for(int j = 0; j < 2; ++j)for(int k = 0; k < 2; ++k)for(int t = 0; t < 2; ++t)dp[i][j][k][t] = 0;dp[30][1][1][0] = 1;for(int i = 30; i > 0; --i){int flag1 = (A >> (i - 1)) & 1, flag2 = (B >> (i - 1)) & 1;for(int j = 0; j < 2; ++j)for(int k = 0; k < 2; ++k)for(int t = 0; t < 2; ++t)if(dp[i][j][k][t])for(int x = 0; x <= max(flag1, (j ^ 1)); ++x)for(int y = 0; y <= max(flag2, (k ^ 1)); ++y){int to_j = (x == flag1) & j, to_k = (y == flag2) & k;add(dp[i - 1][to_j][to_k][t], dp[i][j][k][t]);if(t == 0 && x == 1 && y == 1) add(dp[i - 1][j][k][1], dp[i][j][k][t]);else if(t == 1) add(dp[i - 1][to_j][to_k][1], dp[i][j][k][t]);}}ll ans4 = (dp[0][0][0][1] + dp[0][0][1][1] + dp[0][1][0][1] + dp[0][1][1][1]) % mod;ll ans5 = (qpow(2, n, mod) - 2) * (qpow(2, m, mod) - 2) % mod;printf("%lld\n", (ans1 + ans2 + ans3 + ans4 * ans5) % mod);
}int main()
{int T = read();while(T--) solve();return 0;
}

Problem - F - Codeforces ^764811

题意:
给定长度为 \(n\) 的整数数组 \(a\),请找出最长的子序列满足 \(a_{l}\) 为严格最小值,\(a_r\) 为严格最大值。

题解:
考虑 \(l\neq l'\),且 \(a_l=a_{l'}\),此时左端点选择 \(a_l\) 一定更优,右端点同理,注意到可能成为答案的左端点一定是前缀严格最小值,右端点一定是后缀严格最大值。

进一步观察到,这些左右端点具有单调性

如果 \(a_i\) 能为 \((a_l,a_r)\) 产生贡献,一定满足 \(a_l<a_i<a_r\),结合单调性可知一个位置可以贡献的左右端点都是一段区间。

利用扫描线枚举左端点,将每个位置的贡献在左端点差分,线段树维护右端点的答案。

#include<bits/stdc++.h>
using namespace std;#define ll long long
#define ull unsigned long longll read()
{ll x = 0; bool f = false; char c = getchar();while(c < '0' || c > '9') f |= (c == '-'), c = getchar();while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c & 15), c = getchar();return f ? -x : x;
}const int inf = 0x3f3f3f3f;
const int N = 5e5 + 5;
int n, a[N];
vector<int> MN, MX;
vector< pair<int, int> > add[N], del[N];
int st1[20][N], st2[20][N], lg[N];int get1(int l, int r)
{int d = lg[r - l + 1];return max(st1[d][l], st1[d][r - (1 << d) + 1]);
}int get2(int l, int r)
{int d = lg[r - l + 1];return min(st2[d][l], st2[d][r - (1 << d) + 1]);
}#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
int mx[N << 2], lazy[N << 2];void pushup(int k){ mx[k] = max(mx[ls(k)], mx[rs(k)]); }void pushdown(int k)
{mx[ls(k)] += lazy[k], mx[rs(k)] += lazy[k];lazy[ls(k)] += lazy[k], lazy[rs(k)] += lazy[k];lazy[k] = 0;
}void update(int k, int l, int r, int L, int R, int val)
{if(L <= l && r <= R){ mx[k] += val, lazy[k] += val; return ; }pushdown(k);int mid = (l + r) >> 1;if(L <= mid) update(ls(k), l, mid, L, R, val);if(R > mid) update(rs(k), mid + 1, r, L, R, val);pushup(k);
}int query(int k, int l, int r, int L, int R)
{if(L <= l && r <= R) return mx[k];pushdown(k);int mid = (l + r) >> 1;if(R <= mid) return query(ls(k), l, mid, L, R);if(L > mid) return query(rs(k), mid + 1, r, L, R);return max(query(ls(k), l, mid, L, R), query(rs(k), mid + 1, r, L, R));
}void clear(int k, int l, int r)
{mx[k] = lazy[k] = 0;if(l == r) return ;int mid = (l + r) >> 1;clear(ls(k), l, mid), clear(rs(k), mid + 1, r);
}void solve()
{n = read();for(int i = 1; i <= n; ++i) a[i] = read();for(int i = 0; i <= n + 1; ++i) add[i].clear(), del[i].clear();MN.clear(), MX.clear();a[0] = inf, a[n + 1] = 0;MN.emplace_back(0);for(int i = 1; i <= n + 1; ++i){if(a[i] < a[MN.back()]) MN.emplace_back(i);}MX.emplace_back(n + 1);for(int i = n; i >= 0; --i){if(a[i] > a[MX.back()]) MX.emplace_back(i);}reverse(MX.begin(), MX.end());for(int i = 0; i < (int)MN.size(); ++i) st1[0][i] = a[MN[i]];for(int i = 1; (1 << i) <= (int)MN.size(); ++i)for(int j = 0; j + (1 << i) - 1 < (int)MN.size(); ++j)st1[i][j] = max(st1[i - 1][j], st1[i - 1][j + (1 << (i - 1))]);for(int i = 0; i < (int)MX.size(); ++i) st2[0][i] = a[MX[i]];for(int i = 1; (1 << i) <= (int)MX.size(); ++i)for(int j = 0; j + (1 << i) - 1 < (int)MX.size(); ++j)st2[i][j] = min(st2[i - 1][j], st2[i - 1][j + (1 << (i - 1))]);for(int i = 1; i <= n; ++i){int l1 = 1, r1 = lower_bound(MN.begin(), MN.end(), i) - MN.begin() - 1;int l = 0, r = r1;while(l < r){int mid = (l + r + 1) >> 1;if(get1(r1 - mid + 1, r1) >= a[i]) r = mid - 1;else l = mid;}l1 = r1 - l + 1;int l2 = upper_bound(MX.begin(), MX.end(), i) - MX.begin(), r2 = n + 1;l = 0, r = MX.size() - l2 - 1;while(l < r){int mid = (l + r + 1) >> 1;if(get2(l2, l2 + mid - 1) <= a[i]) r = mid - 1;else l = mid;}r2 = l2 + l - 1;if(l2 <= r2 && l1 <= r1){add[l1].emplace_back(pair<int, int>(l2, r2));del[r1 + 1].emplace_back(pair<int, int>(l2, r2));}}int lim1 = (int)MN.size() - 2, lim2 = (int)MX.size() - 2;clear(1, 1, lim2);int ans = 1;for(int i = 1; i <= lim1; ++i){for(auto [l, r] : add[i]) update(1, 1, lim2, l, r, 1);for(auto [l, r] : del[i]) update(1, 1, lim2, l, r, -1);int l3 = upper_bound(MX.begin(), MX.end(), MN[i]) - MX.begin();int l = 0, r = lim2 - l3 + 1;while(l < r){int mid = (l + r + 1) >> 1;if(get2(l3, l3 + mid - 1) <= a[MN[i]]) r = mid - 1;else l = mid;}int r3 = l3 + l - 1;if(l3 <= r3) ans = max(ans, query(1, 1, lim2, l3, r3) + 2);}printf("%d\n", ans);
}int main()
{lg[0] = -1;for(int i = 1; i <= 500000; ++i) lg[i] = lg[i >> 1] + 1;int T = read();while(T--) solve();return 0;
}

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

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

相关文章

ASE15N45-ASEMI智能家居专用ASE15N45

ASE15N45-ASEMI智能家居专用ASE15N45编辑:ll ASE15N45-ASEMI智能家居专用ASE15N45 型号:ASE15N45 品牌:ASEMI 封装:TO-220 批号:最新 最大漏源电流:15A 漏源击穿电压:450V RDS(ON)Max:0.38Ω 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道M…

什么是RabbitMQ入门

一.什么是RabbitMQ 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+…

使用BL0937 IC进行交流电源监控

一个简单的电路来监测交流电源,接线板可以插在任何地方,显示电压,电流和功率。交流电源监控是当今物联网相关应用中的一个惊人功能,例如智能风扇,开关和板。一些优秀的公司董事会在他们的产品中实施了这项技术,并持续监控供应的输出功率。在本地设备层面监控电源有其自身…

20244224 实验一《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 旦曾央京 学号:20244224 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编…

【智慧构造题】CF1427E Xum

我们发现这个原数为奇数的条件比较神秘,于是我们考虑每次把这个数字第一位 \(1\) 给干了。 考虑怎么构造。 令 $d=\lfloor \log_2 x \rfloor $ 令 \(x=1abc1\) \(x1=1abc10000\) \(x2=1abc0abc1\) \(x3=x2+x1=1abc01abc1\) \(x4=x ⊕ x3=1abc000000\) \(x5=x1+x1=1abc100000…

DataGrip结果运行在代码区域

DataGrip运行过后发现运行的结果在代码区域解决方式进入设置界面 点击左上角File(文件)->settings(设置) 搜索栏输入results或output and results 找到下面的设置界面 找到Results下的 Show results in editor ,取消勾选

我们接着创建项目中的app

在pycharm中运行以下代码python manage.py startapp teslaapp运行后呢会在目录中在创建一个名字叫teslaapp的包接着我们还需要在项目Tesla包中的setting文件中 添加我们刚创建的app名称

CMU_15445_Project4_BonusTask_Serializable_Verification

Serializable Verification 我们知道 MVCC 并不能解决幻读以及写偏差的问题, 仅通过 MVCC 的事务调度是无法保证数据库引擎的 ACID 原则的, 那么为了保证数据库的 ACID 原则, 即使在调度的过程中无法保证, 可以通过在 Commit 的时候, 通过验证, Abort 可能造成写偏差于幻读的事…

使用低代码平台设计UI

由于自己不是专业的设计师,就自己简单画个UI界面,那么就可以用到下面的低代码平台 http://120.92.142.115:81/vform3/ 里面可以选择体验vue3模板 进入下面图中的设计界面可以自己拖动组件 修改组件展示给用户的标签名称 以及数据传输时发送的字段名称 可以设置是否必填 默认值…

使用 Hosting 构建 WPF 程序 - prism 篇

WPF + .NET Generic Host + Prism + CommunityToolkit.Mvvm在 使用 Hosting 构建 WPF 程序 - Stylet 篇 中,使用 Hosting + Stylet 的方式,构建了一个 WPF 框架, 本文用于记录使用 .NET Generic Host + Prism 构建 WPF 所需的修改,仅供参考。 示例代码:Jasongrass/Demo.Ap…

如何构建一个用于3D扫描的电动转台

在这个项目中,我将向您展示如何构建一个用于3D扫描的电动转台。这个DIY项目由三个主要部分组成:顶板、中央齿轮驱动板和底座。顶板保持静止,作为放置待扫描物体的平台。在设计的核心,中间板的特点是一个内部齿轮机构,隐藏在视线之外,这是由一个步进电机驱动。这个齿轮板旋…

【每日一题】20250322

【每日一题】 1.(18分) \(\hspace{0.7cm}\)I.(5分)根据单摆周期公式 \(\displaystyle T=2\pi\sqrt{\frac{l}{g}}\),可以通过实验测量当地的重力加速度.如图 \(1\) 所示,将细线的上端固定在铁架台上,下端系一小钢球,就做成了单摆.\(\hspace{0.7cm}\)(1)用游标卡尺测…