Submission #259050

#TimeUsernameProblemLanguageResultExecution timeMemory
259050Namnamseo허수아비 (JOI14_scarecrows)C++17
100 / 100
452 ms10988 KiB
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#define pb push_back
#define all(v) v.begin(), v.end()
#define sz(v) ((int)v.size())

using namespace std;
typedef pair<int,int> pp;
typedef long long ll;
void read(int& x){ scanf("%d",&x); }
template<typename T,typename... Args>
void read(T&a,Args&...b){ read(a); read(b...); }

int y[200010];
pp dt[200010];
int n;

const int M=262144;

int tree[M*2];

void upd(int pos,int val){
	pos+=M;
	while(pos){
		tree[pos] += val;
		pos >>= 1;
	}
}

int rangeSum(int a,int b){
	int ret=0;
	a+=M; b+=M;
	while(a<=b){
		if(a%2==1) ret+=tree[a++];
		if(b%2==0) ret+=tree[b--];
		a/=2; b/=2;
	}
	return ret;
}

ll work(vector<int>& v){
	if(sz(v) <= 1) return 0;
	int n=sz(v);
	int minv = *min_element(all(v));
	int maxv = *max_element(all(v));
	int mid=(minv+maxv)/2;

	ll ans=0;
	vector<int> v1, v2;
	stack<int> s, ss;

	for(int i=0; i<n; ++i){
		if(v[i] <= mid){
			v1.pb(v[i]);
			while(sz(s) && v[s.top()] < v[i]){
				upd(s.top(), -1);
				s.pop();
			}
			s.push(i);
			upd(i, 1);
		} else {
			v2.pb(v[i]);
			while(sz(ss) && v[ss.top()] > v[i]){
				ss.pop();
			}
			ans += rangeSum((sz(ss))?(ss.top()+1):0, i-1);
			ss.push(i);
		}
	}
	while(s.size()){
		upd(s.top(), -1); s.pop();
	}
	ans += work(v1) + work(v2);
	return ans;
}

int main(){
	read(n);
	vector<int> ys;
	for(int i=1; i<=n; ++i){
		read(dt[i].first, dt[i].second);
		ys.push_back(dt[i].second);
	}
	sort(dt+1, dt+n+1);
	sort(all(ys));
	vector<int> v;
	for(int i=1; i<=n; ++i){
		v.pb(lower_bound(all(ys), dt[i].second)-ys.begin());
	}
	printf("%lld\n", work(v));
	return 0;
}

Compilation message (stderr)

scarecrows.cpp: In function 'void read(int&)':
scarecrows.cpp:13:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 void read(int& x){ scanf("%d",&x); }
                    ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...