萌新代码求调
  • 板块P4891 序列
  • 楼主血色黄昏
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/9/22 21:31
  • 上次更新2023/11/4 05:52:29
查看原帖
萌新代码求调
220426
血色黄昏楼主2021/9/22 21:31

呜呜 写了7.5h了还是不知道哪里挂了,对拍出来只有很大的数据才有时会挂掉,有神仙帮忙看看吗/kel

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	register int x=0;register char ch=getchar();
	while(ch<48)ch=getchar();
	while(ch>=48)x=x*10+(ch^48),ch=getchar();
	return x;
}
int n, m, a[1000010], c[1000010], block[1000010], re[1000010], sq;
int mul[1000100], mulb[1000010], tag[1000010], f[1000010], p = 1e9 + 7;
int power[1000010];
struct node{
	int val, pos;
	bool operator < (const node a) const
	{
		return val < a.val;
	}
}b[1000010];
void pushdown(int i){for(int j = (i - 1) * sq + 1;j <= i * sq;j ++)c[j] = tag[i];}
void brush(int i)
{
	if(tag[i] != -1)pushdown(i);
	tag[i] = -1;
	sort(b + (i - 1) * sq + 1, b + min(n, i * sq) + 1);
	mul[i] = 1;
	mulb[(i - 1) * sq + 1] = b[(i - 1) * sq + 1].val;
	f[i] = (i - 1) * sq + 1;
	re[b[(i - 1) * sq + 1].pos] = (i - 1) * sq + 1;
	for(int j = (i - 1) * sq + 2;j <= min(n, i * sq);j ++)
	{
		mulb[j] = mulb[j - 1] * b[j].val % p;
		re[b[j].pos] = j;
	}
	for(int j = (i - 1) * sq + 1;j <= min(n, i * sq);j ++)
	{
		mul[i] = mul[i] * min(c[j], b[re[j]].val) % p;
	}
}
int Bfind(int x, int bl)
{
	for(;f[bl] <= min(bl * sq, n);f[bl] ++)if(b[f[bl]].val >= x)break;
	return f[bl] - 1;
}
int updateA(int pos, int val)
{
	power[0] = 1;
	for(int i = 1;i <= sq * 2;i ++)power[i] = power[i - 1] * val % p;
	a[pos] = val;
	int bl = block[pos], br = block[pos];
	for(;br <= block[n];br ++)if(tag[br] >= val or c[min(br * sq, n)] >= val)break;
	br = min(br, block[n]);
	if(tag[br] >= val)br --;
	pushdown(bl);
	pushdown(br);
	for(int i = pos;i <= min(bl * sq, n);i ++)c[i] = max(c[i], val);
	for(int i = (br - 1) * sq + 1;i <= min(br * sq, n);i ++)c[i] = max(c[i], val);
	brush(bl);
	brush(br);
	for(int i = bl + 1; i <= br - 1;i ++)
	{
		tag[i] = val;
		int lef = Bfind(val, i);
		mul[i] = mulb[lef] * power[i * sq - lef] % p;//l + 1 -- i * sq
	}
	int res = 1;
	for(int i = 1;i <= block[n];i ++)res = res * mul[i] % p;
	return (res + p) % p;
}
int updateB(int pos, int val)
{
	int res = 1;
	b[re[pos]].val = val;
	brush(block[pos]);
	for(int i = 1;i <= block[n];i ++)res = res * mul[i] % p;
	return (res + p) % p;
}
signed main()
{
	freopen("data.in","r",stdin);   
	freopen("q1.out","w",stdout);
	n = read();
	m = read();
	sq = sqrt(n);
	for(int i = 1;i <= n;i ++)
	{
		a[i] = read();
		c[i] = max(a[i], c[i - 1]);
		block[i] = (i - 1) / sq + 1;
	}
	for(int i = 1;i <= n;i ++)
	{
		b[i] = node{read(), i};
	}
	for(int i = 1;i <= block[n];i ++)
	{
		f[i] = (i - 1) * sq + 1;
		mul[i] = 1;
		sort(b + (i - 1) * sq + 1, b + min(n, i * sq) + 1);
		mulb[(i - 1) * sq + 1] = b[(i - 1) * sq + 1].val;
		tag[i] = -1;
        re[b[(i - 1) * sq + 1].pos] = (i - 1) * sq + 1;
        for(int j = (i - 1) * sq + 2;j <= min(n, i * sq);j ++)
		{
			mulb[j] = mulb[j - 1] * b[j].val % p;
			re[b[j].pos] = j;
		}
		for(int j = (i - 1) * sq + 1;j <= min(n, i * sq);j ++)
		{
			mul[i] = mul[i] * min(c[j], b[re[j]].val) % p;
		}
	}
	for(int i = 1;i <= m;i ++)
	{
		int op = read(), x = read(), y = read();
		if(op == 0)cout<<updateA(x, y)<<'\n';
		if(op == 1)cout<<updateB(x, y)<<'\n';
	}
	return 0;
}

如果有神仙帮我调出来的话 如果复赛有人带女装 我就去女装

2021/9/22 21:31
加载中...