답안 #604091

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
604091 2022-07-24T17:45:53 Z Evirir Event Hopping (BOI22_events) C++17
20 / 100
190 ms 20652 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;
		}
		if(s[v]<=e[u] && e[u]<=e[v])
		{
			cout<<1<<'\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 37 ms 17876 KB Output is correct
2 Correct 136 ms 20184 KB Output is correct
3 Correct 146 ms 20248 KB Output is correct
4 Correct 190 ms 20112 KB Output is correct
5 Correct 168 ms 20192 KB Output is correct
6 Correct 143 ms 20260 KB Output is correct
7 Correct 161 ms 20236 KB Output is correct
8 Incorrect 139 ms 20604 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17820 KB Output is correct
2 Correct 35 ms 17844 KB Output is correct
3 Correct 36 ms 17876 KB Output is correct
4 Correct 37 ms 17876 KB Output is correct
5 Correct 36 ms 17876 KB Output is correct
6 Incorrect 39 ms 18064 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17820 KB Output is correct
2 Correct 35 ms 17844 KB Output is correct
3 Correct 36 ms 17876 KB Output is correct
4 Correct 37 ms 17876 KB Output is correct
5 Correct 36 ms 17876 KB Output is correct
6 Incorrect 39 ms 18064 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17820 KB Output is correct
2 Correct 35 ms 17844 KB Output is correct
3 Correct 36 ms 17876 KB Output is correct
4 Correct 37 ms 17876 KB Output is correct
5 Correct 36 ms 17876 KB Output is correct
6 Incorrect 39 ms 18064 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 151 ms 20256 KB Output is correct
2 Correct 145 ms 20224 KB Output is correct
3 Correct 167 ms 20096 KB Output is correct
4 Correct 134 ms 20652 KB Output is correct
5 Correct 149 ms 20552 KB Output is correct
6 Correct 171 ms 20348 KB Output is correct
7 Correct 176 ms 20304 KB Output is correct
8 Correct 164 ms 20472 KB Output is correct
9 Correct 153 ms 19616 KB Output is correct
10 Correct 171 ms 19960 KB Output is correct
11 Correct 148 ms 19736 KB Output is correct
12 Correct 150 ms 19908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 17876 KB Output is correct
2 Correct 136 ms 20184 KB Output is correct
3 Correct 146 ms 20248 KB Output is correct
4 Correct 190 ms 20112 KB Output is correct
5 Correct 168 ms 20192 KB Output is correct
6 Correct 143 ms 20260 KB Output is correct
7 Correct 161 ms 20236 KB Output is correct
8 Incorrect 139 ms 20604 KB Output isn't correct
9 Halted 0 ms 0 KB -