Submission #1348423

#TimeUsernameProblemLanguageResultExecution timeMemory
1348423PieArmyFire (BOI24_fire)C++20
100 / 100
1095 ms64640 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

int m;

struct Seg{
	int n;
	vector<pair<int,int>>tree,arr;
	void build(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left==right){
			tree[node]=arr[left];
			return;
		}
		build(node*2,left,mid);build(node*2+1,mid+1,right);
		tree[node]=max(tree[node*2],tree[node*2+1]);
	}
	void init(vector<pair<int,int>>Arr){
		arr=Arr;
		n=arr.size();
		tree.resize(n<<2);
		build();
	}
	int l,r;
	pair<int,int> qu(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left>=l&&right<=r)return tree[node];
		if(left>r||right<l)return{-1e9,-1};
		return max(qu(node*2,left,mid),qu(node*2+1,mid+1,right));
	}
	pair<int,int> query(int left,int right){
		l=left;r=right;
		if(l>r){
			r=n-1;
			pair<int,int> res=qu();
			r=right;
			l=0;
			pair<int,int>res2=qu();
			res=max(res,{res2.fr+m,res2.sc});
			return res;
		}
		return qu();
	}
};

int n,k=0;
map<int,int>mp;
pair<int,int>ara[200023];
int nex[200023];
int bin[200023][18];
int dp[200023][18];
Seg seg;
int ans=1e9;

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>ara[i].fr>>ara[i].sc;
		mp[ara[i].fr]=0;
		mp[ara[i].sc]=0;
	}
	for(auto&[a,b]:mp){
		b=k++;
	}
	{
		vector<pair<int,int>>arr(k,{-1e9,-1});
		for(int i=1;i<=n;i++){
			int dis=ara[i].sc-ara[i].fr;
			if(dis<0)dis+=m;
			pair<int,int>p={ara[i].fr+dis,i};
			arr[mp[ara[i].fr]]=max(arr[mp[ara[i].fr]],p);
		}
		seg.init(arr);
	}
	for(int i=1;i<=n;i++){
		int l=mp[ara[i].fr],r=mp[ara[i].sc];
		bin[i][0]=seg.query(l,r).sc;
		//cerr<<bin[i][0]<<" ";
		int x=bin[i][0];
		if(x==i)continue;
		int a=ara[i].fr,b=ara[i].sc,c=ara[x].fr,d=ara[x].sc;
		if(ara[i].fr>ara[i].sc)b+=m;
		if(ara[x].fr>ara[x].sc)d+=m;
		vector<int>v={a,b,c,d};
		sort(v.begin(),v.end());
		if(v[0]==a&&v[2]==b&&a+m<=v[3]){
			cout<<2<<endl;
			return 0;
		}
	}
	//cerr<<endl;
	for(int i=1;i<18;i++){
		for(int j=1;j<=n;j++){
			bin[j][i]=bin[bin[j][i-1]][i-1];
			dp[j][i]=dp[j][i-1];
			if(dp[j][i])continue;
			if(dp[bin[j][i-1]][i-1]){
				dp[j][i]=1;
				continue;
			}
			int x=bin[j][i-1];
			if(x==j)continue;
			int a=ara[j].fr,b=ara[x].sc,c=ara[x].fr,d=ara[bin[j][i]].sc;
			if(a>b)b+=m;
			if(c>d)d+=m;
			vector<int>v={a,b,c,d};
			sort(v.begin(),v.end());
			if(v[0]==a&&v[2]==b&&a+m<=v[3]){
				dp[j][i]=1;
			}
		}
	}
	/*for(int i=1;i<=n;i++){
		cerr<<i<<": ";
		for(int j=0;j<3;j++){
			cerr<<dp[i][j]<<" ";
		}
		cerr<<endl;
	}*/
	for(int i=1;i<=n;i++){
		int pos=i,dis=1;
		for(int j=18-1;j>=0;j--){
			if(dp[pos][j]){
				ans=min(ans,dis+(1<<j));
				continue;
			}
			int x=bin[pos][j];
			if(x==pos)continue;
			int a=ara[i].fr,b=ara[pos].sc,c=ara[pos].fr,d=ara[x].sc;
			if(a>b)b+=m;
			if(c>d)d+=m;
			vector<int>v={a,b,c,d};
			sort(v.begin(),v.end());
			if(v[0]==a&&v[2]==b&&a+m<=v[3]){
				ans=min(ans,dis+(1<<j));
				continue;
			}
			dis+=(1<<j);
			pos=bin[pos][j];
		}
	}
	if(ans==1e9)ans=-1;
	cout<<ans<<endl;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...