QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#551270#9245. Bracket Sequenceucup-team3510#WA 704ms128600kbC++144.4kb2024-09-07 16:13:592024-09-07 16:14:00

Judging History

This is the latest submission verdict.

  • [2024-09-07 16:14:00]
  • Judged
  • Verdict: WA
  • Time: 704ms
  • Memory: 128600kb
  • [2024-09-07 16:13:59]
  • Submitted

answer

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const unsigned int mod=998244353;
inline void Add(int &x,int y)
{
	x+=y,x=x<mod?x:x-mod;
}
int n,m,ans[1000010];
char s[100010];
struct question
{
	int l,r,k,id;
};
vector<question> q[(1<<17)+10][2];
inline void add(bool op,int L,int R,int k,int id)
{
	int l=1,r=n,p=1;
	while(1)
	{
		int mid=l+r>>1;
		if(R<mid)
		{
			r=mid,p<<=1;
			continue;
		}
		if(L>mid+1)
		{
			l=mid+1,p=(p<<1)|1;
			continue;
		}
		q[p][op].push_back({L,R,k,id});
		break;
	}
}
void solve(int l,int r,int p)
{
	if(l==r)
	{
		return;
	}
	int mid=l+r>>1;
	static int f[100010][21][2][2];
	memset(f[mid+1],0,sizeof(f[mid+1]));
	f[mid+1][0][0][0]=1;
	for(int i=mid;i>=l;i--)
	{
		memcpy(f[i],f[i+1],sizeof(f[i]));
		for(int j=0;j<=20;j++)
		{
			for(int k=0;k<2;k++)
			{
				for(int l=0;l<2;l++)
				{
					int v=f[i+1][j][k][l];
					if(v)
					{
						if(s[i]=='(')
						{
							if(!j&&!k&&!l)
							{
								Add(f[i][0][0][1],v);
							}
							if(j<20&&k)
							{
								Add(f[i][j+1][0][l],v);
							}
						}
						else
						{
							if(j<20&&!k)
							{
								Add(f[i][j][1][l],v);
							}
						}
					}
				}
			}
		}
	}
	static int g[100010][21][2][2];
	memset(g[mid],0,sizeof(g[mid]));
	g[mid][0][0][0]=1;
	for(int i=mid+1;i<=r;i++)
	{
		memcpy(g[i],g[i-1],sizeof(g[i]));
		for(int j=0;j<=20;j++)
		{
			for(int k=0;k<2;k++)
			{
				for(int l=0;l<2;l++)
				{
					int v=g[i-1][j][k][l];
					if(v)
					{
						if(s[i]==')')
						{
							if(!j&&!k&&!l)
							{
								Add(g[i][0][0][1],v);
							}
							if(j<20&&k)
							{
								Add(g[i][j+1][0][l],v);
							}
						}
						else
						{
							if(j<20&&!k)
							{
								Add(g[i][j][1][l],v);
							}
						}
					}
				}
			}
		}
	}
	for(int i=0;i<q[p][0].size();i++)
	{
		int l=q[p][0][i].l,r=q[p][0][i].r,k=q[p][0][i].k;
		int &Ans=ans[q[p][0][i].id];
		for(int j=0;j<=k;j++)
		{
			Ans=(Ans+(long long)
			f[l][j][0][0]*g[r][k-j][0][0])%mod;
			if(j<k)
			{
				Ans=(Ans+(long long)
				f[l][j][0][1]*g[r][k-1-j][0][1])%mod;
			}
		}
	}
	for(int i=mid;i>=l;i--)
	{
		for(int j=0;j<=20;j++)
		{
			Add(f[i][j][0][0],f[i+1][j][0][0]);
			Add(f[i][j][0][1],f[i+1][j][0][1]);
		}
	}
	for(int i=mid+1;i<=r;i++)
	{
		for(int j=0;j<=20;j++)
		{
			Add(g[i][j][0][0],g[i-1][j][0][0]);
			Add(g[i][j][0][1],g[i-1][j][0][1]);
		}
	}
	static int F[100010][21][2];
	memset(F[mid+1],0,sizeof(F[mid+1]));
	F[mid+1][0][0]=1;
	for(int i=mid;i>=l;i--)
	{
		memcpy(F[i],F[i+1],sizeof(F[i]));
		for(int j=0;j<=20;j++)
		{
			for(int k=0;k<2;k++)
			{
				int v=F[i+1][j][k];
				if(v)
				{
					if(s[i]=='(')
					{
						if(j<20&&k)
						{
							Add(F[i][j+1][0],v);
						}
					}
					else
					{
						if(j<20&&!k)
						{
							if(j)
							{
								Add(F[i][j][1],v);
							}
							else
							{
								Add(F[i][j][1],mid-i);
							}
						}
					}
				}
			}
		}
	}
	static int G[100010][21][2];
	memset(G[mid],0,sizeof(G[mid]));
	G[mid][0][0]=1;
	for(int i=mid;i>=l;i--)
	{
		memcpy(G[i],G[i-1],sizeof(G[i]));
		for(int j=0;j<=20;j++)
		{
			for(int k=0;k<2;k++)
			{
				int v=G[i-1][j][k];
				if(v)
				{
					if(s[i]==')')
					{
						if(j<20&&k)
						{
							Add(G[i][j+1][0],v);
						}
					}
					else
					{
						if(j<20&&!k)
						{
							if(j)
							{
								Add(G[i][j][1],v);
							}
							else
							{
								Add(G[i][j][1],i-mid-1);
							}
						}
					}
				}
			}
		}
	}
	for(int i=mid;i>=l;i--)
	{
		for(int j=1;j<=20;j++)
		{
			Add(F[i][j][0],F[i+1][j][0]);
		}
	}
	for(int i=mid+1;i<=r;i++)
	{
		for(int j=1;j<=20;j++)
		{
			Add(G[i][j][0],G[i-1][j][0]);
		}
	}
	for(int i=0;i<q[p][1].size();i++)
	{
		int l=q[p][1][i].l,r=q[p][1][i].r,k=q[p][1][i].k;
		int &Ans=ans[q[p][1][i].id];
		for(int j=0;j<=k;j++)
		{
			Ans=(Ans+(long long)
			f[l][j][0][0]*g[r][k-j][0][0])%mod;
			if(j<k)
			{
				Ans=(Ans+(long long)
				f[l][j][0][1]*g[r][k-1-j][0][1])%mod;
			}
		}
		Add(Ans,F[l][k][0]);
		Add(Ans,G[r][k][0]);
	}
	solve(l,mid,p<<1);
	solve(mid+1,r,(p<<1)|1);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m>>s+1;
	for(int i=1,op,l,r,k;i<=m;i++)
	{
		cin>>op>>l>>r>>k;
		add(op-1,l,r,k,i);
	}
	solve(1,n,1);
	for(int i=1;i<=m;i++)
	{
		cout<<ans[i]<<'\n';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 18472kb

input:

5 20
(()()
1 1 2 1
1 1 3 1
1 1 4 1
1 1 5 1
1 2 3 1
1 2 4 1
1 2 5 1
1 3 4 1
1 3 5 1
1 4 5 1
2 1 3 1
2 1 4 1
2 1 5 1
2 2 3 1
2 2 4 1
2 2 5 1
2 3 5 1
2 4 5 1
1 1 5 2
2 1 5 2

output:

0
2
2
5
1
1
3
0
1
1
3
6
16
1
2
7
2
1
2
3

result:

ok 20 lines

Test #2:

score: -100
Wrong Answer
time: 704ms
memory: 128600kb

input:

100000 1000000
)())))))())()()()(())))()())))()))))())))))()(()()))()()))((()()))()))((())(())())()(()))))()))(()()()()()(())(()((()))()((()(()))()))()))()()))(())))()()(()(()())())((()((()((())()(()()))())(())())())))))))((())(((()(())())))(()(((())())))(((((((((()))()())())(()))(())()()()()((()())...

output:

807252937
606928536
88031079
122104482
597950507
716633829
810056267
719234156
392529556
736028324
426329153
576581877
315566541
444655931
76394527
216715407
31336797
926955022
529925464
302716489
498728925
1522883
192687717
78253278
690761534
503000238
605305965
33700395
340780822
88050137
23962861...

result:

wrong answer 2nd lines differ - expected: '333653009', found: '606928536'