제출 #1262365

#제출 시각아이디문제언어결과실행 시간메모리
1262365PlayVoltzMountains (NOI20_mountains)C++20
100 / 100
658 ms110716 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

vector<vector<int> > segmenttree;
vector <int> vect;

vector<int> mergesort(vector<int> a, vector<int> b){
	int p1 = 0, p2 = 0;
	vector <int> temp;
	while (p1!=a.size() || p2!=b.size()){
		if (p1==a.size()){
			temp.push_back(b[p2]);
			++p2;
		}
		else if (p2==b.size()){
			temp.push_back(a[p1]);
			++p1;
		}
		else if (a[p1]>b[p2]){
			temp.push_back(b[p2]);
			++p2;
		}
		else{
			temp.push_back(a[p1]);
			++p1;
		}
	}
	return temp;
}

void build(int index, int left, int right){
	if (left==right){
		segmenttree[index] = vector<int>(1, vect[left]);
		return;
	}
	int mid = (left+right)/2;
	build(2*index+1, left, mid);
	build(2*index+2, mid+1, right);
	segmenttree[index] = mergesort(segmenttree[2*index+1], segmenttree[2*index+2]);
}

int query(int index, int left, int right, int l, int r, int val){
	if (l>r){
		return 0;
	}
	if (left==l && right==r){
		return lower_bound(segmenttree[index].begin(), segmenttree[index].end(), val)-segmenttree[index].begin();
	}
	int mid = (left+right)/2;
	return query(2*index+1, left, mid, l, min(mid, r), val)+query(2*index+2, mid+1, right, max(mid+1, l), r, val);
}
	
int32_t main(){
	int n;
	cin>>n;
	segmenttree.resize(4*n);
	vect.resize(n);
	for (int i=0; i<n; ++i){
		cin>>vect[i];
	}
	build (0, 0, n-1);
	int sum = 0;
	for (int i=1; i<n-1; ++i){
		int l = query(0, 0, n-1, 0, i-1, vect[i]), r = query(0, 0, n-1, i+1, n-1, vect[i]);
		sum+=l*r;
	}
	cout<<sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...