这就奇怪 * 2
查看原帖
这就奇怪 * 2
649315
心灵震荡楼主2023/7/16 18:35
  • 写出了自己的代码,然后用数据生成器对拍了一下。
  • 对拍了大概三四组数据,都和题解输出完全一样qwq。
  • 但是为啥我这个代码交上去就 WA 啊......
  • 所以求大佬帮帮忙,这个该咋处理啊/kk 代码:
// Problem: "Ray, Pass me the dishes!"
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/UVA1400
// Memory Limit: 0 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#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;
}
2023/7/16 18:35
加载中...