제출 #674739

#제출 시각아이디문제언어결과실행 시간메모리
674739QwertyPiPilot (NOI19_pilot)C++14
100 / 100
551 ms83224 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second

const int MAXN = 1e6 + 11;

using namespace std;

int rans = 0;
struct DSU{
	int dsu[MAXN], sz[MAXN];
	void __init(int n){
		for(int i = 0; i <= n; i++){
			dsu[i] = i, sz[i] = 1;
		}
	}
	int f(int x){
		return x == dsu[x] ? x : dsu[x] = f(dsu[x]);
	}
	int s(int x){
		return sz[f(x)];
	}
	void g(int x, int y){
		x = f(x), y = f(y);
		if(x != y){
			rans += sz[x] * sz[y];
			dsu[x] = y; sz[y] += sz[x];
		}
	}
} dsu;

int h[MAXN], ans[MAXN];

int32_t main(){
	cin.tie(0); cout.tie(0)->sync_with_stdio(false);
	int n, q; cin >> n >> q;
	for(int i = 0; i < n; i++){
		cin >> h[i];
	}
	dsu.__init(n);
	vector<pair<int, int>> Q, pos;
	for(int i = 0; i < q; i++){
		int y; cin >> y; Q.push_back({y, i});
	}
	sort(Q.begin(), Q.end());
	for(int i = 0; i < n; i++){
		pos.push_back({h[i], i});
	}
	sort(pos.begin(), pos.end()); int pid = 0;
	for(auto i : Q){
		while(pid < n && pos[pid].fi <= i.fi) dsu.g(pos[pid].se, pos[pid].se + 1), pid++;
		ans[i.se] = rans;
	}
	for(int i = 0; i < q; i++){
		cout << ans[i] << '\n';
	}
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...