제출 #1254687

#제출 시각아이디문제언어결과실행 시간메모리
1254687mngoc._.Pilot (NOI19_pilot)C++20
100 / 100
993 ms86620 KiB
#include<bits/stdc++.h>
#define int long long
#define pii pair<int , int>
using namespace std;
const int N = 1e6 + 1;
pii h[N];
vector<int> adj[N];
vector<pii> queries;
int n , q;
bool check[N];
long long ans[N];
long long res = 0;

struct DSU{
	long long sz[N];
	int par[N];
	
	void init(void){
	    for(int i = 1 ; i <= n ; i++){
	    	sz[i] = 1;
		    par[i] = i;
    	}
	}
	
	int find(int u){
		if(u == par[u]) return u;
	    return par[u] = find(par[u]);
	}
	
	void joinset(int u , int v){
		u = find(u);
		v = find(v);
		if(u == v) return;
		if(sz[u] < sz[v]) swap(u , v);
	    res -= ((sz[u] + 1) * sz[u] / 2 + (sz[v] + 1) * (sz[v]) / 2);
		sz[u] += sz[v];
		par[v] = u;
		res += (sz[u] + 1) * sz[u] / 2;
	}

	
} dsu;



void solve(void){
	cin >> n >> q;
	for(int i = 1;  i <= n ; i++){
	    cin >> h[i].first;
	    h[i].second = i;
	}
	for(int i = 1 ; i <= q ; i++){
		int w; cin >> w;
		queries.push_back(make_pair(w, i));
	}
	sort(h + 1 , h + n + 1);
	sort(queries.begin() , queries.end());
	dsu.init();
	for(int i = 1 ; i <= n ; i++) check[i] = false;
	int kquynh = 1;
	for(int i = 0 ; i <= q - 1; i++){
	    while(kquynh <= n && h[kquynh].first <= queries[i].first){
	    	int u = h[kquynh].second;
	    	if (!check[u]) {
                check[u] = true;
                res += 1;
            }
			if (u > 1 && check[u-1]) dsu.joinset(u, u-1);
            if (u < n && check[u+1]) dsu.joinset(u, u+1);
			kquynh++;
		}
		ans[queries[i].second] = res;
	}
	for(int i = 1 ; i <= q ; i++) cout << ans[i] << endl;
	
	
	
	
}



signed main(void){
	ios_base :: sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	solve();
	return 0;
}
#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...