Submission #1367557

#TimeUsernameProblemLanguageResultExecution timeMemory
1367557djsksbrbfPilot (NOI19_pilot)C++20
100 / 100
349 ms63160 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
#define fi first
#define se second
#define pb push_back
const int MOD = 1e9 + 7;
const int MAX = 1e6 + 5;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
#define int ll

int sz[MAX], par[MAX];

int find(int x){
   if(x == par[x])return x;
   return par[x] = find(par[x]);
}

void merge(int x, int y){
   x = find(x);
   y = find(y);
   
   if(x == y)return;
   if(sz[x] > sz[y]){swap(x, y);
   }
   
   par[x] = y;
   sz[y] += sz[x];
}

int calc(int x){
   return x*(x + 1) / 2;
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(0);
   
   int n, q; cin >> n >> q;
   int a[n + 5];
   for(int i = 1 ; i <= n ; i++)cin >> a[i];
   
   vector <int> v;
   for(int i = 1 ; i <= n ; i++)v.pb(i);
   sort(v.begin(), v.end(), [&](int x, int y){
      return a[x] < a[y];
   });
   
   vector <pii> que;
   for(int i = 1 ; i <= q ; i++){
      int x; cin >> x;
      que.pb({x, i});
   }
   
   int ans[q+ 5];
   sort(que.begin(), que.end());
   
   for(int i = 1 ; i <= n ; i++){
      par[i] = i;
      sz[i] = 1;
   }
   
   bool done[n + 5];memset(done, 0, sizeof(done));
   int cur = 0;
   int ptr = 0;
   for(auto [x, y] : que){
      while(ptr < n && a[v[ptr]] <= x){
         cur++;
         done[v[ptr]] = 1;
         if(v[ptr] - 1 >= 1 && done[v[ptr] - 1]){
            cur += calc(sz[find(v[ptr] - 1)] + sz[find(v[ptr])]);
            cur -= calc(sz[find(v[ptr] - 1)]);
            cur -= calc(sz[find(v[ptr])]);
            merge(v[ptr] - 1, v[ptr]);
         }
         if(v[ptr] + 1 <= n && done[v[ptr] + 1]){
            cur += calc((sz[find(v[ptr] + 1)]) + (sz[find(v[ptr])]));
            cur -= calc(sz[find(v[ptr] + 1)]);
            cur -= calc(sz[find(v[ptr])]);
            merge(v[ptr] + 1, v[ptr]);
         }
         ptr++;
      }
      
      ans[y] = cur;
   }
   for(int i = 1 ; i <= q ; i++)cout << ans[i] << '\n';
   
   return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...