AtCoder Regular Contest 119 (ABC题)
比赛链接:Here
A - 119 × 2^23 + 1
注意到 \(2^{60} > 10^{18}\) ,所以我们可以直接枚举 \(0\) ~ \(59\)
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
ll n; cin >> n;
ll ans = (1ll << 60);
for (int i = 0; i < 60; ++i) {
ll a = n / (1ll << i);
ll b = i;
ll c = n - a * (1ll << i);
ans = min(ans, a + b + c);
}
cout << ans;
}
B - Electric Board
给定长度为 \(n\) 两个字符串 \(S,T\),要求通过最少的操作数把 \(S\) 变成 \(T\),操作就是对于 \(s_l=0∧s_{l+1}=...=s_r=1\) 或者 \(s_l=1∧s_{l+1}=...=s_r=0\) 可以交换元素 \(s_l\) 和 \(s_r\)
\(2≤n≤500000\)
解法1
我们可以把所有 \(0\) 换到应该的位置上,那么 \(1\) 也就确定了。
\(0\) 换过去的代价是路上 \(0\) 的数量,这就和 \(1\) 没关系了,那么我们把 \(S,T\) 的 \(0\) 都取出来,相邻的配对即可。
解法2
我们可以把所以 \(1\) 换到应该的位置上,那么 \(0\) 也就是确定了。
\(1\) 换过去的代价是路上 \(0\) 的数量,这和 \(0/1\) 都有关系,直接匹配是行不通的,正确的做法是从左往右扫,如果遇到 \(S\) 有 \(1\) 但是 \(T\) 没有就把他移动到右边第一个 \(0\),如果 \(T\) 有 \(1\) 但是 \(S\) 没有也把他移动到右边第一个 \(0\)
这种做法的正确性有二:一是两个状态都往中间靠拢;二是我们永远在不得不操作的时候操作。
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
string s, t;
cin >> n >> s >> t;
vector<int>a, b;
for (int i = 0; i < n; ++i) {
if (s[i] == '0') a.push_back(i);
if (t[i] == '0') b.push_back(i);
}
if (int(a.size() != int(b.size()))) {cout << -1; return 0;}
int ans = 0;
for (int i = 0; i < int(a.size()); ++i)
if (a[i] != b[i]) ans++;
cout << ans;
}
C - ARC Wrecker 2
有 \(n\) 个楼房,第 \(i\) 个高为 \(a_i\),相邻的楼房可以同时增加或同时减少,问能够推平(高度全部变成 \(0\))的区间有多少个。
\(2≤n≤300000,1≤ai≤10^9\)
解法
一定要有敏锐的观察能力,这道题的结论是:如果奇偶位置高度相同则可以推平。
证明不难,因为无论怎么操作奇偶的差都是不变的,而目标奇偶差值为 \(0\),初始状态一定能到目标状态。
然后搞一个特殊的前缀和,奇数位置符号为正,偶数位置符号为负,找权值和为 \(0\) 的区间即可。
const int N = 3e5 + 10;
ll n, ans, a[N];
map<ll, ll>mp;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if (i > 1) a[i] += a[i - 2];
}
mp[0] = mp[a[1]] = 1;
for (int i = 1; i <= n / 2; ++i) {
int x = 2 * i;
ans += mp[a[x - 1] - a[x]];
if (x < n) ans += mp[a[x + 1] - a[x]];
mp[a[x - 1] - a[x]]++;
mp[a[x + 1] - a[x]]++;
}
cout << ans;
}
ll a[1 << 19], b[1 << 19], c[1 << 19];
map<ll, ll>d;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
ll n, ans = 0;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) {
if (i & 1) b[i] = a[i];
else b[i] = -a[i];
c[i] = c[i - 1] + b[i];
}
for (int i = 0; i <= n; ++i) {
ans += d[c[i]];
d[c[i]] += 1;
}
cout << ans;
}
AtCoder Regular Contest 119 (ABC题)的更多相关文章
- AtCoder Regular Contest 151补题
AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...
- AtCoder Beginner Contest 050 ABC题
A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...
- AtCoder Regular Contest 119 C - ARC Wrecker 2(同余定理+思维)
Problem Statement There are NN buildings along the AtCoder Street, numbered 11 through NN from west ...
- AtCoder Regular Contest 128 部分题题解
关于鄙人罚坐两小时那件事...该开始看A题,这不就是个DP记录路径吗?Wrong了,嗯,我没用double,又Wrong,怎么回事,使劲检查自己的算法和细节问题,一个小时过去了,...这没错啊,又反复 ...
- Atcoder Regular Contest 060 F题第一问答案证明
一切的开始 令 \(x\) 为字符串,\(p\) 为正整数.如果对于满足 \(0\le i<|x|−p\) 的任何整数 \(i\) 满足 \(x[i]=x[i+p]\),则 \(p\) 称为 \ ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
随机推荐
- Hdu4742 (CDQ分治)
题意:给出n个三维点对(x,y,z),可随意排列,求三维非严格最长上升子序列长度和最长上升子序列数量. 输入格式:第一行为一整数T表示用例组数,每组用例第一行为一整数n表示点数,之后n行每行三个整数x ...
- Net 高级调试之一:开始认识一些调试工具
当进行网络高级调试时,使用合适的工具可以帮助我们更深入地了解问题所在,并提供有效的解决方案.下面是一些常用的网络调试工具,以及它们的功能和用法. 1. Wireshark:Wireshark是一个流行 ...
- 不要用第三方日志包了Microsoft.Extensions.Logging功能就很强大
在.NET中,Microsoft.Extensions.Logging是一个广泛使用的日志库,用于记录应用程序的日志信息.它提供了丰富的功能和灵活性,使开发人员能够轻松地记录各种类型的日志,并将其输出 ...
- Linux笔记03: Linux常用命令_3.5权限管理命令
3.5 权限管理命令 3.5.1 权限介绍 1.为什么需要权限 绝大多数用户使用的是个人计算机,而使用个人计算机的用户一般都是被信任的用户(如家人.朋友等).在这种情况下,大家都可以使用管理员身份直接 ...
- Vue2.0 学习 第三组 条件语句
本笔记主要参考菜鸟教程和官方文档编写.1.v-if在div或者之类的dom中使用v-if可以控制是否插入该dom,控制由v-if的true和false决定.如:<div id="app ...
- RV1126 分区教程
一.前言 期初我是想弄一个分区存放自己的 APP 程序,如果需要更改应用的时候,只需要烧写独立的分区即可,就不需要重新烧写 rootfs.这是一个简单的操作,为啥还需要记录了,因为我在里面遇到了一些坑 ...
- bash shell笔记整理——linux时钟和hwclock命令
Linux中的时钟 在linux中,分为了如下两种时钟: 系统时钟:由linux内核通过CPU的工作频率进行的计时. 硬件时钟:主板上的cmos芯片时钟,就是可以在bios中设定的时间.(RTC,re ...
- Vue学习笔记-指令
- Python——第二章:查找和判断
查找.find() s = "你好啊. 我叫周润发" ret = s.find("周润发") # 返回是7,代表该字符串出现在7号位置,从0开始计数 print ...
- Ubuntu apt-get 的使用
在Ubuntu中,可以使用apt-get命令来管理软件包.下面是一些常见的apt-get命令及其用法: 安装软件包: sudo apt-get install <package> 其中,& ...