比赛链接:Here

1556A. A Variety of Operations

注意到2, 3操作不改变总和,1操作使得总和加上了一个偶数,故直接判断总和是否为偶数即可。如果和为偶数,只要判断c和d是否相等即可。注意0要判一下

【AC Code】

const int N = 1e5 + 7;
int n, m, k, tot, a[N];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int _; for (cin >> _; _--;) {
int c, d; cin >> c >> d;
if (c == 0 && d == 0) {
puts("0");
continue;
}
if ((c + d) % 2 == 0) {
if (c == d ) {
puts("1");
} else puts("2");
} else puts("-1");
}
}

1566B. Take Your Places!

题意:

给一个有 \(n\) 个数字的数组,可以交换相邻的数字,求最小交换次数使得相邻的数奇偶性不相同。

思路:

先判一下奇数和偶数的个数,在按顺序分配位置就行。如果奇数和偶数个数相等,还得枚举奇数先放还是偶数先放。注意开 ll

【AC Code】

int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
vector<int>a(n);
for (int &x : a) {
cin >> x;
x &= 1;
}
ll ans = LLONG_MAX;
for (int j = 0; j < 2; ++j) {
vector<int>b(n);
for (int i = 0; i < n; ++i) b[i] = (i & 1) == j;
vector<int>la, lb;
for (int i = 0; i < n; ++i) {
if (a[i]) la.push_back(i);
if (b[i]) lb.push_back(i);
}
if (la.size() != lb.size()) continue;
ll op = 0;
for (int i = 0; i < la.size(); ++i) op += abs(la[i] - lb[i]);
ans = min(ans, op);
}
cout << (ans >= LLONG_MAX ? -1 : ans) << "\n";
}
}

1566C. Compressed Bracket Sequence

莫名其妙地ac了,不是很懂。

首先枚举左端点 \(l\) 和右端点 \(r\) ,用函数 \(check(l,r)\) 统计这两个端点的贡献(在 \(l\) 处开始,$ r$ 处结束的合法括号序列的数量)。假设每一个左括号为 \(1\),右括号为 \(-1\) ,对序列求个前缀和,方便判断是否合法。

所有的从 \(l\) 开始,\(r\)​​ 结束的合法括号序列,不一定用了\(l\)​和\(r\)中的每一个左右括号。

首先计算 \(d=sum[r]-sum[l-1]\)​ ,以得出左右两边是否有多余的括号,我们要舍去。之后再枚举\(l+1\)到\(r−1\)的每一个位置\(i\),他们必须满足\(sum[i]−sum[l−1]>=0\) .统计这个差值的最小值,记为 \(mx\) ,其表示左边 \(l\)处最多能有几个括号多出来。那么答案至多有\(mx+1\).注意当\(d>0\)时,这个值要减去 \(d\) 后才能用于更新 \(mx\) 。

之后保险起见,还得和左边能贡献的左括号数量,右边能贡献的右括号数量取 \(\min\),注意此时也要把$ d$ 的偏差加上去,具体见代码。

【AC Code】

const int N = 1e5 + 7;
int n, m, k;
ll tot, c[N], ans, sum[N];
ll check(int l, int r) {
ll d = sum[r] - sum[l - 1], mx = 99999999999999999ll;
for (int i = l + 1; i < r; i += 2) {
if (d <= 0)
mx = min(mx, sum[i] - sum[l - 1]);
if (d > 0)
mx = min(mx, sum[i] - d - sum[l - 1]);
}
if (mx < 0) return 0;
//if (mx == 0) return 1;
if (d == 0) return min(c[l], min(mx + 1ll, -c[r]));
if (d < 0) return min(c[l], min(mx + 1ll, -c[r] + d));
if (d > 0) return min(c[l] - d, min(mx + 1ll, -c[r]));
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> c[i];
if (i % 2 == 0) c[i] = -c[i];
sum[i] = sum[i - 1] + c[i];
}
for (int l = 1; l <= n; l += 2) {
for (int r = l + 1; r <= n; r += 2) {
ans += check(l, r);
}
}
cout << ans;
}

1566D. Take a Guess

第一次做交互题,要频繁清空流感觉有点麻烦

$ a+b=a & b+a \mid b$ ,用 \(a+b, a+c, b+c\)​ 可以求出 $ a b c $ ,已知 $ a$ 和 \(a \& b+a \mid b\) 可以求 b , 这样直接求出所有的 $ a[i]$​ 就行。

【AC Code】

