제출 #1348356

#제출 시각아이디문제언어결과실행 시간메모리
1348356PieArmyFire (BOI24_fire)C++20
13 / 100
638 ms42604 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 dep[200023],vis[200023];
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];
		nex[i]=seg.query(l,r).sc;
		//cerr<<nex[i]<<" ";
	}
	//cerr<<endl;
	for(int i=1;i<=n;i++){
		if(dep[i])continue;
		int pos=i;
		dep[pos]=1;
		vis[pos]=i;
		while(dep[pos]){
			if(dep[nex[pos]]){
				if(nex[pos]!=pos&&vis[nex[pos]]==vis[pos]){
					ans=min(ans,dep[pos]-dep[nex[pos]]+1);
				}
				break;
			}
			dep[nex[pos]]=dep[pos]+1;
			vis[nex[pos]]=vis[pos];
			pos=nex[pos];
		}
	}
	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...