답안 #604090

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
604090 2022-07-24T17:44:49 Z Evirir Event Hopping (BOI22_events) C++17
0 / 100
191 ms 20172 KB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
//using namespace __gnu_pbds;

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define watch(x) cout<<(#x)<<"="<<(x)<<'\n'
#define mset(d,val) memset(d,val,sizeof(d))
#define cbug if(DEBUG) cout
#define setp(x) cout<<fixed<<setprecision(x)
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)
#define forn(i,a,b) for(int i=(a);i<(b);i++)
#define fore(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define F first
#define S second
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
//template<typename T>
//using pbds = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void SD(int t=0){ cout<<"PASSED "<<t<<endl; }
ostream& operator<<(ostream &out, ii x){ out<<"("<<x.F<<","<<x.S<<")"; return out; }
template<typename T> void amax(T &a, T b){ a=max(a,b); }
template<typename T> void amin(T &a, T b){ a=min(a,b); }
const ll INF = ll(1e18);
const int MOD = 998244353;

class PointSegmentTree{
private:
	int size_;
	vector<ii> v;
	void update(int p, ii val, int k, int l, int r)
	{
		if(p < l || r < p) return;
		if(l == r){
			v[k]=val;	//modification
			return;
		}
		int mid = (l+r)>>1;
		update(p, val, k*2, l, mid);
		update(p, val, k*2+1, mid+1, r);
		v[k] = merge(v[k*2], v[k*2+1]);
	}
	ii query(int s, int e, int k, int l, int r)
	{
		if(e < l || r < s) return {-1,-1}; //dummy value
		if(s <= l && r <= e) return v[k];
		int mid = (l+r)>>1;
		ii lc = query(s, e, k*2, l, mid);
		ii rc = query(s, e, k*2+1, mid+1, r);
		return merge(lc, rc);
	}
	
public:
	PointSegmentTree(): v(vector<ii>()) {}
	PointSegmentTree(int n){
		for(size_=1;size_<n;) size_<<=1;
		v.resize(size_*4,{-1,-1});
	}
	//void reset(){}
	inline ii merge(ii x, ii y){
		return max(x,y);
	}
	inline void update(int p, ii val){
		update(p, val, 1, 0, size_-1);
	}
	inline ii query(int l, int r){
		return query(l, r, 1, 0, size_-1);
	}
};

const bool DEBUG = 0;
const int MAXN = 100005;
const int MAXA = MAXN * 2;
const int LG = 20;

int n,Q;
int s[MAXN], e[MAXN];  //reversed
ii mx[MAXA];
int nxt[MAXN][LG];
PointSegmentTree st;

vi comp;
int getid(int x){ return sz(comp) - 1 - (lower_bound(all(comp), x) - comp.begin()); }

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	mset(nxt,-1);

	cin>>n>>Q;
	forn(i,0,n)
	{
		cin>>e[i]>>s[i];
		comp.pb(s[i]);
		comp.pb(e[i]);
	}

	// compress everything in reverse
	sort(all(comp));
	forn(i,0,n)
	{
		s[i]=getid(s[i]);
		e[i]=getid(e[i]);
	}
	
	// compute first next
	forn(i,0,MAXA) mx[i]={-1,-1};
	forn(i,0,n) amax(mx[s[i]], {e[i], i});

	st=PointSegmentTree(MAXA);
	forn(i,0,MAXA) st.update(i, mx[i]);
	forn(i,0,n)
	{
		nxt[i][0] = st.query(s[i], e[i]).S;
	}

	// binary lifting
	forn(j,1,LG) forn(i,0,n) if(nxt[i][j-1]!=-1) nxt[i][j] = nxt[nxt[i][j-1]][j-1];

	forn(z,0,Q)
	{
		int u,v; cin>>v>>u; u--; v--;
		if(u==v)
		{
			cout<<0<<'\n';
			continue;
		}
		if(e[v]<e[u])
		{
			cout<<"impossible\n";
			continue;
		}

		int ans=2;
		for(int j=LG-1;j>=0;j--)
		{
			// cout<<"u="<<u<<" j="<<j<<" nxt="<<nxt[u][j]<<'\n';
			if(nxt[u][j]!=-1 && e[nxt[u][j]]<s[v])
			{
				u=nxt[u][j];
				ans+=(1<<j);
				// cout<<"ans="<<ans<<'\n';
			}
		}
		u=nxt[u][0];
		assert(u!=-1);
		
		if(e[u]>=s[v]) cout<<ans<<'\n';
		else cout<<"impossible\n";
	}
	
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 17876 KB Output is correct
2 Correct 145 ms 20128 KB Output is correct
3 Correct 149 ms 20108 KB Output is correct
4 Incorrect 191 ms 20128 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17912 KB Output is correct
2 Correct 36 ms 17896 KB Output is correct
3 Correct 41 ms 17876 KB Output is correct
4 Incorrect 37 ms 17876 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17912 KB Output is correct
2 Correct 36 ms 17896 KB Output is correct
3 Correct 41 ms 17876 KB Output is correct
4 Incorrect 37 ms 17876 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17912 KB Output is correct
2 Correct 36 ms 17896 KB Output is correct
3 Correct 41 ms 17876 KB Output is correct
4 Incorrect 37 ms 17876 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 152 ms 20172 KB Output is correct
2 Correct 175 ms 20124 KB Output is correct
3 Incorrect 180 ms 20128 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 17876 KB Output is correct
2 Correct 145 ms 20128 KB Output is correct
3 Correct 149 ms 20108 KB Output is correct
4 Incorrect 191 ms 20128 KB Output isn't correct
5 Halted 0 ms 0 KB -