Submission #1277073

#TimeUsernameProblemLanguageResultExecution timeMemory
1277073Bui_Quoc_CuongFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
1064 ms55808 KiB
#include <bits/stdc++.h>
using namespace std;
const int LIM = 2e5 + 5;
const int LG = 30;

int n, q;
int a[LIM], b[LIM], dir[LIM], c[LIM], d[LIM];
int st[LIM * LG], L[LIM * LG], R[LIM * LG], node = 0, vers[LIM];

int up(int old, int l, int r, int pos, int val){
	int cur = ++ node;
	if(l == r){
		st[cur] = st[old] + val;
		return cur;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid){
		R[cur] = R[old];
		L[cur] = up(L[old], l, mid, pos, val);
	} else{
		L[cur] = L[old];
		R[cur] = up(R[old], mid + 1, r, pos, val);
	}
	st[cur] = st[L[cur]] + st[R[cur]];
	return cur;
}

int get(int id, int l, int r, int u, int v){
	if(l > v || r < u) return 0;
	if(l >= u && r <= v) return st[id];
	int mid = (l + r) >> 1;
	return get(L[id], l, mid, u, v) + get(R[id], mid + 1, r, u, v);
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); 
    #define kieuoanh "joi14_fortune_telling2"
    if(fopen(kieuoanh".inp", "r")){
        freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
    }
    cin >> n >> q;
    vector <int> values;
    for(int i = 1; i <= n; i++){
    	cin >> a[i] >> b[i];
    	values.push_back(a[i]);
    	values.push_back(b[i]);
    	c[i] = a[i], d[i] = b[i];
    	if(a[i] > b[i]){
    		swap(a[i], b[i]);
    		dir[i] = 1;
    	}
    }
    vector <int> num_query(q + 2, 0);
    for(int i = 1; i <= q; i++)
    	cin >> num_query[i];
    // tìm query cuối cùng ai <= x < bi
    for(int i = 1; i <= q; i++){
    	values.push_back(num_query[i]);
    }

   	sort(values.begin(), values.end());
   	values.resize(unique(values.begin(), values.end()) - values.begin());

   	for(int i = 1; i <= n; i++){
   		a[i] = upper_bound(values.begin(), values.end(), a[i]) - values.begin();
   		b[i] = upper_bound(values.begin(), values.end(), b[i]) - values.begin();
   	}
   	for(int i = 1; i <= q; i++){
   		num_query[i] = upper_bound(values.begin(), values.end(), num_query[i]) - values.begin();
   	}	
   	int lim = values.size();

   	for(int i = q; i >= 0; i--){
   		vers[i] = vers[i + 1];
   		vers[i] = up(vers[i], 1, lim, num_query[i], 1);
   	}

   	long long ans = 0;

   	for(int i = 1; i <= n; i++){
   		int l = 0, r = q, pos = 0;
   		while(l <= r){
   			int mid = (l + r) >> 1;
   			if(get(vers[mid], 1, lim, a[i], b[i] - 1)) pos = mid, l = mid + 1;
   			else r = mid - 1;
   		}

   		int cnt = (pos != 0) + get(vers[pos], 1, lim, b[i], lim);

   		if(pos == 0 && dir[i] == 1) dir[i] ^= 1;

   		if((cnt + dir[i]) & 1){
   			ans+= d[i];
   		}
   		else{
   			ans+= c[i];
   		}
   	}

   	cout << ans;

    return 0;
}

Compilation message (stderr)

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:39:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |         freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:39:53: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |         freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
      |                                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...