제출 #1353371

#제출 시각아이디문제언어결과실행 시간메모리
1353371ByeWorld운세 보기 2 (JOI14_fortune_telling2)C++20
100 / 100
672 ms118464 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
#define int long long
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 6e5+10;
const int MAXA = 5e4+10;
const int SQRT = 300;
const ll INF = 2e18;
const int MOD = 1e9+7;
const int LOG = 20;
ll sum(auto a, auto b){ 
	ll te = a+MOD+b; 
	for(; te >= MOD; ) te -= MOD;
	return te;
}
void chsum(auto &a, auto b){ a = sum(a,b); }
ll mul(auto a, auto b){ return 1ll*a*b%MOD; }
void chmul(auto &a, auto b){ a = mul(a,b); }
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }

ll expo(int a, int b){
	if(b==0) return 1;
	ll te = expo(a, b/2); te = mul(te,te); // temporary -> te
	return (b%2 ? mul(te, a) : te);
}
vector <int> dx = {0, 0, -1, 1};
vector<int> dy = {-1, 1, 0, 0};

int n, k, a[MAXN], b[MAXN], p[MAXN], mx[MAXN];
int MN[MAXN], MX[MAXN], ans[MAXN], num[MAXN];

struct seg {
	int st[MAXN];
	int que(int x){
		int te = 0;
		for(;x;x-=x&-x) te += st[x];
		return te;
	}
	void upd(int x,int y){
		for(;x<=MAXN-10;x+=x&-x) st[x] += y;
	}
} A;

vector<array<int,3>> vec[MAXN];
vector<pii> en[MAXN];

signed main(){ 
	// ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>k;
	vector<int> cc; cc.pb(0);
	for(int i=1; i<=n; i++){
		cin>>a[i]>>b[i];
		cc.pb(a[i]); cc.pb(b[i]);
	}
	for(int i=1; i<=k; i++){
		cin>>p[i];
		cc.pb(p[i]);
	}
	sort(cc.begin(), cc.end());
	cc.resize(unique(cc.begin(), cc.end())-cc.begin());

	for(int i=1; i<=n; i++){
		a[i] = lower_bound(cc.begin(), cc.end(), a[i])-cc.begin();
		b[i] = lower_bound(cc.begin(), cc.end(), b[i])-cc.begin();
		MN[i] = min(a[i],b[i]), MX[i] = max(a[i],b[i]);
		// cout << MN[i] <<' '<<MX[i] << " mx\n";
	}
	
	for(int i=k; i>=1; i--){
		p[i] = lower_bound(cc.begin(), cc.end(), p[i])-cc.begin();

		// cout << p[i] << " pp\n";
	}

	for(int i=1; i<=n; i++){
		vec[(1+k)/2].pb({1, k, i});
	}

	bool done = 0;
	while(!done){
		done = 1;
		for(int i=k; i>=1; i--){
			A.upd(p[i], 1);
			// cout << p[i] << " p udah\n";
			// cout << i << ' ' << vec[i].size() << " i do\n";

			for(auto [l,r,idx] : vec[i]){
				// cout << A.que(MX[idx]-1) <<' ' << A.que(MN[idx]-1) << " pp\n";
				if(A.que(MX[idx]-1)-A.que(MN[idx]-1) > 0){
					l = i+1; ans[idx] = i;
				} else {
					r = i-1;
				}
				if(l <= r){
					done = 0;
					// cout << (l+r)/2 << ' '<< l << ' '<< r << " id\n";
					vec[(l+r)/2].pb({l,r,idx});
				} 
			}
			vec[i].clear();
		}
		// cout << " pp\n";
		for(int i=k; i>=1; i--)
			A.upd(p[i], -1);
		// cout << " ams\n";
	}
	// cout << "Dd\n";

	int ANS = 0;
	for(int i=1; i<=n; i++){
		// a[i]  --  b[i]-1
		int idx = ans[i];
		en[idx+1].pb({MX[i], i});
		// for(int j=k; j>=1; j--){
		// 	if(min(a[i],b[i]) <= p[j] && p[j] <= max(a[i],b[i])-1){
		// 		idx = j; break;
		// 	}
		// }
		// cnt itu idx yg bkln jadiin b

		// int num = 0;
		// for(int j=idx+1; j<=k; j++){
		// 	if(p[j] >= MX){
		// 		num++;
		// 	}
		// }
		// // cout << idx << ' '<< num << " cnt2\n";
		// if(idx==0){
		// 	if(num%2==1){
		// 		ans += b[i];
		// 		//cerr << i << ' '<< b[i] << " bi\n";
		// 	} else {
		// 		ans += a[i];
		// 		//cerr << i << ' '<< a[i] << " ai\n";
		// 	}
		// } else {
		// 	if(num%2==1){
		// 		ans += MN;
		// 		//cerr << i << ' '<< MN << " mn\n";
		// 	} else {
		// 		ans += MX;
		// 		//cerr << i << ' '<< MX << " mx\n";
		// 	}
		// }
	}

	for(int i=k; i>=1; i--){
		A.upd(p[i], 1);

		for(auto [m, id] : en[i]){
			num[id] = A.que(cc.size()-1)-A.que(m-1);
		}
	}

	int AN = 0;
	for(int i=1; i<=n; i++){
		// cout << ans[i] << ' '<< num[i] << " num\n";
		if(ans[i] == 0){
			if(num[i]%2==1) AN += cc[b[i]];
			else AN += cc[a[i]];
		} else {
			if(num[i]%2==1) AN += cc[MN[i]];
			else AN += cc[MX[i]];
		}
	}
	cout << AN << '\n';
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...