比赛链接: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题)的更多相关文章

  1. AtCoder Regular Contest 151补题

    AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...

  2. AtCoder Beginner Contest 050 ABC题

    A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...

  3. AtCoder Regular Contest 119 C - ARC Wrecker 2(同余定理+思维)

    Problem Statement There are NN buildings along the AtCoder Street, numbered 11 through NN from west ...

  4. AtCoder Regular Contest 128 部分题题解

    关于鄙人罚坐两小时那件事...该开始看A题,这不就是个DP记录路径吗?Wrong了,嗯,我没用double,又Wrong,怎么回事,使劲检查自己的算法和细节问题,一个小时过去了,...这没错啊,又反复 ...

  5. Atcoder Regular Contest 060 F题第一问答案证明

    一切的开始 令 \(x\) 为字符串,\(p\) 为正整数.如果对于满足 \(0\le i<|x|−p\) 的任何整数 \(i\) 满足 \(x[i]=x[i+p]\),则 \(p\) 称为 \ ...

  6. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  9. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  10. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

随机推荐

  1. 【luogu题解】P5461 赦免战俘

    一.题目 现有 \(2^n\times2^n\ (n≤10)\) 名作弊者站成一个正方形方阵等候 kkksc03 的发落.kkksc03 决定赦免一些作弊者.他将正方形矩阵均分为 4 个更小的正方形矩 ...

  2. 【死亡小学期第二章:没头脑和不高兴】数据库jdbc系统

    自己做一个JDBC的数据库系统,因为这个一直做嘛,所以很简单啦,并没有想提高技术拔拔高啥的,就想做一个简单的,然后自己感兴趣的内容.让自己快乐快乐那才叫做意义~~~~~~~kkkk 学到的东西: 展示 ...

  3. 聊聊卷积神经网络CNN

    卷积神经网络(Convolutional Neural Network,CNN)是一种被广泛应用于图像识别.语音识别和自然语言处理等领域的深度学习模型.与RNN.Transformer模型组成AI的三 ...

  4. 数据可视化工具 ,不会写 SQL 代码也能做数据分析

    数据可视化工具可以帮助人们以直观.易于理解的方式展现和分析数据.这些工具使得即使不会写 SQL 代码的人也能进行数据分析,并从中获得有价值的信息和见解. 本文将详细介绍几种常用的数据可视化工具及其功能 ...

  5. ubuntu安装opencv的正确方法

    本文介绍的是如何安装ubuntu下C++接口的opencv 1.安装准备: 1.1安装cmake sudo apt-get install cmake 1.2依赖环境 sudo apt-get ins ...

  6. tensorflow GPU版本配置加速环境

    import tensorflow as tf tf.test.is_gpu_available() 背景 环境:Anaconda .tensorflow_gpu==1.4.0 (这里就用1.4.0版 ...

  7. Mybatis大于、小于....转义写法

    描述 转义前 转义后 大于 > > 大于等于 >= >= 小于 < < 小于等于 <= <= 和 & & 单引号 ' &apos ...

  8. ES索引误删的名场面

    ES索引误删的名场面 慌了3秒,果断发个邮件: 01 最近,在版本发布时: ES线上未备份的索引,被当场「误删」了: 对于新手来说,妥妥的社死名场面: 对于老手来说,慌它3秒表示一下态度: 当时的情况 ...

  9. bash shell笔记整理——tail命令

    作用 Print the last 10 lines of each FILE to standard output. With more than one FILE, precede each wi ...

  10. 数字孪生技术助力GIS行业实现视效升级

    在当今数字化时代,数字孪生技术正逐渐成为各行各业的一项核心技术,而地理信息系统(GIS)行业也不例外.数字孪生和GIS的结合,为地理空间数据的采集.管理.分析和可视化提供了全新的可能性,使GIS行业得 ...