- 写出了自己的代码,然后用数据生成器对拍了一下。
- 对拍了大概三四组数据,都和题解输出完全一样qwq。
- 但是为啥我这个代码交上去就 WA 啊......
- 所以求大佬帮帮忙,这个该咋处理啊/kk
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 500005;
int n, m, opt, a, b, p, s, t[N], cnt;
struct node
{
int l, r, sum, maxi, lmaxi, rmaxi, maxil, maxir, lmaxir, rmaxil;
}tree[N << 2];
inline node push_up(node a, node b)
{
node tmp = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
tmp.sum = a.sum + b.sum;
tmp.l = a.l, tmp.r = b.r;
if(a.lmaxi < a.sum + b.lmaxi)
tmp.lmaxi = a.sum + b.lmaxi, tmp.lmaxir = b.lmaxir;
else tmp.lmaxi = a.lmaxi, tmp.lmaxir = a.lmaxir;
if(b.rmaxi <= b.sum + a.rmaxi)
tmp.rmaxi = b.sum + a.rmaxi, tmp.rmaxil = a.rmaxil;
else tmp.rmaxi = a.rmaxi, tmp.rmaxil = b.rmaxil;
if(a.maxi >= b.maxi && a.maxi >= a.rmaxi + b.lmaxi)
tmp.maxi = a.maxi, tmp.maxil = a.maxil, tmp.maxir = a.maxir;
else if(a.rmaxi + b.lmaxi >= a.maxi && a.rmaxi + b.lmaxi >= b.maxi)
tmp.maxi = a.rmaxi + b.lmaxi, tmp.maxil = a.rmaxil, tmp.maxir = b.lmaxir;
else tmp.maxi = b.maxi, tmp.maxil = b.maxil, tmp.maxir = b.maxir;
return tmp;
}
inline void build(int l, int r, int x)
{
tree[x] = {l, r, 0, 0, 0, 0, 0, 0, 0, 0};
if(l == r)
{
tree[x].maxi = tree[x].lmaxi = tree[x].rmaxi = tree[x].sum = t[l];
tree[x].maxil = tree[x].maxir = tree[x].lmaxir = tree[x].rmaxil = l;
return;
}
int mid = l + r >> 1;
build(l, mid, x << 1);
build(mid + 1, r, x << 1 | 1);
tree[x] = push_up(tree[x << 1], tree[x << 1 | 1]);
}
inline void update(int l, int r, int k, int x)
{
if(l <= tree[x].l && tree[x].r <= r)
return (void) (tree[x].sum = tree[x].maxi = tree[x].lmaxi = tree[x].rmaxi = k);
int mid = tree[x].l + tree[x].r >> 1;
if(l <= mid) update(l, r, k, x << 1);
if(r > mid) update(l, r, k, x << 1 | 1);
tree[x] = push_up(tree[x << 1], tree[x << 1 | 1]);
}
inline node query(int l, int r, int x)
{
if(l <= tree[x].l && tree[x].r <= r) return tree[x];
int mid = tree[x].l + tree[x].r >> 1, ans = 0;
bool flaga = 0, flagb = 0;
node a, b, tmp;
if(l <= mid) a = query(l, r, x << 1), flaga = 1;
if(r > mid) b = query(l, r, x << 1 | 1), flagb = 1;
if(flaga && flagb) tmp = push_up(a, b);
else if(flaga) tmp = a;
else if(flagb) tmp = b;
return tmp;
}
signed main()
{
ios :: sync_with_stdio(false);
while(cin >> n >> m)
{
cout << "Case " << ++cnt << ":\n";
memset(t, 0, sizeof t);
memset(&tree, 0, sizeof tree);
for(int i = 1; i <= n; i++) cin >> t[i];
build(1, n, 1);
while(m--)
{
cin >> a >> b;
cout << query(a, b, 1).maxil << ' ' << query(a, b, 1).maxir << '\n';
}
}
return 0;
}