Submission #331363

#TimeUsernameProblemLanguageResultExecution timeMemory
331363aloo123Pilot (NOI19_pilot)C++17
100 / 100
942 ms113072 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 rall(x) (x).rbegin(), (x).rend() #define sor(x) sort(all(x)) #define rsz resize #define ins insert #define ft front() #define bk back() #define pf push_front #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound // 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 int MX = 2e5+5; // const ll INF = 1e18; // not too close to LLONG_MAX // const ld PI = acos((ld)-1); // mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); // // helper funcs // constexpr int pct(int x) { return __builtin_popcount(x); } // # of bits set // constexpr int bits(int x) { return 31-__builtin_clz(x); } // floor(log2(x)) // ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up // ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down // tcT> bool ckmin(T& a, const T& b) { // return b < a ? a = b, 1 : 0; } // set a = min(a,b) // tcT> bool ckmax(T& a, const T& b) { // return a < b ? a = b, 1 : 0; } // #define tcTU tcT, class U // tcTU> T fstTrue(T lo, T hi, U f) { // hi ++; assert(lo <= hi); // assuming f is increasing // while (lo < hi) { // find first index such that f is true // T mid = lo+(hi-lo)/2; // f(mid) ? hi = mid : lo = mid+1; // } // return lo; // } // tcTU> T lstTrue(T lo, T hi, U f) { // lo --; assert(lo <= hi); // assuming f is decreasing // while (lo < hi) { // find first index such that f is true // T mid = lo+(hi-lo+1)/2; // f(mid) ? lo = mid : hi = mid-1; // } // return lo; // } // tcT> void remDup(vector<T>& v) { // sort and remove duplicates // sort(all(v)); v.erase(unique(all(v)),end(v)); } // tcTU> void erase(T& t, const U& u) { // don't erase // auto it = t.find(u); assert(it != end(t)); // t.erase(u); } // element that doesn't exist from (multi)set // // INPUT // #define tcTUU tcT, class ...U // tcT> void re(complex<T>& c); // tcTU> void re(pair<T,U>& p); // tcT> void re(vector<T>& v); // tcT, size_t SZ> void re(AR<T,SZ>& a); // tcT> void re(T& x) { cin >> x; } // void re(db& d) { str t; re(t); d = stod(t); } // void re(ld& d) { str t; re(t); d = stold(t); } // tcTUU> void re(T& t, U&... u) { re(t); re(u...); } // tcT> void re(complex<T>& c) { T a,b; re(a,b); c = {a,b}; } // tcTU> void re(pair<T,U>& p) { re(p.f,p.s); } // tcT> void re(vector<T>& x) { trav(a,x) re(a); } // tcT, size_t SZ> void re(AR<T,SZ>& x) { trav(a,x) re(a); } // // TO_STRING // #define ts to_string // str ts(char c) { return str(1,c); } // str ts(const char* s) { return (str)s; } // str ts(str s) { return s; } // str ts(bool b) { // #ifdef LOCAL // return b ? "true" : "false"; // #else // return ts((int)b); // #endif // } // tcT> str ts(complex<T> c) { // stringstream ss; ss << c; return ss.str(); } // str ts(vector<bool> v) { // str res = "{"; F0R(i,sz(v)) res += char('0'+v[i]); // res += "}"; return res; } // template<size_t SZ> str ts(bitset<SZ> b) { // str res = ""; F0R(i,SZ) res += char('0'+b[i]); // return res; } // tcTU> str ts(pair<T,U> p); // tcT> str ts(T v) { // containers with begin(), end() // #ifdef LOCAL // bool fst = 1; str res = "{"; // for (const auto& x: v) { // if (!fst) res += ", "; // fst = 0; res += ts(x); // } // res += "}"; return res; // #else // bool fst = 1; str res = ""; // for (const auto& x: v) { // if (!fst) res += " "; // fst = 0; res += ts(x); // } // return res; // #endif // } // tcTU> str ts(pair<T,U> p) { // #ifdef LOCAL // return "("+ts(p.f)+", "+ts(p.s)+")"; // #else // return ts(p.f)+" "+ts(p.s); // #endif // } // // OUTPUT // tcT> void pr(T x) { cout << ts(x); } // tcTUU> void pr(const T& t, const U&... u) { // pr(t); pr(u...); } // void ps() { pr("\n"); } // print w/ spaces // tcTUU> void ps(const T& t, const U&... u) { // pr(t); if (sizeof...(u)) pr(" "); ps(u...); } // // DEBUG // void DBG() { cerr << "]" << endl; } // tcTUU> void DBG(const T& t, const U&... u) { // cerr << ts(t); if (sizeof...(u)) cerr << ", "; // DBG(u...); } // #ifdef LOCAL // compile with -DLOCAL, chk -> fake assert // #define dbg(...) cerr << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__) // #define chk(...) if (!(__VA_ARGS__)) cerr << "Line(" << __LINE__ << ") -> function(" \ // << __FUNCTION__ << ") -> CHK FAILED: (" << #__VA_ARGS__ << ")" << "\n", exit(0); // #else // #define dbg(...) 0 // #define chk(...) 0 // #endif // // FILE I/O // void setIn(str s) { freopen(s.c_str(),"r",stdin); } // void setOut(str s) { freopen(s.c_str(),"w",stdout); } void unsyncIO() { cin.tie(0)->sync_with_stdio(0);cout.tie(0); } // void setIO(str s = "") { // unsyncIO(); // // cin.exceptions(cin.failbit); // // throws exception when do smth illegal // // ex. try to read letter into int // if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } // for USACO // } #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);cout.tie(0); // setIO(); // 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 */

Compilation message (stderr)

pilot.cpp:156:1: warning: multi-line comment [-Wcomment]
  156 | //  #define chk(...) if (!(__VA_ARGS__)) cerr << "Line(" << __LINE__ << ") -> function(" \
      | ^
#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...