注意每一行输出之后要立刻 fflush(stdout);

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
typedef pair<int, int> pii;
#define mk make_pair
const int maxn = 1e4 + 7;
int rd() {
int s = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {s = s * 10 + c - '0'; c = getchar();}
return s * f;
}
int n, m, k, tot;
ll a[maxn];
ll getPlus(int i, int j) {
printf("or %d %d\n", i, j);
fflush(stdout);
ll orij = rd();
printf("and %d %d\n", i, j);
fflush(stdout);
ll andij = rd();
return orij + andij;
}
void get(int i, int j, int k) {
ll pij = getPlus(i, j);
ll pjk = getPlus(j, k);
ll pik = getPlus(i, k);
a[i] = (pij - pjk + pik) / 2ll;
a[j] = (pjk - pik + pij) / 2ll;
a[k] = (pik - pij + pjk) / 2ll;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
n = rd(); k = rd();
for (int i = 1; i <= n; i += 3) {
if (i + 2 > n) break;
get(i, i + 1, i + 2);
}
if (n % 3 == 1) {
ll p1 = getPlus(1, n);
a[n] = p1 - a[1];
}
if (n % 3 == 2) {
ll p1 = getPlus(1, n - 1);
a[n - 1] = p1 - a[1];
ll p2 = getPlus(1, n);
a[n] = p2 - a[1];
}
sort(a + 1, a + n + 1);
printf("finish %lld\n", a[k]);
}

1556E. Equilibrium

给出俩个长为 \(n\) 的整数序列 \(a\) 和 \(b\)​ ,以及一些询问 $(1, \mathrm{r}) \(. 对于每个\) (l, r) \(, 回答最少要执行多少次操作,使得
\) \mathrm{a}[1 \ldots \mathrm{r}]=\mathrm{b}[1 \ldots \mathrm{r}] $​, 或是判断无解。

每次操作为选取偶数个下标 \(p o s_{i}\)​ , 满足 $ l \leq p o s_{1}<p o s_{2}<\cdots<p o s_{k} \leq r $​, 然后让 \(a\) 中下标为

$\operatorname{pos}{1}, \operatorname{pos}, p o s_{5}, \cdots, p o s_{k}-1 $ 的数 \(+1\) , 让 \(b\) 中下标为 $p o s_{2}, p o s_{4}, \operatorname{pos}{6}, \cdots, p o s $ 的位置的数 $+1 $.

每次询问是互相独立的。

sol:这里参考了高Rank大佬们的思路

【AC Code】

const int maxn = 1e5 + 7;
#define ll long long
int n, m, k, tot, a[maxn], q;
ll sum[maxn];
ll stmx[22][maxn], stmi[22][maxn];
int rd() {
int s = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {s = s * 10 + c - '0'; c = getchar();}
return s * f;
}
ll querymi(int l, int r) {
int len = r - l + 1, len2;
for (len2 = 0; (1 << (len2 + 1)) < len; len2++);
return min(stmi[len2][l], stmi[len2][r - (1 << len2) + 1]);
}
ll querymx(int l, int r) {
int len = r - l + 1, len2;
for (len2 = 0; (1 << (len2 + 1)) < len; len2++);
return max(stmx[len2][l], stmx[len2][r - (1 << len2) + 1]);
}
int main() {
n = rd();
q = rd();
//printf("%d %d\n", n, q);
for (int i = 1; i <= n; i++)
a[i] = rd();
for (int i = 1; i <= n; i++) {
a[i] -= rd();
sum[i] = sum[i - 1] + a[i];
stmx[0][i] = stmi[0][i] = sum[i];
}
//q = rd();
for (int j = 1; j <= 20; j++)
for (int i = 1; i <= n - (1 << j) + 1; i++)
stmi[j][i] = 100000000000001ll, stmx[j][i] = -100000000000001ll;
for (int i = 1; i <= 20; i++) {
for (int j = 1; j <= n - (1 << i) + 1; j++) {
stmi[i][j] = min(stmi[i - 1][j], stmi[i - 1][j + (1 << (i - 1))]);
stmx[i][j] = max(stmx[i - 1][j], stmx[i - 1][j + (1 << (i - 1))]);
}
}
while (q--) {
int l = rd();
int r = rd();
//printf("l == %d r == %d qmx == %lld qmi == %lld\n", l, r, querymx(l, r)-sum[l-1], querymi(l, r)-sum[l-1]);
if (sum[r] - sum[l - 1] != 0 || querymx(l, r) > sum[l - 1]) {
puts("-1");
continue;
} else {
printf("%lld\n", -(querymi(l, r) - sum[l - 1]));
}
}
return 0;
}

