【GDKOI 2024 TG Day2】不休陀螺(top) 题解
考虑一个卡牌区间怎样才不是“陀螺无限”。
一个是费用在打到一半时费用就不够了。考虑构造一个卡牌序列使其尽量能够在打到一半时费用就不够,如何构造呢?
把 \(a_i > b_i\) 的卡牌称作消耗型卡牌,其他叫做获得型卡牌。我们可以构造把消耗型卡牌全部放在前面,后面突然来个很大的 \(a_i\) 就可以让你费用耗尽了。
但是我们不能贪心地选择,因为假如我们选择这个突然来的很大的 \(a_i\) 也是一个很大的消耗型卡牌,如果把它作为“引火线”就会导致前面消耗的费用不够多,这个导火线也就导不了火。
其实我们可以储存 \(E-a_i\) 表示在使用这张卡片前最多能够消耗的费用,假如一个区间其余的消耗型卡牌起作用使得 \(E-a_i-\text{其他消耗型卡牌的消耗}<0\),那么这个区间就不是”陀螺无限“。这个可以拿线段树维护。
我们只需要枚举区间左端点,然后计算最大的右端点,这个区间内的所有卡牌区间就都是合法方案了,\(O(n^2)\)。
我们会发现,左端点向右移动一位后,对区间内的影响是什么?
如果这个左端点是个消耗型卡牌,那么区间的消耗都会补回这个消耗,这个区间可能合法了,右端点可能可以往右移动;如果左端点是获得性卡牌,对区间没有任何影响。
这说明右端点是递增的,可以均摊 \(O(n)\) 得到合法区间。
另外一个卡牌区间不是”陀螺无限“是这个区间的代价 \(\sum b_i-\sum a_i<0\),这样就算打完一周后总费用也会减少,那么以此类推会越来越少。
这个比较简单,可以维护代价前缀和,也就是求 \(s_i-s_{j-1}\ge0\) 区间个数,即 \(s_i\ge s_{j-1}\),这个可以树状数组维护。
#include <cstdio>
#include <algorithm>
#define ll long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define N 1000010
using namespace std;
ll n, e, ans, len;
ll a[N], b[N], c[N]; // ci表示第i个会被扣掉多少
ll s[N], ss[N], to[N];
ll t[4*N]; // 维护每个位置的数能扣多少
ll lazy[4*N];
inline ll min(ll x, ll y) {
return x > y ? y : x;
}
void pushup(ll pos) {
t[pos] = min(t[ls(pos)], t[rs(pos)]);
}
void pushdown(ll pos) {
t[ls(pos)] += lazy[pos];
t[rs(pos)] += lazy[pos];
lazy[ls(pos)] += lazy[pos];
lazy[rs(pos)] += lazy[pos];
lazy[pos] = 0;
}
void update(ll nl, ll nr, ll l, ll r, ll pos, ll k) {
if(nl > nr) return;
if(nl <= l && r <= nr) {
t[pos] += k; // 维护最小值
lazy[pos] += k;
return;
}
if(lazy[pos]) {
pushdown(pos);
}
ll mid = (l + r) >> 1;
if(nl <= mid) {
update(nl, nr, l, mid, ls(pos), k);
}
if(mid < nr) {
update(nl, nr, mid+1, r, rs(pos), k);
}
pushup(pos);
}
ll query(ll nl, ll nr, ll l, ll r, ll pos) {
if(nl <= l && r <= nr) {
return t[pos];
}
if(lazy[pos]) {
pushdown(pos);
}
ll mid = (l + r) >> 1;
ll res = 1e15;
if(nl <= mid) {
res = min(res, query(nl, nr, l, mid, ls(pos)));
}
if(mid < nr) {
res = min(res, query(nl, nr, mid+1, r, rs(pos)));
}
return res;
}
// 桶
ll tong[N];
inline ll lowbit(ll x) {
return x & (-x);
}
void update1(ll x, ll val) {
while(x<=len) {
tong[x] += val;
x += lowbit(x);
}
}
ll query1(ll x) {
ll res=0;
while(x) {
res += tong[x];
x -= lowbit(x);
}
return res;
}
ll read() {
ll x = 0;
char c = '.';
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
x = (x<<1)+(x<<3)+(c^'0');
c = getchar();
}
return x;
}
int main() {
freopen("top.in", "r", stdin);
freopen("top.out", "w", stdout);
n =read(),e=read();
for(ll i = 1; i <= n; i++) a[i] = read();
for(ll i = 1; i <= n; i++) b[i] = read();
for(ll i = 1; i <= n; i++) c[i] = a[i] - b[i]; // 反过来好处理
for(ll i = 1; i <= n; i++) {
s[i] = s[i-1];
s[i] -= c[i];
ss[i+1] = s[i]; // 离散化使用
}
// 离散化
sort(ss+1, ss+1+n+1); // 把0也离散化
len = unique(ss+1, ss+1+n+1)-ss-1;
for(ll i = 0; i <= n; i++) {
ll l = 1, r = len; // 考场上不会用lower_bound
while(l <= r) {
ll mid = (l + r) >> 1;
if(ss[mid] < s[i]) l = mid+1;
if(ss[mid] > s[i]) r = mid-1;
if(ss[mid] == s[i]) {
to[i] = mid;
break;
}
}
}
ll r = 1;
bool flag = 0; // 表示已经加入过r了,不用再加入了
ll cost = 0;
for(ll l = 1; l <= n; l++) {
for(; r <= n; r++, flag=0) {
if(!flag) {
if(c[r] > 0) update(l, r-1, 1, n, 1, -c[r]); // 因为加入了r,前面的数都要多扣一个r
update(r, r, 1, n, 1, e - a[r] - cost);
if(c[r] > 0) cost += c[r]; // 把这一位加入cost
flag = true;
update1(to[r], 1);
}
if(query(l, r, 1, n, 1) < 0) { // 如果存在一种方式扣完,那就没了
break;
}
// printf("%lld %lld\n", l, r);
}
// 原本是求l到r内有多少个i使得 s[i]-s[l-1]>=0,也就是有多少个 s[i]>=s[l-1]
// for(ll i = l; i < r; i++) {
// if(s[i] - s[l-1] >= 0) {
// ans++;
// printf("%lld %lld\n", l, i);
// }
// }
if(r <= n) update1(to[r], -1); // 第r位被剔除,所以第r位是不合法的
ans += query1(len) - query1(to[l-1]-1);
if(r <= n) update1(to[r], 1);
// 要剔除最左边那个cost
if(c[l] > 0) cost -= c[l];
if(c[l] > 0) update(l+1, r, 1, n, 1, c[l]);
// 把这l踢出桶
update1(to[l], -1);
}
printf("%lld", ans);
}
【GDKOI 2024 TG Day2】不休陀螺(top) 题解的更多相关文章
- 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
计算系数 题目描述 给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数. [数据范围] 对于 30%的数据,有0≤k≤10: 对于 50%的数据,有a = 1,b = 1: 对于 ...
- 2019.11.12&13题解
写在前面: 虽然拿到了rk1,但是T3被卡常TLE90分,(考后再交就A了!?),lemon80,又丢失了一次良好的AK机会, 掐头去尾距离联赛仅剩2天,最近中午一直睡不好,可能是有些紧张, 希望自己 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 题解【洛谷P1315】[NOIP2011]观光公交
题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...
- 【数论】洛谷P1313计算系数
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- MATLAB-卡尔曼滤波简单运用示例
1.角度和弧度之间的转换公式? 设角度为 angle,弧度为 radian radian = angle * pi / 180; angle = radian * 180 / pi; 所以在matla ...
- NOIp2018 pj 滚粗记
NOIp2018 pj 滚粗记 考前 一个午觉睡完就到了考场 考中 \(T1\)水题切了 \(T2\)水题切了 \(T3\)好像是\(dp\),不会,先跳 \(T4\)像树上莫队一样,然后再欧拉序上面 ...
- 哈希Hash在字符串中的应用_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 哈希大家都会用撒,字符串显然都会写撒,那么哈希离散化字符串不就懂了?!(XXX的神逻辑,其实原文是:树都晓得吧,数组显然都会开呀,那么恭喜 ...
随机推荐
- RGB、HSV、HSL和CMYK颜色空间
目录 简介 RGB(红绿蓝)颜色空间 HSV(色调.饱和度.亮度)颜色空间 HSL(色调.饱和度.亮度)颜色空间 CMYK(青.品红.黄.黑)颜色空间 简介 这四种颜色空间在不同的应用领域有不同的用途 ...
- C语言中的rand()函数实例分析
一 前记: c语言中需要用到随机值得时候,每次都自己写,这样太浪费效率了,这次遇到了一个经典的代码,就珍藏起来吧. 二 实例分析: 1 #include <stdio.h> 2 3 int ...
- 06_Qt开发基础
.pro文件的配置 跨平台配置 之前我们分别在Windows.Mac环境的Qt项目中集成了FFmpeg. 可以发现在.pro文件的配置中,FFmpeg库在Mac.Windows上的位置是有所差异的.这 ...
- RecyclerView问题汇总
目录介绍 25.0.0.0 请说一下RecyclerView?adapter的作用是什么,几个方法是做什么用的?如何理解adapter订阅者模式? 25.0.0.1 ViewHolder的作用是什么? ...
- vue前端项目中遇到的问题以及解决方案-不定时更新
1.vue-cli创建vue项目中全局使用mixin 首先需要安装插件 npm install style-resources-loader vue-cli-plugin-style-resource ...
- Linux开发相关命令整理
1. 反转shell 2. ldd 3. objdump 4. ldconfig 5. telnet 6. nc 7. netstat 8. ss 9. tcpdump 10. lsof 11. st ...
- quartus之ram的IP测试
quartus之ram的IP测试 1.基本原理 ram,读取存储器,用于储存数据.基本的原理就是使用时钟驱动时序,利用地址区分位置,使用使能控制写入.输出的结果以写入的位宽输出. 2.实际操作 顶层代 ...
- KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
案例说明: 相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点. 适用版本: Kingbase ...
- ubuntu 联网
使用NAT
- 如何保证MySQL和Redis数据一致性?
背景 在高并发的业务场景中,因为MySQL数据库是操作磁盘效率比较低,因此大多数情况下数据库都是高并发系统的瓶颈.因为Redis操作数据是在内存中进行,所以就需要使用Redis做一个缓存.让请求先访问 ...