Submission #901341

#TimeUsernameProblemLanguageResultExecution timeMemory
901341pccPilot (NOI19_pilot)C++14
100 / 100
418 ms52836 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> const int mxn = 1e6+10; int dsu[mxn],sz[mxn]; ll ans[mxn],sum; bitset<mxn> active; vector<pii> op; int n,q; int root(int k){ return k == dsu[k]?k:dsu[k] = root(dsu[k]); } void onion(int a,int b){ a = root(a),b = root(b); if(a == b)return; sum -= 1ll*(sz[a]-1)*sz[a]/2; sum -= 1ll*sz[b]*(sz[b]-1)/2; sz[a] += sz[b]; dsu[b] = a; sum += 1ll*sz[a]*(sz[a]-1)/2; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>q; for(int i = 1;i<=n;i++){ int k; cin>>k; op.push_back(make_pair(k,-i)); dsu[i] = i,sz[i] = 1; } for(int i = 1;i<=q;i++){ int k; cin>>k; op.push_back({k,i}); } sort(op.begin(),op.end()); for(auto &i:op){ if(i.sc<0){ i.sc = -i.sc; active[i.sc] = true; sum++; if(active[i.sc-1])onion(i.sc-1,i.sc); if(active[i.sc+1])onion(i.sc,i.sc+1); } else{ ans[i.sc] = sum; } } for(int i = 1;i<=q;i++)cout<<ans[i]<<'\n'; 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...