Deltix Round, Summer 2021 Div1 + Div2 A~E的更多相关文章

  1. CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解

    目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...

  2. 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2

    ◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...

  3. Codeforce Round #643 #645 #646 (Div2)

    codeforce Round #643 #645 #646 div2 Round #643 problem A #include<bits/stdc++.h> using namespa ...

  4. Codeforces Round #503 Div1+Div2 1019&1020

    https://winniechen.cn/?p=188 这个还是直接放链接吧,毕竟内容比较多...

  5. codeforces round #414 div1+div2

    A:判断一下就可以了 #include<bits/stdc++.h> using namespace std; typedef long long ll; int a, b, c, n; ...

  6. TopCoder 603 div1 & div2

    div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...

  7. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  8. codeforces div1 & div2 参与人员分数统计

    Analysis helps to see the nature of things.

  9. Codeforces #505(div1+div2) D Recovering BST

    题意:给你一个升序的数组,元素之间如果gcd不为1可以建边,让你判断是否可以建成一颗二叉搜索树. 解法:dp,首先建图,然后进行状态转移.因为如果点k左端与i相连,右端与k相连,则i和k可以相连,同时 ...

  10. Codeforces #505(div1+div2) C Plasticine zebra

    题意:给你一段字符串,可以选择任意多的位置,每个位置会反转两边的字符串,问交错的字符串最长是多长? 思路:找规律,仔细分析样例1.假设位置为 1 2 3 4 5 6 7 8 9,反转之后会发现答案是7 ...

随机推荐

  1. 全屏API及vue3 hook封装

    最近在一个大屏项目遇到一个需求:用户可以通过一个按钮,触发页面部分模块全屏.通过以下API可以实现: Element.requestFullscreen()方法用于发出异步请求使元素进入全屏模式. 且 ...

  2. 2023第十四届极客大挑战 — MISC WP

    Misc方向题解:来自本人 cheekin 请前往"三叶草小组Syclover"微信公众号输入flag获得flag 我的解答: 关注公众号回复就可以得到一张图片,图片隐写zsteg ...

  3. 【Javaweb】Servlet六 | HttpServletRequest类的含义及其使用方法【详解】

    HttpServletRequest类的作用 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中.然后传递到Service方法(d ...

  4. 吉特日化MES实施--三种浪费

    在实施吉特日化MES系统的过程中,遇到各种问题,包括自身问题以及甲方问题,导致项目滞后延期的主要问题分析,汇总三种浪费: (1)  信息传递的浪费: 这个在甲方产品设计以及生产过程中出现的问题,也是我 ...

  5. Diffusion Model扩散模型

    1.扩散模型基本原理: 扩散模型包括两个步骤: 固定的(或预设的)前向扩散过程q:该过程会逐渐将高斯噪声添加到图像中,直到最终得到纯噪声. 2.可训练的反向去噪扩散过程pθ:训练一个神经网络,从纯噪音 ...

  6. Celery周期性任务定义beat

    通过celery beat可以使用周期性任务的定义. https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html 周期性任务bea ...

  7. keycloak~对接login-status-iframe页面判断用户状态变更

    上次我们说了,keycloak的login-status-iframe页面的作用,并解决了跨域情况下,iframe与主页面数据传递的方法,这一次,我们主要分析login-status-iframe.h ...

  8. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-36-处理web页面定位toast-下篇

    1.简介 按理说,现在这种一闪而过的toast的已经相当普及或者是见怪不怪了,应该网上的大网站会用到的,偶然的在一次租房中,看到了这种场景,所以宏哥决定将其拿来主义,进行演示实践一下. 2.租房网站 ...

  9. vivo 数据库备份恢复系统演化

    作者:vivo 互联网数据库团队 - Han Chaobing 介绍 vivo 数据库备份恢复功能的演化,以及对备份文件的功能扩展. 一.概述 vivo互联网领域拥有的数据库组件分别为 MySQL.M ...

  10. [NLP复习笔记] 基于负采样的 Skip-gram 及 SGD 训练公式推导

    1. one-hot 向量 我们先了解一下 \(\text{one-hot}\) 向量.\(\text{one-hot}\) 编码是表示分类变量的常见方法,尤其在数据预处理和机器学习的特征工程中.一个 ...