제출 #1148373

#제출 시각아이디문제언어결과실행 시간메모리
1148373UmairAhmadMirzaBouquet (EGOI24_bouquet)C++20
8 / 100
102 ms12520 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
int const N=2e5+5;
int const mod=1e9+7;


int L[N],R[N];
int seg[4*N];
int dp[2*N];
int n;

void modify(int p,int val,int v=1,int s=0,int e=n){
	if(e-s==1){
		//s==p
		seg[v]=val;
		return;
	}
	int mid=(s+e)/2, lc=2*v, rc=(2*v)+1;
	if(p<mid)
		modify(p,val,lc,s,mid);
	else
		modify(p,val,rc,mid,e);
	seg[v]=max(seg[lc],seg[rc]);
}
//e and r are exclucive
//l and r is segment we want
//0 based in ranges but  first node of segment tree is 1
int query(int l,int r,int v=1,int s=0,int e=n){
	if(e<=l || s>=r) return 0;//completely outside
	if(l<=s && e<=r) return seg[v];//completely inside
	int mid=(s+e)/2, lc=2*v, rc=(2*v)+1;
	return max(query(l,r,lc,s,mid),query(l,r,rc,mid,e));
}

signed main(){
	cin>>n;
	deque<pair<int,int>> ir;
	for (int i = 1; i <=n; ++i)
	{
		cin>>L[i]>>R[i];
		ir.push_back({i+R[i],i});
	}
	sort(ir.begin(), ir.end());
	for (int i = 1; i <=n; ++i)
	{
		dp[i]=1;
		if((i-L[i])>1)
			dp[i]+=query(0,((i-L[i])-1));
		// dp[i]=max(dp[i-1],dp[i]);
		modify(i-1,dp[i]);
		// cout<<dp[i]<<' ';
		// while(ir.size() && ir[0].first<=i){
		// 	update(ir[0].second,dp[ir[0].second]);
		// 	ir.pop_front();
		// }
	}
	// cout<<endl;
	cout<<dp[n]<<endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...