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

2024-04-22 04:08

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

题目链接


A. Mike and Cellphone(Codeforces 689A)

思路

当输入号码的相对位置形成的图形无法平移是就输出”YES”,否则输出”NO”。将平移分类成向上平移,向下平移,向左平移和向右平移三种情况。若输入数据包含1,2或3都使得图形不能上移,若输入数据包含7, 9或0都使得图形不能向下平移,若输入数据包含1, 4, 7或0都使得图形不能向左平移,若输入数据包含3, 6, 9或0都使得图形不能向右平移。因此总而言之,这四种平移都不能进行的时候就输出”YES”,否则输出”NO”。

代码

#include <bits/stdc++.h>
using namespace std;bool U = true, D = true, L = true, R = true, vis[20];
char ch;
int n, num;int main() {scanf("%d\n", &n);for(int i = 0; i < n; i++) {scanf("%c", &ch);num = ch - '0';vis[num] = true;}if(vis[7] == true || vis[9] == true || vis[0] == true) {D = false;}if(vis[1] == true || vis[2] == true || vis[3] == true) {U = false;}if(vis[1] == true || vis[4] == true || vis[7] == true || vis[0]) {L = false;}if(vis[3] == true || vis[6] == true || vis[9] == true || vis[0]) {R = false;}puts((D == false && U == false && L == false && R == false) ? "YES" : "NO");return 0;
}

B. Mike and Shortcuts(Codeforces 689B)

思路

原本想的是用动态规划来做,后来发现由于捷径的存在,最优路径可能是一个先前进,然后后退,再前进反复进行的路径。例如,从 1 970 的最短路径可能是 1,6,3,80,40,999,970 。所以就打算把一维的图变换成二维的图然后以点 1 为起点跑最短路算法。变换的时候应该这样建图:相邻节点之间连无向边,捷径之间连有向边,所有边的边权为 1

代码

#include <bits/stdc++.h>
using namespace std;typedef pair <int, int> p;
const int maxn = 2e5 + 10, INF = maxn;
int n, v;struct edge {int to, dist;edge() {}edge(int to, int dist): to(to), dist(dist) {}
};struct Dijkstra {int d[maxn];vector <edge> G[maxn];void addEdge(int u, int v, int w) {G[u].push_back(edge(v, w));}void solve(int s) {fill(d + 1, d + n + 1, INF);d[s] = 0;priority_queue < p, vector<p>, greater<p> > pq;pq.push(p(0, s));while(!pq.empty()) {p node = pq.top();pq.pop();int u = node.second;if(node.first > d[u]) {continue;}for(int i = 0; i < G[u].size(); i++) {edge& e = G[u][i];int v = e.to;int w = e.dist;if(d[v] > d[u] + w) {d[v] = d[u] + w;pq.push(p(d[v], v));}}}}
}o;int main() {scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &v);o.addEdge(i, i + 1, 1);o.addEdge(i + 1, i, 1);o.addEdge(i, v, 1);}o.solve(1);for(int i = 1; i <= n; i++) {printf("%d ", o.d[i]);}puts("");return 0;
}

C. Mike and Chocolate Thieves(Codeforces 689C)

思路

m 得知 n 是困难的,但是从 n 得知 m 却是可行的根据计数方法,将 n 代入下面的 c 函数中就能求出 m 。于是我们可以枚举所有可能的 n ,当结果等于 m 的时候用当前 n 更新最小解就好了。但是由于解空间太庞大,所以枚举肯定会超时。于是我们可以利用 m 的“二分性”( m 这里是对 n 的升序)来对 n 进行二分查找。

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll m, l, r, mid;ll c(ll n) {ll res = 0;for(ll q = 2; n >= q * q * q; q++) {res += n / (q * q * q);}return res;
}int main() {cin >> m;l = 7;r = 100 * m;while(r - l > 1) {mid = (l + r) >> 1;if(c(mid) >= m) {r = mid;}else {l = mid;}}if(c(r) == m) {cout << r << endl;}else {cout << -1 << endl;}return 0;
}

D. Friends and Subsequences(Codeforces 689D)

思路

我们定义 max(i,j) a[i] a[j] 之间的最大值。那么 max 函数有这样的性质:当 i 为定值的时候, max(i,j) 随着 j 的增大而非减。同样, min(i,j) 随着j的增大而非增。也就是说 max(i,j)min(i,j) i 为定值的情况下对于 j 是非减函数。有了“序”以后一切都好办了。我们相当于找到了 max(i,j)min(i,j) 的二分性。于是对于每个 i ,我们可以枚举 j ,找出满足 max(i,j)min(i,j) 的连续的 j1,...,jk ,那么对于当前的i而言,满足 max(i,j)min(i,j) j 的个数就是 jkj1+1 (j的合法区间的长度),我们将其加到答案 ans 中。枚举完 i 以后, ans 就是最终答案了。其中,根据二分性我们将对于 j 的枚举改成对于 j 的二分查找能够将时间复杂度控制在合理的范围内。另外快速查询 max(i,j) min(i,j) 可以用 ST (O(1)) 或线段树 (O(logn)) 这样的数据结构,否则仍然会超时。

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int maxn = 2e5 + 10;
int n, lb, ub, a[maxn], b[maxn];
ll ans;struct table {int stTable[maxn][32][2];int preLog2[maxn];void init(int n, int* array) {preLog2[1] = 0;for(int i = 2; i <= n; i++) {preLog2[i] = preLog2[i-1];if((1 << preLog2[i] + 1) == i) {++preLog2[i];}}for(int i = n - 1; i >= 0; i--) {stTable[i][0][0] = stTable[i][0][1] = array[i];for(int j = 1; (i + (1 << j) - 1) < n; j++) {stTable[i][j][0] = max(stTable[i][j-1][0], stTable[i+(1<<j-1)][j-1][0]);stTable[i][j][1] = min(stTable[i][j-1][1], stTable[i+(1<<j-1)][j-1][1]);}}}int rmq(int l, int r, int d) {int len = r - l + 1, k = preLog2[len];if(d == 0) {return max(stTable[l][k][0], stTable[r-(1<<k)+1][k][0]);}else {return min(stTable[l][k][1], stTable[r-(1<<k)+1][k][1]);}}
}A, B;int binary(int L, int& lb, int& ub) {int l = L - 1, r = n;while(r - l > 1) {int mid = (l + r) >> 1;int tmp = A.rmq(L, mid, 0) - B.rmq(L, mid, 1);if(tmp < 0) {l = mid;}else {r = mid;}}lb = r;l = L - 1, r = n;while(r - l > 1) {int mid = (l + r) >> 1;int tmp = A.rmq(L, mid, 0) - B.rmq(L, mid, 1);if(tmp <= 0) {l = mid;}else {r = mid;}}ub = r;
}int main() {scanf("%d", &n);for(int i = 0; i < n; i++) {scanf("%d", &a[i]);}A.init(n, a);for(int i = 0; i < n; i++) {scanf("%d", &b[i]);}B.init(n, b);for(int L = 0; L < n; L++) {binary(L, lb, ub);ans += ub - lb;}printf("%I64d\n", ans);return 0;
}

(其它题目略)

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



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

相关文章

【专题】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