結果
問題 | No.1549 [Cherry 2nd Tune] BANning Tuple |
ユーザー |
![]() |
提出日時 | 2021-06-11 22:51:37 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 18 ms / 4,000 ms |
コード長 | 3,132 bytes |
コンパイル時間 | 3,080 ms |
コンパイル使用メモリ | 190,564 KB |
最終ジャッジ日時 | 2025-01-22 06:32:16 |
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <unordered_set>#include <random>#include <cassert>#include <fstream>#include <utility>#include <functional>#include <time.h>#include <stack>#include <array>#include <list>#include <atcoder/all>#define popcount __builtin_popcountusing namespace std;using namespace atcoder;typedef long long ll;typedef pair<int, int> P;int main(){ll n; int Q; cin>>n>>Q;using mint=modint998244353;const int mx=3002;vector<mint> v(mx+1);v[0]=1;for(int i=1; i<=mx; i++) v[i]=v[i-1]*mint(n-1+i)/mint(i);int i0=0;map<ll, vector<int>> mp;for(int i=0; i<Q; i++){ll k;int a, b, s, t;cin>>k>>a>>b>>s>>t;b++;if(mp.find(k)!=mp.end()){auto ws=mp[k];vector<int> w;int q=0;for(int j=0; j<=mx; j++){if(!q && ws[j]){w.push_back(j);q=1;}else if(q && ws[j]==0){w.push_back(j);q=0;}}if(w[0]==0){i0-=w[1];for(int j=0; j<=mx; j++){for(int m=2; m<w.size(); m++){if(!(m&1) && j>=w[m]-w[1]) v[j]+=v[j-w[m]+w[1]];else if((m&1) && j>=w[m]-w[1]) v[j]-=v[j-w[m]+w[1]];}}}else{for(int j=0; j<=mx; j++){for(int m=0; m<w.size(); m++){if(!(m&1) && j>=w[m]) v[j]+=v[j-w[m]];else if((m&1) && j>=w[m]) v[j]-=v[j-w[m]];}}}}else{mp[k].resize(3001);}for(int j=a; j<b; j++) mp[k][j]++;auto ws=mp[k];vector<int> w;int q=0;for(int j=0; j<=mx; j++){if(!q && ws[j]){w.push_back(j);q=1;}else if(q && ws[j]==0){w.push_back(j);q=0;}}if(w[0]==0){i0+=w[1];for(int j=mx; j>=0; j--){for(int m=2; m<w.size(); m++){if(!(m&1) && j+w[m]-w[1]<=mx) v[j+w[m]-w[1]]-=v[j];else if((m&1) && j+w[m]-w[1]<=mx) v[j+w[m]-w[1]]+=v[j];}}}else{for(int j=mx; j>=0; j--){for(int m=0; m<w.size(); m++){if(!(m&1) && j+w[m]<=mx) v[j+w[m]]-=v[j];else if((m&1) && j+w[m]<=mx) v[j+w[m]]+=v[j];}}}mint ans=0;for(int j=max(0, s-i0); j<=t-i0; j++) ans+=v[j];cout<<ans.val()<<endl;}return 0;}