제출 #1329126

#제출 시각아이디문제언어결과실행 시간메모리
1329126michael12Pilot (NOI19_pilot)C++20
89 / 100
1098 ms93580 KiB
#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define int long long
using namespace std;
const int maxn = 5e5 + 5;
const int oo = 1e18;
const int inf = 1e18;
// struct ST{
//     int n;
//     vector<int> tree;
//     ST(int sz){
//         n = sz;
//         tree.resize(4 * n);
//     }
//     void build(int node, int start, int end, vector<int>& T){
//         if(start == end){
//            tree[node] = T[start];
//         }
//         else{
//             int mid = (start + end) / 2;
//             build(2 * node, start, mid, T);
//             build(2 * node + 1, mid + 1, end, T);
//             tree[node] = max(tree[2 * node], tree[2 * node + 1]);
//         }
//     }
//     int query(int node, int start, int end, int l, int r){
//         if(start > r || end < l) return -inf;
//         if(start >= l && end <= r) return tree[node];
//         int mid = (start + end) / 2;
//         int l1 = query(2 * node, start, mid, l, r);
//         int r1 = query(2 * node + 1, mid + 1, end, l, r);
//         return max(l1, r1);
//     }
//     int get(int node, int start, int end, int id){
//         if(start == end){
//             return tree[id];
//         }
//         else{
//             int mid = (start + end) / 2;
//             if(mid >= id){
//                 return get(2 * node, start, mid, id);
//             }
//             else{
//                 return get(2 * node + 1, mid + 1, end, id);
//             }
//         }
//     }
// };
struct DSU{
    int n;
    vector<int> p;
    vector<int> sz;
    vector<int> mx;
    DSU(int size){
        n = size;
        p.resize(n);
        sz.resize(n);
        mx.resize(n);
        for(int i = 0; i < n; i++){
            p[i] = i;
            sz[i] = 1;
            mx[i] = i;
        }
    }
    int find(int u){
        if(u == p[u]) return u;
        return p[u] = find(p[u]);
    }
    void unite(int u, int v){
        int a = find(u);
        int b = find(v);
        if(a != b){
            if(sz[a] < sz[b]) swap(a, b);
            mx[a] = max(mx[a], mx[b]);
            p[b] = a;
            sz[a] += sz[b];
        }
    }
    int fi(int u){
        int v = find(u);
        int a = sz[v];
        return (a * (a - 1)) / 2;
    }

};
signed main(){
   int n, m;
   cin >> n >> m;
   vector<int> a(n);
   vector<pair<int, int>> q(m);
   for(int i = 0; i < n; i++){
    cin >> a[i];
   }  
   for(int i = 0; i < m; i++){
    cin >> q[i].ff;
    q[i].ss = i;
   }
   vector<int> B = a;
   sort(B.begin(), B.end());
   sort(q.begin(), q.end());
   vector<pair<int, int>> d;
   for(int i = 0; i < n - 1; i++){
    d.push_back({max(a[i], a[i + 1]), i});
   }
   DSU dsu(n);
   int cur = 0;
   int idx = 0;
   sort(d.begin(), d.end());
   vector<int> pref(n);
   vector<int> ans(m);
   for(int i = 0; i < m; i++){
      int nm = upper_bound(B.begin(), B.end(), q[i].ff) - B.begin();
      ans[q[i].ss] = nm;
   }
   // for(int i = 0; i < m; i++){
   //  cout << ans[i] << " ";
   // }
   vector<int> t(m);
   for(int i = 0; i < m; i++){
      while(idx < n - 1 && d[idx].ff <= q[i].ff){
            int id = d[idx].ss; 
            cur -= dsu.fi(id);
            cur -= dsu.fi(id + 1);
            dsu.unite(id, id + 1);
            cur += dsu.fi(id);
            idx += 1;
      }
      t[q[i].ss] = cur;
   }
   for(int i = 0; i < m; i++){
    cout << t[i] + ans[i] << endl;
   }
   // for(auto t : d){
   //  cout << t.ff << " " << t.ss;
   //  cout << endl;
   // }
   
   

   

    
}
#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...