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. PCI 设备 RTX 驱动开发方法 -5565反射内存

    PCI 设备 RTX 驱动开发方法 RTX 下操作外设时, 需要把设备从 Windows 移动到 RTX 下面,具体移植方法可以参考 RTX Help 文档中间 Converting a Window ...

  2. commons.dbutils1.2介绍及使用

    一.结构介绍 高层结构图: wrappers包: handlers包(部分): 二.功能介绍 commons.dbutils是一个对JDBC操作进行封装的类集,其有如下几个优点: (1)没有可能的资源 ...

  3. mongo之常见问题

    最近发现服务器上的MongoDB由于oom导致服务被杀死 1.查看oom时间 grep "Out of memory" /var/log/message 或者 dmesg -T|g ...

  4. JAVA中ScheduledExecutorService的使用方法

    ScheduledExecutorService 简介 ScheduledExecutorService是 Java 中的一个接口,它是ExecutorService的子接口.它主要用于在给定的延迟之 ...

  5. 前端每日一知之你需要知道的JSON.stringify

    脑图在线链接 本文内容依据[web开发]公众号精彩文章总结而来

  6. VTK 显示3D模型的网格线(线框/wireframe)

    在VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装的Qt例子中,想显示球体表面的网格线(线框/wireframe),设置actor的EdgeVisibilityOn ...

  7. Gitee三方登录_Python (超详细)

    第三方登录是一种常见的身份验证机制,允许用户使用他们在其他平台(如社交媒体.电子邮件服务或开发平台)的账号来登录你的应用或网站,而不需要创建新的用户名和密码.这种方式不仅简化了用户的登录过程,还提高了 ...

  8. 为什么C#越来越恶心

    看看这个 再看这些 more 老子声明个空函数,没有访问数据请改为 static,真是越来越智障 为什么一个活泼的语言越搞越像 C++? C# 发明了各种可爱的小玩意儿,尤其是 async/await ...

  9. HBaseIntrospector

    package x;import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; ...

  10. Qt编写百度地图综合应用(在线+离线+区域)

    一.前言 在现在很多的应用系统中,会提供一个地图模块,地图相关的应用和app也是非常多,最广泛的应用就属于导航,地图基本上分在线的和离线的两种,在线的一般都是实时的,数据也是最新的,速度很快路线很准, ...