求找 ub
  • 板块学术版
  • 楼主cmaths
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/1 10:39
  • 上次更新2023/11/2 10:27:39
查看原帖
求找 ub
300098
cmaths楼主2023/11/1 10:39

这份代码哪里有 ub??在本地和洛谷 ide 上输出不一样。

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define lx (x * 2)
#define rx (x * 2 + 1)

using namespace std;

const int N = 50000, INF = 0x3f3f3f3f, M = 3;
int n, a[N + 5];

void init()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
	}
}

struct Ma
{
	int a[M + 1][M + 1];
}mtx[N + 5], yuan;
Ma mul(Ma x, Ma y)
{
	Ma ret;
	for(int i = 1; i <= M; i++)
	{
		for(int j = 1; j <= M; j++)
		{
			int t = -INF;
			for(int k = 1; k <= M; k++)
			{
				t = max(t, x.a[i][k] + y.a[k][j]);
			}
			ret.a[i][j] = t;
		}
	}
	return ret;
}

void out(Ma x)
{
	for(int i = 1; i <= M; i++)
	{
		for(int j = 1; j <= M; j++)
		{
			printf("%d ", x.a[i][j]);
		}
		printf("\n");
	}
}

struct Tr
{
	Ma x;
}tr[N * 4 + 5];
void pushup(int x)
{
	tr[x].x = mul(tr[lx].x, tr[rx].x);
}
void build(int x, int l, int r)
{
	if(l == r)
	{
		mtx[l].a[1][1] = 0, mtx[l].a[1][2] = -INF, mtx[l].a[1][3] = -INF;
		mtx[l].a[2][1] = 0, mtx[l].a[2][2] = a[l], mtx[l].a[2][3] = -INF;
		mtx[l].a[3][1] = -INF, mtx[l].a[3][2] = a[l], mtx[l].a[3][3] = 0;
		tr[x].x = mtx[l];
		return;
	}
	build(lx, l, mid);
	build(rx, mid + 1, r);
	pushup(x);
}
Ma ask(int x, int l, int r, int s, int t)
{
	if(s > t)
	{
		return yuan;
	}
	if(l >= s && r <= t)
	{
		return tr[x].x;
	}
	Ma ret = yuan;
	if(s <= mid)
	{
		ret = mul(ret, ask(lx, l, mid, s, t));
	}
	if(t > mid)
	{
		ret = mul(ret, ask(rx, mid + 1, r, s, t));
	}
	return ret;
}
void mdf(int x, int l, int r, int s)
{
	if(l == r)
	{
		tr[x].x = mtx[l];
		return;
	}
	if(s <= mid)
	{
		mdf(lx, l, mid, s);
	}
	else
	{
		mdf(rx, mid + 1, r, s);
	}
	pushup(x);
}

void solve()
{
	for(int i = 1; i <= M; i++)
	{
		for(int j = 1; j <= M; j++)
		{
			if(i == j)
			{
				yuan.a[i][j] = 0;
			}
			else
			{
				yuan.a[i][j] = -INF;
			}
		}
	}
	build(1, 1, n);
	int Q;
	scanf("%d", &Q);
	while(Q--)
	{
		int op;
		scanf("%d", &op);
		if(op == 0)
		{
			int x, k;
			scanf("%d %d", &x, &k);
			a[x] = k;
			mtx[x].a[2][2] = a[x];
			mtx[x].a[3][2] = a[x];
			mdf(1, 1, n, x);
		}
		else
		{
			int l, r;
			scanf("%d %d", &l, &r);
			Ma ans;
			ans.a[1][1] = -INF;
			ans.a[1][2] = a[l];
//			ask(1, 1, n, l + 1, r);
			ans = mul(ans, ask(1, 1, n, l + 1, r));
			out(ans);
			printf("\n");
//			out(ask(1, 1, n, l + 1, r));
//			printf("\n");
//			out(ans);
//			printf("\n");
			printf("####### %d\n", max(ans.a[1][1], ans.a[1][2]));
		}
	}
}

int main()
{
	init();
	solve();
	return 0;
}

2023/11/1 10:39
加载中...