P5609 [Ynoi2013] 对数据结构的爱 题解
事实上一个区间的答案就是区间和减去
于是问题难点在于如何求一个区间减去的次数。
注意到
我们可以对于线段树每个区间,维护
如果我们知道了所有区间的每个
问题是怎么求每个区间的
直接合并复杂度是两个儿子区间长度乘积,显然不太对,考虑观察性质。
性质
有这个性质能干什么?考虑从小到大枚举上问的
但是尽管这样,对于每个
考虑对答案的贡献这个式子:
于是我们做到了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n, m, p, a[N];
class SegmentTree
{
public:
struct Node
{
int l, r;
vector<long long> v;
long long sum;
}tr[N << 2];
void pushup(int u)
{
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
int l = tr[u].l, r = tr[u].r, mid = l + r >> 1;
int y = 0;
for (int x = 0; x <= mid - l + 1; x++)
{
if (y == r - mid + 1) y--;
if (y < 0) y = 0;
for (; y <= r - mid; y++)
{
long long g = tr[u << 1].v[x + 1] - 1 + tr[u << 1].sum - p * x;
long long k = tr[u << 1 | 1].v[y];
if (g < k)
{
y--;
break;
}
tr[u].v[x + y] = min(tr[u].v[x + y], max(tr[u << 1].v[x], tr[u << 1 | 1].v[y] - tr[u << 1].sum + x * p));
}
}
}
void build(int u, int l, int r)
{
tr[u] = { l, r };
tr[u].sum = a[r];
tr[u].v.resize(r - l + 3);
for (int i = 0; i < r - l + 3; i++) tr[u].v[i] = (long long)4e18;
tr[u].v[0] = (long long)-4e18;
if (l == r)
{
tr[u].v[1] = p - a[r];
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
long long query(int u, int l, int r, long long x)
{
if (tr[u].l >= l and tr[u].r <= r)
{
auto it = upper_bound(tr[u].v.begin() + 1, tr[u].v.end(), x);
--it;
long long g = tr[u].sum + x - (it - tr[u].v.begin()) * p;
return g;
}
int mid = tr[u].l + tr[u].r >> 1;
if (r <= mid) return query(u << 1, l, r, x);
if (l > mid) return query(u << 1 | 1, l, r, x);
return query(u << 1 | 1, l, r, query(u << 1, l, r, x));
}
}sgt;
signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> p;
for (int i = 1; i <= n; i++) cin >> a[i];
sgt.build(1, 1, n);
while (m--)
{
int l, r;
cin >> l >> r;
cout << sgt.query(1, l, r, 0ll) << "\n";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?