AC 代码 RE 求救?
查看原帖
AC 代码 RE 求救?
677163
Richard_H楼主2023/5/6 22:16

蒟蒻表示不理解:这个题数据范围是 1e5 ,我线段树数组开到 N(1e5+5) * 4 ,RE 了,改成 N = 1e6+5 就过了 why???why???why???

#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
const int N = 1e5+5, mod = 1e9+7;
int n, m;
lol tmp[2][2];

struct mrx 
{
	lol d[2][2] = {};
	
	void set (int &a, int &b) 
	{
		d[0][0] = a, d[0][1] = b;
	}
	
	void set_A () 
	{
		d[0][0] = d[1][0] = d[1][1] = 1;
	}
	
	void set_B () 
	{
		d[0][0] = d[0][1] = d[1][1] = 1;
	}
	
	void turn_ard () 
	{
		swap (d[0][0], d[1][1]);
		swap (d[0][1], d[1][0]);
	}
	
	void multi (mrx &a, mrx &b) 
	{
		memset (tmp, 0, sizeof tmp);
		for (int i = 0; i < 2; ++ i ) 
			for (int j = 0; j < 2; ++ j ) 
			{
				for (int k = 0; k < 2; ++ k ) 
					tmp[i][j] += a.d[i][k] * b.d[k][j] % mod;
				tmp[i][j] %= mod;
			}
		memcpy (d, tmp, sizeof d);
	}
	
	void out_put () 
	{
		printf ("%lld %lld\n", d[0][0], d[0][1]);
	}
	
} str[N];

struct brc 
{
	mrx x;
	bool rev_flg = false;
} tr[N * 4];

void push_up (int u) 
{
	tr[u].x.multi(tr[u << 1].x, tr[u << 1 | 1].x);
}

void push_down (int u) 
{
	if (tr[u].rev_flg) 
	{
		tr[u].rev_flg = false;
		tr[u << 1].x.turn_ard ();
		tr[u << 1 | 1].x.turn_ard ();
		tr[u << 1].rev_flg ^= 1;
		tr[u << 1 | 1].rev_flg ^= 1;
	}
}

void build (int u, int l, int r) 
{
	if (l == r) 
		tr[u].x = str[l];
	else 
	{
		int mid = (l + r) >> 1;
		build (u << 1, l, mid);
		build (u << 1 | 1, mid + 1, r);
		push_up (u);
	}
}

void modify (int u, int l, int r, int &lft, int &rht) 
{
	push_down (u);
	if (lft <= l && r <= rht) 
	{
		tr[u].x.turn_ard();
		tr[u].rev_flg ^= 1;
	}
	else 
	{
		int mid = (l + r) >> 1;
		if (mid >= lft) modify (u << 1, l, mid, lft, rht);
		if (mid < rht) modify (u << 1 | 1, mid + 1, r, lft, rht);
		push_up (u);
	}
}

mrx query (int u, int l, int r, int lft, int rht) 
{
	push_down (u);
	if (lft <= l && r <= rht) 
	{
		return tr[u].x;
	}
	else 
	{
		int mid = (l + r) >> 1;
		if (mid >= rht) return query (u << 1, l, mid, lft, rht);
		if (mid < lft) return query (u << 1 | 1, mid + 1, r, lft, rht);
		mrx lx = query (u << 1, l, mid, lft, rht), rx = query (u << 1 | 1, mid + 1, r, lft, rht);
		lx.multi (lx, rx);
		return lx;
	}
}

int main () 
{
	freopen ("in.txt", "r", stdin);
	scanf ("%d%d\n", &n, &m);
	for (int i = 1; i <= n; ++ i ) 
	{
		char c = getchar();
		if (c == 'A') 
			str[i].set_A();
		else 
			str[i].set_B();
	}
	build (1, 1, n);
	while (m -- ) 
	{
		int op, l, r;
		scanf ("%d%d%d", &op, &l, &r);
		if (op == 1) 
			modify (1, 1, n, l, r);
		else 
		{
			int a, b;
			scanf ("%d%d", &a, &b);
			mrx x, y = query (1, 1, n, l, r);
			x.set (a, b);
			x.multi(x, y);
			x.out_put ();
		}
	}
	
	return 0;
}

2023/5/6 22:16
加载中...