답안 #1006219

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1006219 2024-06-23T14:43:13 Z huutuan Pyramid Base (IOI08_pyramid_base) C++14
100 / 100
4419 ms 51284 KB
#include<bits/stdc++.h>

using namespace std;

struct Node{
   int val, lazy;
   Node (int _val=0){
      val=_val, lazy=0;
   }
};

struct SegmentTree{
   vector<Node> t;
   int n, h;
   void init(int _n){
      n=_n;
      h=32-__builtin_clz(n);
      t.assign(2*n+1, Node());
   }
   void apply(int k, int val){
      t[k].val+=val;
      t[k].lazy+=val;
   }
   void build(int k){
      while (k>1) k>>=1, t[k].val=min(t[k<<1].val, t[k<<1|1].val)+t[k].lazy;
   }
   void push(int k){
      for (int s=h; s>0; --s){
         int i=k>>s;
         if (t[i].lazy){
            apply(i<<1, t[i].lazy);
            apply(i<<1|1, t[i].lazy);
            t[i].lazy=0;
         }
      }
   }
   void update(int l, int r, int val){
      --l;
      l+=n; r+=n;
      int l0=l, r0=r;
      for (; l<r; l>>=1, r>>=1){
         if (l&1) apply(l++, val);
         if (r&1) apply(--r, val);
      }
      build(l0);
      build(r0-1);
   }
   int get(int l, int r){
      --l;
      l+=n; r+=n;
      push(l); push(r-1);
      int ans=INT_MAX;
      for (; l<r; l>>=1, r>>=1){
         if (l&1) ans=min(ans, t[l++].val);
         if (r&1) ans=min(ans, t[--r].val);
      }
      return ans;
   }
} st;

struct Rect{
   int x1, y1, x2, y2, z;
   Rect(){ x1=0, y1=0, x2=0, y2=0, z=0; }
};

const int N=5e5+10;
int m, n, p, q;
Rect a[N], b[N];
pair<pair<int, int>, pair<int, int>> events[N*2];

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> p >> q >> m >> n;
   st.init(q);
   int l=1, r=min(p, q);
   for (int i=1; i<=n; ++i){
      cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2 >> a[i].z;
      if (m==0){
         r=min(r, max({a[i].x1-1, a[i].y1-1, p-a[i].x2, q-a[i].y2}));
      }
   }
   while (l<=r){
      int mid=(l+r)>>1;
      int sz=0;
      for (int i=1; i<=n; ++i){
         events[sz++]={{max(1, a[i].x1-mid+1), a[i].z}, {max(1, a[i].y1-mid+1), a[i].y2}};
         events[sz++]={{a[i].x2+1, -a[i].z}, {max(1, a[i].y1-mid+1), a[i].y2}};
      }
      sort(events, events+sz);
      bool check=0;
      for (int i=0; i<sz; ++i){
         st.update(events[i].second.first, events[i].second.second, events[i].first.second);
         if (i==sz-1 || events[i].first.first!=events[i+1].first.first){
            if (events[i].first.first+mid-1<=p){
               check|=st.get(1, q-mid+1)<=m;
            }
         }
      }
      if (check) l=mid+1;
      else r=mid-1;
   }
   cout << r << '\n';
   return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 21084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 21084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 21084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 21180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 22620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 36952 KB Output is correct
2 Correct 13 ms 36700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 36696 KB Output is correct
2 Correct 18 ms 36700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 21340 KB Output is correct
2 Correct 32 ms 21340 KB Output is correct
3 Correct 33 ms 21592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 138 ms 24920 KB Output is correct
2 Correct 150 ms 24920 KB Output is correct
3 Correct 137 ms 24924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 243 ms 39004 KB Output is correct
2 Correct 44 ms 23132 KB Output is correct
3 Correct 112 ms 39000 KB Output is correct
4 Correct 302 ms 39000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 320 ms 39000 KB Output is correct
2 Correct 321 ms 39000 KB Output is correct
3 Correct 281 ms 39004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 384 ms 39000 KB Output is correct
2 Correct 416 ms 39000 KB Output is correct
3 Correct 435 ms 39004 KB Output is correct
4 Correct 414 ms 39004 KB Output is correct
5 Correct 411 ms 39004 KB Output is correct
6 Correct 335 ms 39000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2515 ms 43088 KB Output is correct
2 Correct 1474 ms 29016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3444 ms 47052 KB Output is correct
2 Correct 2951 ms 47184 KB Output is correct
3 Correct 2698 ms 47188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4419 ms 51124 KB Output is correct
2 Correct 3660 ms 51284 KB Output is correct
3 Correct 4077 ms 51148 KB Output is correct
4 Correct 3671 ms 51280 KB Output is correct
5 Correct 4343 ms 51280 KB Output is correct