Submission #68655474


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int n,m,q;
struct lim{
	int l,r,x;
}a[200005];
int mx[200005];
vector<int> X[200005],pos[200005],seq[200005],R[200005];
struct node{
	int l,r,sum,multag;
}t[800005];
void pushup(int p){
	t[p].sum=(t[p*2].sum+t[p*2+1].sum)%mod;
}
void mul(int p,int v){
	t[p].sum=t[p].sum*v%mod;
	t[p].multag=t[p].multag*v%mod;
}
void pushdown(int p){
	if(t[p].multag!=1){
		mul(p*2,t[p].multag);
		mul(p*2+1,t[p].multag);
		t[p].multag=1;
	}
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r,t[p].multag=1,t[p].sum=0;
	if(l==r) return;
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}
void add(int p,int pos,int val){
	if(t[p].l==t[p].r){
		t[p].sum=val;
		return;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	if(mid>=pos) add(p*2,pos,val);
	else add(p*2+1,pos,val);
	pushup(p);
}
void modify(int p,int l,int r,int v){
	if(l<=t[p].l&&t[p].r<=r){
		mul(p,v);
		return;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	if(mid>=l) modify(p*2,l,r,v);
	if(mid<r) modify(p*2+1,l,r,v);
	pushup(p);
}
void prt(int p){
	if(t[p].l==t[p].r){
		cout<<t[p].sum<<" ";
		return;
	}
	pushdown(p);
	prt(p*2),prt(p*2+1);
}
int b[200005];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>q;
	set<int> Val;
	map<int,int> Idval;
	int tot=0;
	for(int i=1;i<=q;i++){
		cin>>a[i].l>>a[i].r>>a[i].x;
		X[a[i].l].push_back(a[i].x);
		X[a[i].r+1].push_back(-a[i].x);
		if(!Val.count(a[i].x)){
			Val.insert(a[i].x);
			Idval[a[i].x]=++tot;
			b[tot]=a[i].x;
		}
		seq[Idval[a[i].x]].push_back(i);
	}
	multiset<int> S;
	set<int> ALL;
	int ans=1;
	for(int i=1;i<=n;i++){
		for(int j:X[i]){
			if(j>0) S.insert(j);
			else S.erase(S.find(-j));
		}
		if(S.size()==0) mx[i]=-1;
		else mx[i]=*S.begin();
		if(mx[i]!=-1) pos[Idval[mx[i]]].push_back(i);
		else ans=ans*(m+1)%mod;
		ALL.insert(mx[i]);
	}
	for(int i=1;i<=q;i++){
		if(!ALL.count(a[i].x)){
			cout<<0<<"\n";
			return 0;
		}
	}
	for(int x=1;x<=tot;x++){
		if(pos[x].size()<=1) continue;
//		int lstl=0;
		for(int i:seq[x]){
			int p=upper_bound(pos[x].begin(),pos[x].end(),a[i].r)-pos[x].begin()-1;
			if(p<0){
				cout<<0<<"\n";
				return 0;
			}
			if(p!=pos[x].size()) R[pos[x][p]].push_back(a[i].l);
		}
		build(1,0,pos[x].size());
		add(1,0,1);
		int L=-1;
		for(int i=1;i<=pos[x].size();i++){
			int rpos=pos[x][i-1];
			int s=t[1].sum;
			modify(1,0,i-1,b[x]);
			add(1,i,s);
			int maxl=0;
			for(int l:R[rpos]){
				maxl=max(maxl,l);
			}
			if(maxl){
				int p=lower_bound(pos[x].begin(),pos[x].end(),maxl)-pos[x].begin();
				while(L<p){
					L++;
					add(1,L,0);
				}
			}
//			prt(1);cout<<"\n";
		}
//		if(lstl){
//			int p=lower_bound(pos[x].begin(),pos[x].end(),lstl)-pos[x].begin();
//			while(L<p){
//				L++;
//				add(1,L,0);
//			}
//		}
		for(int i:seq[x]){
			int p=upper_bound(pos[x].begin(),pos[x].end(),a[i].r)-pos[x].begin()-1;
			if(p!=pos[x].size()) R[pos[x][p]].clear();
		}
//		cout<<b[x]<<" "<<t[1].sum<<"\n"; 
		ans=ans*t[1].sum%mod;
	}
	cout<<ans<<"\n";
}
/*
f_{i,j}<-f_{i-1,j}*mx
f_{i,i}<-f_{i-1,*}
[maxl,r] s.t. r=i f_{i,1~maxl-1}=0
*/

Submission Info

Submission Time
Task Ex - Max Limited Sequence
User george0929
Language C++ 20 (gcc 12.2)
Score 600
Code Size 3282 Byte
Status AC
Exec Time 362 ms
Memory 48108 KiB

Compile Error

Main.cpp: In function ‘int main()’:
Main.cpp:114:29: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  114 |                         if(p!=pos[x].size()) R[pos[x][p]].push_back(a[i].l);
      |                            ~^~~~~~~~~~~~~~~
Main.cpp:119:30: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  119 |                 for(int i=1;i<=pos[x].size();i++){
      |                             ~^~~~~~~~~~~~~~~
Main.cpp:146:29: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  146 |                         if(p!=pos[x].size()) R[pos[x][p]].clear();
      |                            ~^~~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 28
Set Name Test Cases
Sample example_00.txt, example_01.txt, example_02.txt
All example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt
Case Name Status Exec Time Memory
example_00.txt AC 4 ms 3500 KiB
example_01.txt AC 4 ms 3548 KiB
example_02.txt AC 4 ms 3460 KiB
test_00.txt AC 151 ms 43212 KiB
test_01.txt AC 69 ms 25916 KiB
test_02.txt AC 174 ms 45944 KiB
test_03.txt AC 135 ms 32764 KiB
test_04.txt AC 171 ms 34936 KiB
test_05.txt AC 180 ms 34948 KiB
test_06.txt AC 90 ms 18496 KiB
test_07.txt AC 15 ms 6408 KiB
test_08.txt AC 104 ms 22264 KiB
test_09.txt AC 35 ms 9556 KiB
test_10.txt AC 71 ms 15736 KiB
test_11.txt AC 41 ms 11532 KiB
test_12.txt AC 31 ms 9996 KiB
test_13.txt AC 54 ms 13772 KiB
test_14.txt AC 61 ms 14780 KiB
test_15.txt AC 62 ms 14536 KiB
test_16.txt AC 61 ms 14528 KiB
test_17.txt AC 63 ms 14368 KiB
test_18.txt AC 62 ms 14708 KiB
test_19.txt AC 84 ms 18544 KiB
test_20.txt AC 82 ms 18696 KiB
test_21.txt AC 82 ms 18596 KiB
test_22.txt AC 362 ms 48108 KiB
test_23.txt AC 334 ms 48092 KiB
test_24.txt AC 345 ms 48052 KiB