結果

問題 No.1549 [Cherry 2nd Tune] BANning Tuple
ユーザー kotatsugamekotatsugame
提出日時 2021-06-11 23:59:47
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2,885 ms / 4,000 ms
コード長 1,493 bytes
コンパイル時間 1,542 ms
コンパイル使用メモリ 95,860 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-05-08 20:43:29
合計ジャッジ時間 35,869 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 47 ms
5,248 KB
testcase_01 AC 49 ms
5,376 KB
testcase_02 AC 99 ms
5,376 KB
testcase_03 AC 991 ms
5,780 KB
testcase_04 AC 1,066 ms
5,672 KB
testcase_05 AC 783 ms
5,580 KB
testcase_06 AC 771 ms
5,700 KB
testcase_07 AC 2,885 ms
6,872 KB
testcase_08 AC 2,565 ms
6,652 KB
testcase_09 AC 2,461 ms
6,704 KB
testcase_10 AC 2,287 ms
6,944 KB
testcase_11 AC 2,563 ms
6,688 KB
testcase_12 AC 2,377 ms
6,684 KB
testcase_13 AC 2,359 ms
6,768 KB
testcase_14 AC 2,405 ms
6,828 KB
testcase_15 AC 2,363 ms
6,624 KB
testcase_16 AC 2,398 ms
6,804 KB
testcase_17 AC 2,389 ms
6,748 KB
testcase_18 AC 2,421 ms
6,812 KB
testcase_19 AC 51 ms
5,376 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:11:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   11 | main()
      | ^~~~

ソースコード

diff #

#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<atcoder/modint>
using namespace std;
using mint=atcoder::modint998244353;
long N;
int Q;
mint C[101][3001];
main()
{
	cin>>N>>Q;
	for(int i=0;i<=100;i++)
	{
		mint x=1,y=1;
		for(int j=0;j<=3000;j++)
		{
			C[i][j]=x/y;
			x*=N-i+j+1;
			y*=j+1;
		}
	}
	map<long,set<pair<int,int> > >mp;
	for(int q=0;q<Q;q++)
	{
		long K;int A,B,S,T;
		cin>>K>>A>>B>>S>>T;
		B++;
		{
			set<pair<int,int> >now;
			for(pair<int,int>p:mp[K])
			{
				if(p.second<A)now.insert(p);
				else if(B<p.first)now.insert(p);
				else
				{
					if(A>p.first)A=p.first;
					if(B<p.second)B=p.second;
				}
			}
			now.insert(make_pair(A,B));
			mp[K].swap(now);
		}
		vector<vector<mint> >dp(mp.size()+1,vector<mint>(T+1));
		dp[0][0]=1;
		int cnt=0;
		for(auto&&S:mp)
		{
			vector<vector<mint> >ep(cnt+2,vector<mint>(T+1));
			for(int i=cnt;i>=0;i--)
			{
				for(pair<int,int>p:S.second)
				{
					int a=p.first,b=p.second;
					for(int j=0;j+a<=T;j++)
					{
						ep[i+1][j+a]+=dp[i][j];
						int r=j+b;
						if(r<=T)ep[i+1][r]-=dp[i][j];
					}
				}
			}
			cnt++;
			for(int i=0;i<=cnt;i++)
			{
				for(int j=1;j<=T;j++)ep[i][j]+=ep[i][j-1];
				for(int j=0;j<=T;j++)dp[i][j]+=ep[i][j];
			}
		}
		mint ans=0;
		for(int i=0;i<=cnt;i++)
		{
			for(int j=0;j<=T;j++)
			{
				mint f=dp[i][j];
				if(i&1)f=-f;
				mint val=C[i][T-j];
				if(S>j)
				{
					val-=C[i][S-j-1];
				}
				ans+=f*val;
			}
		}
		cout<<ans.val()<<endl;
	}
}
0