Submission #1269922

#TimeUsernameProblemLanguageResultExecution timeMemory
1269922herominhstevePilot (NOI19_pilot)C++20
100 / 100
981 ms115848 KiB
#include <bits/stdc++.h>
#define el '\n'
#define FNAME "NAME"
#define allof(x) x.begin(),x.end()
#define allof1(x) x.begin()+1,x.end()
#define mset(x,n) memset(x,(n),sizeof(x))
using namespace std;
const long long MOD = (long long) 1e9+7;
template<class X,class Y> bool minimize(X &a,Y b){ if (a>b) {a=b; return true;} return false;}
template<class X,class Y> bool maximize(X &a,Y b){ if (a<b) {a=b; return true;} return false;}

void setup(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
	if (fopen(FNAME".inp","r")){
		freopen(FNAME".inp","r",stdin);
		freopen(FNAME".out","w",stdout);
	}
}

const int MAXN = 1e6 + 5;

struct DSU{
	int n;
	vector<int> parent,power;
	DSU(int N=0){
		n=N;
		if (n>0){
			parent.resize(n+1,0);
			power.resize(n+1,1);
		}
	}
	void make_set(){
		for (int i=1;i<=n;i++){
			parent[i]=i;
			power[i]=1;
		}
	}
	int find(int u){
		if (u==parent[u]) return u;
		return parent[u]=find(parent[u]);
	}
	bool Union(int u,int v){
		u=find(u);
		v=find(v);
		if (u==v) return false;
		if (power[u]<power[v]) swap(u,v);
		parent[v]=u;
		power[u]+=power[v];
		return true;
	}
	long long getVal(int u){
		u = find(u);
		long long sz = power[u];
		return sz * (sz+1) / 2;
	}
};

int n,q;
vector<int> h,queries;
vector<int> compress;
int maxH;
vector<vector<int>> hByW,qByW;

void init(){
	cin>>n>>q;
	h.resize(n);
	queries.resize(q);
	for (int &x : h) cin>>x,compress.push_back(x);
	for (int &x: queries) cin>>x, compress.push_back(x);
	sort(allof(compress));
	compress.resize(unique(allof(compress))-compress.begin());
	maxH = compress.size();
	hByW.resize(maxH+5);
	qByW.resize(maxH+5);
	for (int i=0;i<n;i++){
		int t = lower_bound(allof(compress),h[i]) - compress.begin() + 1;
		h[i] = t;
		hByW[t].push_back(i+1);
	}
	for (int i=0;i<q;i++){
		int t = lower_bound(allof(compress),queries[i]) - compress.begin() + 1;
		queries[i] = t;
		qByW[t].push_back(i);
	}
}

vector<long long> qRes;

void sol(){
	DSU dsu(n);
	dsu.make_set();
	qRes.resize(q,0);
	long long res=0;
	vector<bool> visited(n+2,0);
	for (int w=0;w<=maxH;w++){
		for (int ID : hByW[w]){
			res++;
			if (ID>1 and visited[ID-1]){
				res -= dsu.getVal(ID-1);
				res -= dsu.getVal(ID);
				dsu.Union(ID-1,ID);
				res += dsu.getVal(ID);
			}
			if (ID<n and visited[ID+1]){
				res -= dsu.getVal(ID+1);
				res -= dsu.getVal(ID);
				dsu.Union(ID,ID+1);
				res += dsu.getVal(ID);
			}
			visited[ID] = 1;
		}
		for (int ID : qByW[w]) qRes[ID] = res;
	}
	for (long long x : qRes) cout<<x<<el;
}

int main(){
    setup();
    init();
    sol();
}

Compilation message (stderr)

pilot.cpp: In function 'void setup()':
pilot.cpp:16:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |                 freopen(FNAME".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
pilot.cpp:17:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |                 freopen(FNAME".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...