A题:HNOI2003]激光炸弹

按照蓝书上的教程做即可,注意这道题卡空间用int 而不是 long long

int g[5010][5010];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int N, R;
cin >> N >> R;
int xx = R, yy = R;
for (int i = 1; i <= N; ++i) {
int x, y, w;
cin >> x >> y >> w, ++x, ++y;
g[x][y] = w, xx = max(xx, x), yy = max(y, yy);
}
for (int i = 1; i <= xx; ++i)
for (int j = 1; j <= yy; ++j)
g[i][j] = g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1] +
g[i][j]; //求前缀和
int ans = 0;
for (int i = R; i <= xx; ++i)
for (int j = R; j <= yy; ++j)
//用提前算好的前缀和减去其他部分再补上多剪的那部分
ans =
max(ans, g[i][j] - g[i - R][j] - g[i][j - R] + g[i - R][j - R]);
cout << ans << "\n";
return 0;
}

B题:IncDec Sequence

设 a 的差分序列为 b.

则对区间 [l, r] 的数都加 1,就相当于 b[l]++, b[r + 1]--.

操作分为 4 种.

① 2 ≤ l ≤ r ≤ n (区间修改)

② 1 == l ≤ r ≤ n(修改前缀)

③ 2 ≤ l ≤ r == n + 1 (修改后缀)

④ 1 == l ≤ r == n + 1 (全修改)

其中操作 ④ 显然无用.

操作 ① 性价比最高.

于是可得出方案:先用操作 ① ,使得只剩下 正数 或 负数 ,剩下的用操作 ② 或 ③ 来凑.

using ll = long long;
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
vector<ll> a(n + 1, 0), b(n + 2);
for (int i = 1; i <= n; ++i) cin >> a[i], b[i] = a[i] - a[i - 1];
ll p = 0, q = 0;
for (int i = 2; i <= n; ++i) { // 2~n的正负数和统计
if (b[i] > 0) p += b[i];
else if (b[i] < 0) q -= b[i];
}
cout << max(p, q) << "\n" << llabs(p - q) + 1 << "\n";
return 0;
}

C题:Tallest Cow

差分数组,对于给出第一个区间a,b,他们之间的人肯定比他们矮,最少矮1,那么就在a+1位置-1,b位置加1,计算前缀和,a+1以及之后的都被-1了,b及以后的不变。

重复的区间,不重复计算。

另一种思路:先将所有的牛的高度都设为最大值 然后在输入一组数A B时 将A B之间的牛的高度都减一。

map<pair<int, int>, bool> vis;
int c[10010], d[10010];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n, p, h, m;
cin >> n >> p >> h >> m;
while (m--) {
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
if (vis[make_pair(a, b)]) continue; // 避免重复计算
vis[{a, b}] = true, d[a + 1]--, d[b]++;
}
for (int i = 1; i <= n; ++i) {
c[i] = c[i - 1] + d[i];
cout << h + c[i] << "\n";
}
return 0;
}

二分A题:Best Cow Fences

二分答案,判定是否存在一个长度不小于L的子段,平均数不小于二分的值。如果把数列中的每个数都减去二分的值,就转换为判定“是否存在一个长度不小于L的子段,子段和非负”。

先分别考虑两种情况的解法(1、子段和最大【无长度限制】,2、子段和最大,子段长度不小于L)

<==>求一个子段,使得它的和最大,且子段的长度不小于L。

子段和可以转换为前缀和相减的形式,即设\(sumj\)表示\(Ai 到 Aj\)的和,

则有:\(max{A[j+1]+A[j+2].......A[i] } ( i-j>=L ) \\ = max{ sum[i] - min{ sum[j] }(0<=j<=i-L) }(L<=i<=n)\)

仔细观察上面的式子可以发现,随着i的增长,j的取值范围 0~i-L 每次只会增大1。换言之,每次只会有一个新的取值进入 \(min\{sum_j\}\) 的候选集合,所以我们没必要每次循环枚举j,只需要用一个变量记录当前的最小值,每次与新的取值 sum[i-L] 取min 就可以了。

