AtCoder ABC 243题解
AtCoder ABC 243
A Shampoo(水)
分类讨论 如果一轮用不完 就取余再判断 如果一轮用得完 直接判断
void solve()
{int v, a, b, c;cin >> v >> a >> b >> c;int sum = a + b + c;int t = v % sum;if(sum > v) {if(a > v) {cout << "F"; return;}else if(a + b > v) {cout << "M"; return;}else {cout << "T"; return;}} else{if(a > t) {cout << "F"; return;}else if(a + b > t) {cout << "M"; return;}else {cout << "T"; return;}}
}
B Hit and Blow(水)
给定两个数组a b 判断数组中位置和数值都相同的个数 & 位置不同数值相同的个数
void solve()
{int n;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];for(int i = 1; i <= n; i++)cin >> b[i];int res1 = 0, res2 = 0;for(int i = 1; i <= n; i++)mp[a[i]] = true;for(int i = 1; i <= n; i++)if(mp[b[i]]) res2 ++;for(int i = 1; i <= n; i++)if(a[i] == b[i]) res2 --, res1 ++;cout << res1 << '\n' << res2;
}
C Collision 2(水)
给出n个点的坐标和行进方向 若是两个坐标会相遇 输出yes
显然 判断yes更简单 我们进行排序 然后对相同纵坐标进行判断 若是左边的点向右走 右边的点向左走 YES
struct node
{int x, y, op; // op 0 L op 1 Rbool operator< (const node & E) const {if(y == E.y) return x < E.x;return y < E.y;}
}q[200010];void solve()
{int n;cin >> n;for(int i = 0; i < n; i++)cin >> q[i].x >> q[i].y;string s;cin >> s;for(int i = 0; i < n; i++){if(s[i] == 'L') q[i].op = 0;else q[i].op = 1;}sort(q, q + n);for(int i = 1; i < n; i++){if(q[i].y != q[i - 1].y) continue;if(q[i - 1].op == 1 && q[i].op == 0) {puts("Yes"); return;}}puts("No");
}
D Moves on Binary Tree(二叉树)
给出当前节点 对节点进行一个1e6的操作 每次操作选择移动到他的父节点 左儿子 或者右儿子
节点数会在longlong的极限左右 但保证最终答案一定在longlong范围内
因为给的节点数字很大 用高精度模拟会TLE 正常模拟会爆long
因为R是 x * 2 + 1 而U是 x / 2 这一点就带来了误差
1 消除相邻的UL 和 RL 因为R仅仅是加了一次1 这时直接除2并不会造成影响 且保证答案在LL内
2 将节点化为二进制串表示并进行二进制的计算 然后再转回十进制
stack<char> stk;void solve()
{int n;LL x;cin >> n >> x;string s;cin >> s;int l, r;for(int i = 0; i < n; i++){if(!stk.empty()) {if((s[i] == 'U' && (stk.top() == 'L' || stk.top() == 'R'))) stk.pop();else stk.push(s[i]);}else stk.push(s[i]);}string res;while(stk.size()) res += stk.top(), stk.pop();reverse(res.begin(), res.end());for(int i = 0; i < res.size(); i++){if(res[i] == 'L') x *= 2;else if(res[i] == 'R') x = x * 2 + 1;else x /= 2;}cout << x << '\n';
}
string get_(LL x)//十转二
{string res;while(x){res += '0' + (x % 2);x /= 2;}reverse(res.begin(), res.end());return res;
}void solve()
{int n; LL x;cin >> n >> x;string s;cin >> s;string nums = get_(x);for(int i = 0; i < n; i++){if(s[i] == 'R') nums += '1';else if(s[i] == 'L') nums += '0';else nums.erase(nums.end() - 1);}int m = nums.size();LL res = 0;reverse(nums.begin(), nums.end());for(int i = 0; i < m; i++)//二转十{LL t = nums[i] - '0';res += t * (1LL << i);}cout << res << '\n';
}
E Edge Deletion(图论 + 构造)
请尝试删去最多的边(在不影响原有两点之间路径长度以及保持图的联通)
原有两点路径看起来很复杂 其实就是对最短路查重 若是如样例一一般 最短路有两条 且权相同 可以删去
我们先通过flody跑一遍最短路 然后遍历两个顶点和中转点询问是否存在最短路重复
int n, m;// point n edge m
int a, b;
LL c;
LL mp[310][310];void solve()
{cin >> n >> m;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)mp[i][j] = (i == j) ? 0 : INF;for(int i = 0; i < m; i++){cin >> a >> b >> c;mp[a][b] = c;mp[b][a] = c;}for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);int res = 0; //保留的边数for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(i != j){int rem = 1;for(int k = 1; k <= n; k++) if(i != k && j != k && mp[i][j] == mp[i][k] + mp[k][j]) //存在这种情况的时候 可以去掉一个边rem = 0;res += rem;}cout << m - res / 2 << '\n'; //因为正反都扫了一遍 所以保留的边数/2
}
F Lottery(不会)
G Sqrt(DP + 前缀和 + 优化)
#include <bits/stdc++.h>using namespace std;
//多组输入的初始化
//判断是否需要LL#define ios ios::sync_with_stdio(false);cin.tie(0);
#define endl '\n'
#define ms(x, y) memset(x, y, sizeof x)
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1000010;
LL dp[N], pre[N];LL is_sqrt(LL x)
{LL sqrtX = sqrt(x) - 1;while(sqrtX + 1 <= x / (sqrtX + 1)) sqrtX ++;return sqrtX;
}void solve()
{cin >> x;LL x2 = is_sqrt(x);LL x4 = is_sqrt(x2);LL res = 0;for(int i = 1; i <= x4; i++)res += (x2 - 1LL * i * i + 1) * dp[i];cout << res << '\n';
}int main()
{ios;dp[1] = 1;pre[1] = 1;for(int i = 2; i <= N; i++)dp[i] = pre[is_sqrt(i)], pre[i] = pre[i - 1] + dp[i];int _;cin >> _;while(_--) solve();return 0;
}
AtCoder ABC 243题解相关推荐
- Atcoder abc 233 题解
Atcoder abc 233 题解 A 10yen Stamp 答案就是两个数字的差/10之后上取整 记得判断res=0的情况就可以了 c++代码 #include<iostream> ...
- AtCoder ABC 250 总结
AtCoder ABC 250 总结 总体 连续若干次一样的结果:30min 切前 4 题,剩下卡在 T5 这几次卡在 T5 都是一次比一次接近, 什么 dp 前缀和打挂,精度被卡,能水过的题连水法都 ...
- AtCoder beginner contest 43 (ABC 43)题解
B题:Unhappy HackingProblem 给定一个字符串和一个空串,字符串只包含01B三种字符,从字符串首开始,若为0/1则在空串后添加0/1; 若为B且字符串不为空,则删除字符串最后一个字 ...
- AtCoder ABC 127F Absolute Minima
题目链接:https://atcoder.jp/contests/abc127/tasks/abc127_f 题目大意 初始状态下$f(x) = 0$,现在有 2 种模式的询问,第一种以"1 ...
- AtCoder abc256全题解(区间合并模板、矩阵快速幂优化dp、线段树……)
文章目录 A B C-枚举 D-区间合并模板 E-图论建模,函数图的性质 题意 思路 代码 F-树状数组 题意 思路 代码 G-矩阵快速幂优化dp H-线段树 思路 实现 传送门 本文CSDN 本文j ...
- Atcoder abc A~E
ABC 265 A~E A 题意:你要买 n 个苹果,买 1 个要 x 元,买 3 个要 y 元,问最少要花多少钱 解法:判断 3*x 是否小于 y,然后输出 Code : # include < ...
- AtCoder - ABC 167 - E(数学推理+组合数)
E - Colorful Blocks 题意: 有 m 种颜色,给 n 个方块染色,可以不使用所有颜色,要求最多有 k 对相邻方块同色.问染色的总情况,最终结果模 998244353. 数据范围: ...
- AtCoder - ABC 178 - C~F
C - Ubiquity(容斥原理/DP) 题意: 求满足以下条件的长为 n 的不同序列的个数: 1.0 ≤ ≤9 2.序列中至少有一个 =0 3.序列中至少有一个 =9 答案对 +7 取模. 数据 ...
- 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)
2020年第十一届蓝桥杯国赛 题号 类型 C++ A组 C++ B组 C++ C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 (日期处理) 扩散 (BFS) ...
- AtCoder ABC 249
A Jogging 没看清楚题 a不是移速 所以卡了十分钟 语法题 int main() {int a, b, c, d, e, f, x;cin >> a >> b > ...
最新文章
- device.cpp
- 3行代码给你的python提速4倍!
- 一个月时间整理《深入浅出Node.js》
- macos访问linux分区,在linux中访问macos 下的分区。
- 数据库系统原理(第三章数据库设计 )
- rust如何改睡袋_腐蚀rust怎么做睡袋 | 手游网游页游攻略大全
- Hadoop伪分布安装详解(一)
- selenium java po模式_selenium + java po模式
- 演示:思科交换机的Telnet管理与SSH管理
- 基于 VEthernet 轻松实现 tun2socks 示例程序
- 拔丝芋头的Java学习日记---Day9
- 2 资源关系 | 到底什么是”局“-- 清华宁向东的管理学课总结
- 华南理工大学珠海学院计算机,慕了!盘点那些有“私家游泳池”的广东高校!考上就算捡到啦!...
- 认证资料大全(八)------ SUN认证列表
- Loadrunner之关联——用小故事理解
- Hugging Face创始人亲述:一个GitHub史上增长最快的AI项目
- k8s笔记3--Kubernetes IDE Lens
- RPA下基层·社区医疗RPA丨居民医疗档案签约机器人
- ubuntu修改属组时chown: 无法访问‘bangbang‘: 没有那个文件或目录
- IT市场:英文求职信模板二