本地AC提交WA
查看原帖
本地AC提交WA
252015
Shiroko楼主2022/3/17 23:05
#include<bits/stdc++.h>
using namespace std;
#define ls (p<<1)
#define rs (p<<1)|1
#define mid ((l+r)>>1)
#define int long long

const int mod = 1000007;

int n, m, op, x, y, a[2929820];

struct node
{
	int max, min, sum, sqs, cbs;
	//node(int mx,int mn,int sm,int ss):max(mx),min(mn),sum(sm),sqs(ss){}
}ans[2929820];

node NOD(int a, int b, int c, int d, int e)
{
	node res;
	res.max = a;
	res.min = b;
	res.sum = c;
	res.sqs = d;
	res.cbs = e;
	return res;
}

void push_up(int p)
{
	ans[p].max = max(ans[ls].max, ans[rs].max) % mod;
	ans[p].min = min(ans[ls].min, ans[rs].min) % mod;
	ans[p].sum = (ans[ls].sum + ans[rs].sum) % mod;
	ans[p].sqs = (ans[ls].sqs + ans[rs].sqs) % mod;
	ans[p].cbs = (ans[ls].cbs + ans[rs].cbs) % mod;
}

void build(int l, int r, int p)
{
	if (l == r)
	{
		ans[p] = NOD(a[l], a[l], a[l], (a[l] * a[l]) % mod, (((a[l] * a[l]) % mod) * a[l]) % mod);
		return;
	}
	build(l, mid, ls);
	build(mid + 1, r, rs);
	push_up(p);
}

void update(int nl, int nr, int l, int r, int p, int k)
{
	if (l == r)
	{
		ans[p] = NOD(k, k, k, (k * k) % mod, (((k * k) % mod) * k) % mod);
		return;
	}
	if (nl <= mid)
		update(nl, nr, l, mid, ls, k);
	if (nr > mid)
		update(nl, nr, mid + 1, r, rs, k);
	push_up(p);
}

node query(int nl, int nr, int l, int r, int p)
{
	//if (r<nl || l>nr) return;
	if (nl <= l && nr >= r)
		return ans[p];
	node res1 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
	node res2 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
	node res3 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
	if (nl <= mid)
		res1 = query(nl, nr, l, mid, ls);
	if (nr > mid)
		res2 = query(nl, nr, mid + 1, r, rs);
	res3.max = max(res1.max, res2.max) % mod;
	res3.min = min(res1.min, res2.min) % mod;
	res3.sum = (res1.sum + res2.sum) % mod;
	res3.sqs = (res1.sqs + res2.sqs) % mod;
	res3.cbs = (res1.cbs + res2.cbs) % mod;
	return res3;
}

int read()
{
	int res = 0, f = 1;
	char c = getchar();
	while (!isdigit(c))
	{
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (isdigit(c))
	{
		res = res * 10 + c - '0';
		c = getchar();
	}
	return res * f;
}

int square(int k)
{
	return k * (k + 1) % mod * (2 * k + 1) % mod;
}

int cubic(int k)
{
	return k * (k + 1) % mod * k % mod * (k + 1) % mod;
}

void tree(int l,int r,int p)
{
	if(l>r)
		return;
	cout << ans[p].max << " " << ans[p].min << " " << ans[p].sum << " " << ans[p].sqs << " " << ans[p].cbs << endl;
	tree(l,mid,ls);
	tree(mid+1,r,rs);
}

signed main()
{
	// freopen("read.in","r",stdin);
	// freopen("ans.out","w",stdout);
	n = read();
	m = read();
	for (int i = 1; i <= n; i++)
		a[i] = read();
	build(1, n, 1);
	for (int i = 1; i <= m; i++)
	{
		op = read();
		x = read();
		y = read();
		if (op == 1)
			update(x, x, 1, n, 1, y);
		if (op == 2)
		{
			node res = query(x, y, 1, n, 1);
			if (res.max - res.min != y - x)
				printf("yuanxing\n");
			else if (res.sum%mod != (((res.max + res.min)%mod) * ((res.max - res.min + 1)%mod) / 2)%mod)
				printf("yuanxing\n");
			else if (res.sqs * 6 % mod != ((square(res.max) - square(res.min - 1)) % mod + mod) % mod)
				printf("yuanxing\n");
			else if (res.cbs * 4 % mod != ((cubic(res.max) - cubic(res.min - 1)) % mod + mod) % mod)
				printf("yuanxing\n");
			else
				printf("damushen\n");
		}
	}
}

#4的数据点我下下来自己对答案是正确的但是交上去就挂了

救救孩子

2022/3/17 23:05
加载中...