답안 #109202

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
109202 2019-05-05T13:38:38 Z maruii 운세 보기 2 (JOI14_fortune_telling2) C++14
0 / 100
4 ms 640 KB
#include <bits/stdc++.h>
using namespace std;

const int SIZE = 1<<19;
struct ST{
	int data[2*SIZE];
	void update(int x, int v){
		for(x+=SIZE; x; x>>=1) data[x] = max(data[x], v);
	}
	int query(int s, int e){
		int ret = 0;
		for(s+=SIZE, e+=SIZE; s<=e; s>>=1, e>>=1){
			if( s&1) ret = max(ret, data[s++]);
			if(~e&1) ret = max(ret, data[e--]);
		}
		return ret;
	}
} seg;
struct PST{
	struct Node{
		int l,r;
		bool v;
	} node[20*SIZE];
	int cnt;
	int init(int s, int e){
		int nn = cnt++;
		if(s==e) return nn;
		int m = s+e>>1;
		node[nn].l = init(s, m), node[nn].r = init(m+1, e);
		return nn;
	}
	int update(int bef, int ns, int ne, int x){
		if(ns>x || ne<x) return bef;
		int nn = cnt++;
		auto &cur = node[nn];
		if(ns==ne){
			cur = node[bef];
			cur.v ^= 1;
			return nn;
		}
		int m = ns+ne>>1;
		cur.l = update(node[bef].l, ns, m, x), cur.r = update(node[bef].r, m+1, ne, x);
		cur.v = node[cur.l].v ^ node[cur.r].v;
		return nn;
	}
	bool query(int nn, int ns, int ne, int s, int e){
		if(ns>e || ne<s) return 0;
		auto &cur = node[nn];
		if(s<=ns && ne<=e) return cur.v;
		int m = ns+ne>>1;
		return query(cur.l, ns, m, s, e) ^ query(cur.r, m+1, ne, s, e);
	}
} pst;
int root[200001], A[200001], B[200001], T[200001];
vector<int> xx;
int main(){
	ios_base::sync_with_stdio(0), cin.tie(0);
	int N, K; cin>>N>>K;
	for(int i=0; i<N; ++i) cin>>A[i]>>B[i], xx.push_back(A[i]), xx.push_back(B[i]);
	for(int i=1; i<=K; ++i) cin>>T[i];
	sort(xx.begin(), xx.end()), xx.erase(unique(xx.begin(), xx.end()), xx.end());
	for(int i=0; i<N; ++i){
		A[i] = lower_bound(xx.begin(), xx.end(), A[i]) - xx.begin() + 1;
		B[i] = lower_bound(xx.begin(), xx.end(), B[i]) - xx.begin() + 1;
	}
	root[K+1] = pst.init(0, xx.size());
	for(int i=K; i; --i){
		T[i] = upper_bound(xx.begin(), xx.end(), T[i]) - xx.begin();
		seg.update(T[i], i);
		root[i] = pst.update(root[i+1], 0, xx.size(), T[i]);
	}
	long long ans = 0;
	for(int i=0; i<N; ++i){
		int a=A[i], b=B[i];
		if(a>b) swap(a, b);
		int t = seg.query(a, b-1), s = pst.query(root[t], 0, xx.size(), b, xx.size());
		if(t && s) ans += xx[a-1];
		else if(t) ans += xx[b-1];
		else if(s) ans += xx[B[i]-1];
		else ans += xx[A[i]-1];
	}
	cout<<ans<<'\n';
	return 0;
}

Compilation message

fortune_telling2.cpp: In member function 'int PST::init(int, int)':
fortune_telling2.cpp:28:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = s+e>>1;
           ~^~
fortune_telling2.cpp: In member function 'int PST::update(int, int, int, int)':
fortune_telling2.cpp:41:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns+ne>>1;
           ~~^~~
fortune_telling2.cpp: In member function 'bool PST::query(int, int, int, int, int)':
fortune_telling2.cpp:50:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns+ne>>1;
           ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 512 KB Output is correct
2 Incorrect 3 ms 640 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 512 KB Output is correct
2 Incorrect 3 ms 640 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 512 KB Output is correct
2 Incorrect 3 ms 640 KB Output isn't correct
3 Halted 0 ms 0 KB -