Submission #331364

#TimeUsernameProblemLanguageResultExecution timeMemory
331364aloo123Pilot (NOI19_pilot)C++14
100 / 100
927 ms99692 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pl = pair<ll,ll>; using vl = vector<ll>; #define mp make_pair #define f first #define s second // vectors #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) #define ins insert #define pf push_front #define pb push_back // loops #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define F0R(i,a) FOR(i,0,a) #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i) #define R0F(i,a) ROF(i,0,a) #define trav(a,x) for (auto& a: x) const int MOD = 1e9+7; // 998244353; const ll INF = 1e18; // not too close to LLONG_MAX #define int ll const int xd[4] = {1,0,-1,0}, yd[4] = {0,1,0,-1}; // for every grid problem!! const int N = 1e6+5; int h[N],ans[N]; pl y[N]; vl what[N]; int cur = 0; bool is_part[N]; int nc2(int n){ int x=n; x *= (n+1); x>>=1ll; return x; } struct dsu{ int sz[N]; int par[N]; void init_node(int u){ sz[u] = 1; par[u] = u; cur++; is_part[u]=true; } int find_par(int u){ if(u==par[u])return u; return par[u]=find_par(par[u]); } void unite(int u,int v){ u = find_par(u),v= find_par(v); if(u == v)return; if(sz[u]>sz[v])swap(u,v); cur -= nc2(sz[u]); cur -= nc2(sz[v]); sz[v]+=sz[u]; cur += nc2(sz[v]); par[u] =v; sz[u]=0; } }; dsu g; void solve(){ int n,q; cin>>n>>q; FOR(i,1,n+1){ cin>>h[i]; what[h[i]].pb(i); } FOR(i,1,q+1){ cin>>y[i].f; y[i].s = i; } sort(y+1,y+q+1); FOR(i,1,q+1){ int x = y[i].f; FOR(j,y[i-1].f+1,x+1){ if(what[j].empty()) continue; trav(id,what[j]){ g.init_node(id); if(id != n && is_part[id+1]) g.unite(id,id+1); if(id != 1 && is_part[id-1]) g.unite(id-1,id); } } ans[y[i].s] = cur; } FOR(i,1,q+1){ cout<<ans[i]<<"\n"; } } signed main() { cin.tie(0)->sync_with_stdio(0); // you should actually read the stuff at the bottom int t=1; // re(t); while(t--){ solve(); } } /* stuff you should look for * read the probem 3 more times in case of WA :) * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */
#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...