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...