double a[100001], b[100001], sum[100001];
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n, L;
cin >> n >> L;
for (int i = 1; i <= n; ++i) cin >> a[i];
double eps = 1e-5;
double l = -1e6, r = 1e6;
while (r - l > eps) {
double mid = (l + r) / 2;
for (int i = 1; i <= n; ++i) b[i] = a[i] - mid;
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + b[i];
double ans = -1e10;
double min_val = 1e10;
for (int i = L; i <= n; ++i) {
min_val = min(min_val, sum[i - L]);
ans = max(ans, sum[i] - min_val);
}
if (ans >= 0)
l = mid;
else
r = mid;
}
cout << int(r * 1000) << "\n";
return 0;
}

0x03~04 前缀和与差分、二分的更多相关文章

  1. P1083 借教室(差分+二分)

    P1083 借教室 第一眼:线段树. 然鹅懒得写. 正解:差分+二分. 显然订单合法的上线可以二分 然后差分数组维护一下.没了. #include<iostream> #include&l ...

  2. [NOIP2015]运输计划 线段树or差分二分

    目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...

  3. ZZNU-OJ-2098 : Drink coffee【线段树合并区间或者 差分 + 二分索引树】

    : Drink coffee 时间限制: Sec 内存限制: MiB 提交: 答案正确: 提交 状态 讨论区 题目描述 为了在上课时保持清醒,凯伦需要一些咖啡.咖啡爱好者凯伦想知道最佳的温度来冲煮完美 ...

  4. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  5. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  6. Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)

     题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...

  7. 0x03 前缀和与差分

    前缀和 [例题]BZOJ1218 激光炸弹 计算二位前缀和,再利用容斥原理计算出答案即可. #include <iostream> #include <cstdio> #inc ...

  8. NOIP2012借教室[线段树|离线 差分 二分答案]

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  9. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  10. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

随机推荐

  1. C语言数组实现扫雷

    C语言数组->实现扫雷 包含头文件 #include <stdio.h> #include <stdlib.h> //用于生成随机数 #include <time. ...

  2. Kafka集群调优+能力探底

    一.前言 我们需要对4个规格的kafka能力进行探底,即其可以承载的最大吞吐:4个规格对应的单节点的配置如下: 标准版: 2C4G 铂金版: 4C8G 专业版: 8C16G 企业版: 16C32G 另 ...

  3. 【scikit-learn基础】--『数据加载』之真实数据集

    上一篇介绍了scikit-learn中的几个玩具数据集,本篇介绍scikit-learn提供的一些真实的数据集.玩具数据集:scikit-learn 基础(01)--『数据加载』之玩具数据集 1. 获 ...

  4. [ARC144E]GCD of Path Weights

    Problem Statement You are given a directed graph $G$ with $N$ vertices and $M$ edges. The vertices a ...

  5. 3D 高斯喷溅 🤗 为什么图形永远不会相同

    高斯喷溅 (Gaussian Splatting) 技术是一种翻天覆地的渲染手段,能够以 144 帧每秒的速度渲染出高质量的场景,这和传统的图形处理流程截然不同 这种将高斯数据转换成图像的过程,与训练 ...

  6. Docker命令之export|import、save|load

    1.export|import export docker export -o /ly/myexport-redis 49c26f7431d1 -o : 指定一个不存在的文件夹,存放导出的镜像 imp ...

  7. pytorch学习笔记——训练时显存逐渐增加,几个epoch后out-of-memory

    问题起因:笔者想把别人的torch的代码复制到笔者的代码框架下,从而引起的显存爆炸问题 该bug在困扰了笔者三天的情况下,和学长一同解决了该bug,故在此记录这次艰辛的debug之路. 尝试思路1:检 ...

  8. LeetCode227:基本计算器|| (栈、模拟)

    解题思路:两个双端队列模拟,一个存放操作数 a,另一个存放操作符 op,如果找到另一个操作数b,判断操作队列队尾是否是*/,是的话执行 a(*or/)b.遍历完字符串,如果操作符队列非空,说明还有+- ...

  9. 华企盾DSC服务器配置无法创建数据库

    测试连接的数据库用户没有创建数据库的权限,应该打开数据库控制台,把对应用户的权限都勾上

  10. PersistenceException 持久性异常

    首先查看他提供的错误信息 检查pom.xml文件,查看是否有: 确保文件夹是这种xml格式的 操作maven  >>>>clean 和compile       进行清理和重新 ...