QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#352623#7992. 【模板】线段树Kevin5307WA 1ms7816kbC++202.0kb2024-03-13 14:21:422024-03-13 14:21:42

Judging History

你现在查看的是最新测评结果

  • [2024-03-13 14:21:42]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:7816kb
  • [2024-03-13 14:21:42]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define ls (x<<1)
#define rs (ls|1)
using ll=long long;
const ll mod=(1<<20)-1;
ll a[200200];
ll segt[200200<<2][20];
ll tag[200200<<2];
ll C[22][22];
void pushdown(int x,int l,int r)
{
	if(!tag[x]) return ;
	static ll pw[20];
	pw[0]=1;
	for(int i=1;i<20;i++)
		pw[i]=pw[i-1]*tag[x]%mod;
	for(int i=0;i<20;i++)
		for(int j=i+1;j<20;j++)
			segt[x][i]=(segt[x][i]+segt[x][j]*C[j][i]*pw[j-i])&mod;
	if(l!=r)
	{
		tag[ls]=(tag[ls]+tag[x])&mod;
		tag[rs]=(tag[rs]+tag[x])&mod;
	}
	tag[x]=0;
}
void pushup(int x,int l,int r)
{
	int mid=(l+r)/2;
	pushdown(ls,l,mid);
	pushdown(rs,mid+1,r);
	for(int i=0;i<20;i++)
		segt[x][i]=0;
	for(int i=0;i<20;i++)
		for(int j=0;j<20-i;j++)
			segt[x][i+j]=(segt[x][i+j]+segt[ls][i]*segt[rs][j])&mod;
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		segt[x][1]=1;
		segt[x][0]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(x,l,r);
}
void update(int x,int l,int r,int ql,int qr,ll v)
{
	pushdown(x,l,r);
	if(ql<=l&&r<=qr)
	{
		tag[x]=(tag[x]+v)&mod;
		return ;
	}
	int mid=(l+r)/2;
	if(ql<=mid)
		update(ls,l,mid,ql,qr,v);
	if(qr>mid)
		update(rs,mid+1,r,ql,qr,v);
	pushup(x,l,r);
}
ll query(int x,int l,int r,int ql,int qr)
{
	pushdown(x,l,r);
	if(l==ql&&r==qr)
		return segt[x][0];
	int mid=(l+r)/2;
	if(qr<=mid)
		return query(ls,l,mid,ql,qr);
	if(ql>mid)
		return query(rs,mid+1,r,ql,qr);
	return query(ls,l,mid,ql,mid)*query(rs,mid+1,r,mid+1,qr)&mod;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	for(int i=0;i<22;i++)
		C[i][i]=C[i][0]=1;
	for(int i=2;i<22;i++)
		for(int j=1;j<i;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])&mod;
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(q--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1)
		{
			ll x;
			cin>>x;
			update(1,1,n,l,r,x);
		}
		else
			cout<<query(1,1,n,l,r)<<'\n';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 7816kb

input:

10 10
969575 741825 24903 1047319 450475 256145 1045323 479255 810659 768323
1 5 6 3034
2 1 10
2 1 9
2 1 4
1 3 6 126904
2 5 5
2 9 9
1 7 7 853094
1 4 9 1025178
2 5 8

output:

1045541
1012343
558151
580413
810659
310899

result:

wrong answer 6th lines differ - expected: '527353', found: '310899'