제출 #1348020

#제출 시각아이디문제언어결과실행 시간메모리
1348020PieArmyFire (BOI24_fire)C++20
53 / 100
2095 ms27044 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 n,m;
pair<int,int>ara[200023];
multiset<int>st;
map<int,pair<vector<int>,vector<int>>>mp;
int cev=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;
		if(ara[i].sc==0)ara[i].sc=m;
	}
	sort(ara+1,ara+n+1,[&](const pair<int,int> &x,const pair<int,int> &y){
		return x.sc-x.fr<y.sc-y.fr;
	});
	for(int i=1;i<=n;i++){
		if(ara[i].sc<ara[i].fr){
			int bas=ara[i].sc,son=ara[i].fr;
			mp.clear();
			st.clear();
			for(int j=1;j<=n;j++){
				if(ara[j].sc<ara[j].fr){
					mp[0].fr.pb(ara[j].sc);
					mp[ara[j].fr].fr.pb(m);
				}
				else{
					mp[ara[j].fr].fr.pb(ara[j].sc);
				}
			}
			st.insert(0);
			mp[bas].sc.pb(0);
			int ans=1;
			mp[son];
			while(mp.size()){
				vector<int>&ekle=mp.begin()->sc.fr;
				vector<int>&sil=mp.begin()->sc.sc;
				if(mp.begin()->fr==son){
					if(st.size())ans+=*st.begin();
					else ans=1e9;
					break;
				}
				for(int x:ekle){
					if(st.size()){
						int y=*st.begin()+1;
						mp[x].sc.pb(y);
						st.insert(y);
					}
				}
				for(int x:sil){
					st.erase(st.find(x));
				}
				mp.erase(mp.begin());
			}
			cev=min(cev,ans);
		}
	}
	int bas=0,son=m;
	mp.clear();
	st.clear();
	for(int j=1;j<=n;j++){
		if(ara[j].sc<ara[j].fr){
			mp[0].fr.pb(ara[j].sc);
			mp[ara[j].fr].fr.pb(m);
		}
		else{
			mp[ara[j].fr].fr.pb(ara[j].sc);
		}
	}
	st.insert(0);
	mp[bas].sc.pb(0);
	int ans=0;
	mp[son];
	while(mp.size()){
		vector<int>&ekle=mp.begin()->sc.fr;
		vector<int>&sil=mp.begin()->sc.sc;
		if(mp.begin()->fr==son){
			if(st.size())ans+=*st.begin();
			else ans=1e9;
			break;
		}
		for(int x:ekle){
			if(st.size()){
				int y=*st.begin()+1;
				mp[x].sc.pb(y);
				st.insert(y);
			}
		}
		for(int x:sil){
			st.erase(st.find(x));
		}
		mp.erase(mp.begin());
	}
	cev=min(cev,ans);
	if(cev==1e9)cev=-1;
	cout<<cev<<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...