【解题报告】Codeforces Round #362 (Div. 2)

2024-04-22 04:08

本文主要是介绍【解题报告】Codeforces Round #362 (Div. 2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接


A. Pineapple Incident(Codeforces 697A)

思路

由于菠萝乱叫的时间点满足 t+p×s t+q×s+1 ,其中 p0q>0 。先判断 x=t x=t+1 是否满足 ,如果不满足的话,我们就可以将 p,q 统一看成 k ,判断是否存在 k 使得 t+k×s=x t+k×s+1=xk0 。只要判断 (xt)mods=0 (xt)mods=1 是否满足即可。

代码

#include <bits/stdc++.h>
using namespace std;int t, s, x, tmp;int main() {cin >> t >> s >> x;tmp = (x - t) % s;if(x < t) {puts("NO");}else if(x == t + 1) {puts("NO");}else if(tmp == 0 || tmp == 1) {puts("YES");}else {puts("NO");}return 0;
}

B. Barnicle(Codeforces 697B)

思路

本题的逻辑如下:

  1. 如果 d=0 的话,直接在 a 的末尾加 b 0 输出。
  2. 否则如果结果是整数的话在 a 的末尾加上数量比 b 小的 0 输出。
  3. 否则将小数点移动后依次输出新的 a ,小数点和新的 d

代码

#include <bits/stdc++.h>
using namespace std;int b, p, q;
string l, r, s, sa, sd;
stringstream ss;int main() {cin >> s;p = s.find('.');q = s.find('e');s[p] = s[q] = ' ';ss << s;ss >> sa >> sd >> b;if(sd == "0") {for(int i = 0; i < b; i++) {sa.push_back('0');}cout << sa << endl;}else if(b >= sd.size()) {sa += sd;for(int i = 0; i < b - sd.size(); i++) {sa.push_back('0');}cout << sa << endl;}else {l = sa + sd.substr(0, b);r = sd.substr(b, sd.size() - b);cout << l << '.' << r << endl;}return 0;
}

C. Lorenzo Von Matterhorn(Codeforces 697C)

思路

修改 uv 路径的权值的时候暴力找到 u v 的最近公共祖先,边找边用 map 更新当前点的出边的权值。查找 uv 路径的权值的时候暴力找到 u v 的最近公共祖先,边找边累加当前点的出边的权值。

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
int q, o;
ll u, v, w, ans;
map <ll, ll> mp;int main() {cin >> q;while(q--) {cin >> o >> u >> v;if(u < v) {swap(u, v);}if(o == 1) {cin >> w;while(u != v) {mp[u] += w;u >>= 1;if(u < v) {swap(u, v);}}}else {ans = 0;while(u != v) {ans += mp[u];u >>= 1;if(u < v) {swap(u, v);}}cout << ans << endl;}}return 0;
}

D. Puzzles(Codeforces 697D)

思路

如果想以树的节点编号做状态来做树形动态规划的话,对于每个节点,都要枚举子节点的访问顺序。这样的复杂度太高了。所以我们转而用公式法或者贡献度法来解决。对于一个点 v strarttime[v] 显然等于先于 v 访问的节点的个数加上 1 。那么每个点 u 对点 starttime[v] 期望的贡献度就是 u 先于 v 访问的概率 pu 。那么 starttime[v] 的期望为 pu+1 。下面就考察每个点先于 v 访问的概率。首先对于 v 的祖先 u1pu1=1 ,其次对于 v 的子树上的节点 u2pu2=0 。最后对于其它所有节点 u3pu3=0.5 (因为在 v u3 的最近公共祖先的时候,往这两个节点所在的子树走的概率是相等的)。现在问题就转化成如何计算 u3 的数量。设 v 在树中的深度为 d[v] (根节点深度为 0 ), v 的子树的节点个数为 c[v] ,那么 u3 的数量就是 nc[v]d[v] 。因此答案就是 nc[v]d[v]2+d[v]+1

代码

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e5 + 10;
int n, p, ans, c[maxn], d[maxn];
vector <int> G[maxn];void dfs(int u) {c[u] = 1;for(int i = 0; i < G[u].size(); i++) {int v = G[u][i];d[v] = d[u] + 1;dfs(v);c[u] += c[v];}
}int main() {scanf("%d", &n);for(int i = 2; i <= n; i++) {scanf("%d", &p);G[p].push_back(i);}dfs(1);for(int i = 1; i <= n; i++) {ans = n - c[i] + d[i] + 2;printf("%d.", ans / 2);printf(ans & 1 ? "5 " : "0 ");}puts("");return 0;
}

E. PLEASE(Codeforces 697E)

思路

因为这是一个概率问题,所以先按照状态转移的思想来思考。如果将初始状态定义为 (1,2,3) ,那么状态空间将只有 6 个元素—— (1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1) 。但是将状态转移图画好后又会发现没有什么我们需要的线索。那么换一种状态定义方式呢?假设状态 i i 次交换后的状态,令 d[i] i 次交换后初始状态下的中间的杯子(我们可以暂时称之为第 2 个杯子)依然在中间的概率。我们试图寻找 d[i] d[i1] 的关系。不难发现,当状态为 i1 时第 2 个杯子在中间的话,到了状态为 i 的时候第 2 个杯子就不可能在中间了。于是有如下关系

d[i]=1d[i1]2

因为要得到最最简分数形式的概率,因此光得到递推公式是不够的,我们要求一个能直接计算出结果的封闭形式。于是用待定系数法可以得到一个等比数列的递推公式

d[i]13=12(d[i1]13)

解这个递推公式得

d[n]=(1)n+2n13×2n1

凑巧的是, (1)n+2n1 正好是 3 的倍数(与 2 的幂的相邻的两个数中一定有一个是 3 的倍数)而且(1)n+2n1除以 3 一定能得到奇数,这样就能与上式分母的偶数互质了。所以有

p=(1)n+2n13

q=2n1

题目就得解了。另外要注意的是,对分数取 mod 的时候要对分母计算模逆元,也就是要算出 3 的模逆元。计算 2n1 的时候可以用快速幂算法来算。

最后,偶然发现像P这样的数被称为 Jacobsthalnumbers (维基百科)。

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const ll mod = 1e9 + 7;
bool one = true;
int k, odd = 1;
ll a, p, q = 2;// 快速幂算法
ll modPow(ll a, ll n, ll mod) {ll ans = 1;for(; n > 0; n >>= 1) {if(n & 1) {ans = (ans * a) % mod;}a = (a * a) % mod;}return ans;
}// 求模逆元
ll modInv(ll a, ll mod) {return modPow(a, mod - 2, mod);
}int main() {scanf("%d", &k);for(int i = 0; i < k; i++) {scanf("%I64d", &a);odd &= (a & 1);q = modPow(q, a, mod);if(a > 1) {one = false;}}q = (q * modInv(2, mod)) % mod;if(one == true) {p = 0;}else {p = q;p += (odd ? -1 : 1);p = (p * modInv(3, mod)) % mod;}printf("%I64d/%I64d\n", p, q);return 0;
}

(其它题目略)

这篇关于【解题报告】Codeforces Round #362 (Div. 2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924790

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor