AGC008

B

题目大意

给出一个序列,一开始全是白色,一次操作可以染黑或染白一段长度为 \(K\) 的区间,要让最后序列中黑色格子上数的和最大,求这个最大值。

解题思路

考虑找结论

发现我们一定要尽可能地把正数涂黑,负数涂白,由于对操作次数没有限制,因此对一个正数我们只要将其放在区间首位涂黑,再把后面的数涂白即可实现单独将其涂黑。

但是我们发现如果这么做最后的 \(K\) 个数就无法实现,同理,如果逆转从后往前涂那么前 \(K\) 个数就无法实现。

考虑一段从前往后,一段从后往前,中间就会有 \(K\) 个数无法实现,而其他正数都能取到

因此我们可以枚举这个无法实现的区间,如果它求和大于 \(0\) 就加上,否则不加,然后将剩下的所有正数求和加上。

代码上,我们可以维护两个前缀和,一个是序列的前缀和 \(s_1\),一个是正数的前缀和 \(s_2\)。

答案即为:

\[\max_{i=1}^{n-k+1}{(s_2[i - 1] + s_2[n] - s_2[i + k - 1] + \max(0, s_1[i + k - 1] - s_1[i - 1]))}
\]

代码

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std; const int N = 1e5 + 10; int n, k;
ll s1[N], s2[N], ans; int main()
{
ios :: sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> s1[i];
s2[i] = s2[i - 1];
if (s1[i] > 0)
{
s2[i] += s1[i];
}
s1[i] += s1[i - 1];
}
for (int i = 1; i <= n - k + 1; i++)
{
ans = max(ans, s2[i - 1] + s2[n] - s2[i + k - 1] + max(0ll, s1[i + k - 1] - s1[i - 1]));
}
cout << ans << endl;
return 0;
}

D

题目大意

构造一个序列 \(a\),使得:

  1. \(a\) 的长度为 \(N^2\),并且满足数字 \(1,2, \cdots, N\) 都各出现恰好 \(N\) 次。

  2. 对于 \(1 \le i \le N\),数字 \(i\) 在 \(a\) 中第 \(i\) 次出现的位置是 \(X_i\)。

解题思路

考虑贪心

题意即为:对于 \(1 \le i \le N\),位置 \(X_i\) 上的数为 \(i\),前面有 \(i-1\) 个 \(i\),后面有 \(n -i\) 个。

考虑先满足前一个条件,我们可以对 \(X_i\) 从小到大排序,然后放在 \(X_i\) 前面空位即可,放不下就必定无解。

但是我们为了顾及后面一个条件,那么就需要尽可能少地占用后面的空位,因此我们填数时在最前面的空位一定是最优的。

于是后面一个条件只需从大到小遍历,找后面的空位放即可(不一定要选取最后面,但为了编写方便,不妨就选最后的空位)。

代码

#include<bits/stdc++.h>
#define endl "\n"
using namespace std; const int N = 510; struct node
{
int id, x;
} b[N]; int n;
int a[N * N]; bool cmp(node x, node y)
{
return x.x < y.x;
} int main()
{
ios :: sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> b[i].x;
a[b[i].x] = i;
b[i].id = i;
}
sort(b + 1, b + n + 1, cmp);
for (int i = 1, p = 1; i <= n; i++)
{
for (int j = 1; j < b[i].id; j++)
{
while (p <= b[i].x && a[p] != 0)
{
p++;
}
if (p > b[i].x)
{
cout << "No" << endl;
return 0;
}
a[p++] = b[i].id;
}
}
for (int i = n, p = n * n; i >= 1; i--)
{
for (int j = b[i].id + 1; j <= n; j++)
{
while (p >= b[i].x && a[p] != 0)
{
p--;
}
if (p < b[i].x)
{
cout << "No" << endl;
return 0;
}
a[p--] = b[i].id;
}
}
cout << "Yes" << endl;
for (int i = 1; i <= n * n; i++)
{
cout << a[i] << " ";
}
return 0;
}

AGC008的更多相关文章

  1. 【AtCoder】AGC008

    AGC008 A - Simple Calculator 如果符号相同,那么如果y比x大直接走,否则需要两次反号 如果符号不同,需要绝对值的差加一次反号 如果有一个是0,且y比x要小,那只需要一次反号 ...

  2. AGC008 部分简要题解

    F 不妨前考虑 \(70 \%\) 的部分分,\(s\) 全部为 \(1\). 首先可以发现这个问题之所以困难是因为同一个联通子树可能可以被多个中心节点导出. 因此,我们考虑对于一个合法的联通子树,在 ...

  3. ZJOI2017 Day2

    私のZJOI Day2 2017-3-22 08:00:07 AtCoder试题选讲 SYC(Sun Yican) from Shaoxing No.1 High School 2017-3-22 0 ...

  4. AtCoder Grand Contest 1~10 做题小记

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...

  5. [AT2268] [agc008_f] Black Radius

    题目链接 AtCoder:https://agc008.contest.atcoder.jp/tasks/agc008_f 洛谷:https://www.luogu.org/problemnew/sh ...

  6. AtCoder Grand Contest 008 D - K-th K

    题目传送门:https://agc008.contest.atcoder.jp/tasks/agc008_d 题目大意: 给你一个长度为\(N\)的序列\(A\),请你构造一个长度为\(N^2\)的序 ...

  7. A@[G!C]%008

    A@[G!C]%008 A Simple Calculator 细节题. B Contiguous Repainting 最后只要有连续\(K\)个鸽子同色就可以构造方案,枚举+前缀和 C Tetro ...

  8. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

随机推荐

  1. Python之subprocess 执行报错

    问题 我用subprocess 执行命令查 主机Ip 报错 ​ command = """ "grep {0} /etc/hosts | awk '{print ...

  2. 22.使用Rancher2.0搭建Kubernetes集群

    使用Rancher2.0搭建Kubernetes集群 中文文档:https://docs.rancher.cn/docs/rancher2 安装Rancher2.0 使用下面命令,我们快速的安装 # ...

  3. Python新手教学

    ## 简介Python是一种简单易学的编程语言,广泛应用于各个领域,包括Web开发.数据科学.人工智能等.本文将为新手程序员提供Python基础知识的教学,包括变量.数据类型.条件语句.循环.函数等内 ...

  4. QT 6.8 安卓 Android 环境安装配置,你踩了几个坑,我教你跳出来,早看不入坑… …

    安装了QT6.8 最新版本,在线安装,用了数天后,想开始写一个Android程序,发现还在配置环境才可以继续,于是就开始配置: 菜单:编辑 -->preferences-->设备--> ...

  5. 鸿蒙hvigor构建任务依赖与生命周期简介

    Hivgor脚本文件 在构建的生命周期中Hvigor使用两个脚本文件来完成插件.任务以及生命周期hook的注册: hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的 ...

  6. JavaScript 编写的迷你 Lisp 解释器

    感谢@李欲纯 的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] Little Lisp是一个解释器,支持函数调用.lambda表达式. 变量绑定(let).数字.字符串.几个库 ...

  7. Java深度历险(四)——Java垃圾回收机制与引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

  8. Ubuntu默认启动到字符界面

    修改/etc/default/grub sudo cp /etc/default/grub /etc/default/grub.bak sudo chmod 0777 /etc/default/gru ...

  9. web移动端屏幕适配方案

    因为手机屏幕的分辨率大小不一 ,如果使用传统的静态布局,把每个元素的宽高样式写死,在不同的屏幕中就有各种各样的显示效果.这显然不是我们想要的结果.我们需要的是根据屏幕分辨率的不同,来适配不同的样式大小 ...

  10. 华为云云日志服务 HarmonyOS NEXT采集最佳实践

    鸿蒙背景介绍 华为鸿蒙HarmonyOS系统是面向万物互联的全场景分布式操作系统,支持手机.平板.智能穿戴.智慧屏等多种终端设备运行,提供应用开发.设备开发的一站式服务的平台.2024 年 1 月 1 ...