제출 #1269926

#제출 시각아이디문제언어결과실행 시간메모리
1269926herominhstevePilot (NOI19_pilot)C++20
100 / 100
363 ms38972 KiB
#include <bits/stdc++.h> #define el '\n' #define FNAME "NOI19_pilot" #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); } } 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]); } long long getVal(int u){ u = find(u); return 1ll * power[u] * (power[u] + 1) / 2; } bool Union(int u,int v,long long &res){ u=find(u); v=find(v); if (u==v) return false; if (power[u]<power[v]) swap(u,v); res -= getVal(v); res -= getVal(u); parent[v]=u; power[u]+=power[v]; res += getVal(u); return true; } }; struct Peak{ int height,ID; Peak(int H,int id): height(H),ID(id) {} bool operator < (const Peak &other) const{ return height < other.height; } }; int n,q; vector<Peak> sortH; vector<Peak> querries; void init(){ cin>>n>>q; for (int i=0;i<n;i++){ int x; cin>>x; sortH.emplace_back(x,i+1); } sort(allof(sortH)); for (int i=0;i<q;i++){ int x; cin>>x; querries.emplace_back(x,i); } sort(allof(querries)); } void sol(){ DSU dsu(n); dsu.make_set(); vector<long long> resQ(q,0); vector<bool> reachable(n+1,0); int ptr=0; long long curRes=0; for (Peak qr : querries){ int maxH = qr.height; int ID = qr.ID; while (ptr<n and sortH[ptr].height<=maxH){ int pos = sortH[ptr].ID; curRes++; reachable[pos] = 1; if (pos>1 and reachable[pos-1]) dsu.Union(pos,pos-1,curRes); if (pos<n and reachable[pos+1]) dsu.Union(pos,pos+1,curRes); ptr++; } resQ[ID] = curRes; } for (long long x : resQ) cout<<x<<el; } int main(){ setup(); init(); sol(); }

컴파일 시 표준 에러 (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...