답안 #1062811

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1062811 2024-08-17T10:58:25 Z YassirSalama 벽 (IOI14_wall) C++17
32 / 100
3000 ms 21844 KB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 100;
template<typename T>
void dbg(const T& t){
  cout<<t<<endl;
  return;
}
template<typename T,typename... Args>
void dbg(const T& t,const Args&... args){
  cout<<t<<" , ";
  dbg(args...);
}
#define dbg(...) cout<<"("<<#__VA_ARGS__<<") : "<<endl;dbg(__VA_ARGS__);

struct Node
{
  int min;
  int max;
  int smin;
  int smax;
  int cntmin;
  int cntmax;
  int lzmin=-1,lzmax=-1;
  bool lazy=false;
  Node* left,*right;
  Node() : left(nullptr),right(nullptr){}
};
void pull(Node* node){
  //for min
  node->min=min(node->left->min,node->right->min);
  if(node->min==node->left->min){
    if(node->min==node->right->min){
      node->cntmin=node->left->cntmin+node->right->cntmin;
      node->smin=min(node->left->smin,node->right->min);
    }else {
      node->smin=min({node->left->smin,node->right->min});
      node->cntmin=node->left->cntmin;
    }
  }else{
    node->smin=min({node->right->smin,node->left->min});
    node->cntmin=node->right->cntmin;
  }
  
  //for max
  node->max=max(node->left->max,node->right->max);
  if(node->max==node->left->max){
    if(node->max==node->right->max){
      node->cntmax=node->left->cntmax+node->right->cntmax;
      node->smax=max(node->left->smax,node->right->max);
    }else {
      node->smax=max({node->left->smax,node->right->max});
      node->cntmax=node->left->cntmax;
    }
  }else{
    node->smax=max({node->right->smax,node->left->max});
    node->cntmax=node->right->cntmax;
  }
  
  
  
  
}
void build(Node* node,int l,int r){
  if(l==r){
    node->min=node->max=0;
    node->cntmin=node->cntmax=1;
    node->smin=1e9;
    node->smax=-1e9;
    return;
  }
  int mid=(l+r)/2;
  node->left=new Node();
  node->right=new Node();
  build(node->left,l,mid);
  build(node->right,mid+1,r);
  pull(node);
}
void pmin(Node* node,int l,int r){
  if(node->smax<=node->lzmin&&node->lzmin<node->max){
    node->max=node->lzmin;
    node->min=min(node->min,node->lzmin);
    if(l==r) return;
    node->left->lazy=1;
    node->right->lazy=1;
    node->left->lzmin=node->lzmin;
    node->right->lzmin=node->lzmin;
  }
  return;
}
void pmax(Node* node,int l,int r){
  if(node->smin>=node->lzmax&&node->lzmax>node->min){
    node->min=node->lzmax;
    node->max=max(node->max,node->lzmax);
    if(l==r) return;
    node->left->lazy=1;
    node->right->lazy=1;
    node->left->lzmax=node->lzmax;
    node->right->lzmax=node->lzmax;
  }
  return;
}
void push(Node* node,int l,int r){
  if(node->lazy==false) return;
  if(node->lzmin!=-1){
    pmin(node,l,r);
  }
  if(node->lzmax!=-1){
    pmax(node,l,r);
  }
  node->lazy=false;
  node->lzmin=node->lzmax=-1;
  
}
void p(Node* node,int l,int r){
  push(node,l,r);
  if(l==r) return;
  push(node->left,l,(l+r)/2);
  push(node->right,(l+r)/2+1,r);
  pull(node);
}
void setmin(Node* node,int l,int r,int ql,int qr,int x){
  p(node,l,r);
  if(l>qr||r<ql) return;
  if(node->max<=x) return;
  if(ql<=l&&r<=qr&&node->smax<=x&&x<node->max){
    //put tag
    node->lazy=1;
    node->lzmin=x;
    p(node,l,r);
    return;
  }
  int mid=(l+r)/2;
  setmin(node->left,l,mid,ql,qr,x);
  setmin(node->right,mid+1,r,ql,qr,x);
  p(node,l,r);
}
void setmax(Node* node,int l,int r,int ql,int qr,int x){
  p(node,l,r);
  if(l>qr||r<ql) return;
  if(node->min>=x) return;
  if(ql<=l&&r<=qr&&node->smin>=x&&x>node->min){
    //put tag
    node->lazy=1;
    node->lzmax=x;
    p(node,l,r);
    return;
  }
  int mid=(l+r)/2;
  setmax(node->left,l,mid,ql,qr,x);
  setmax(node->right,mid+1,r,ql,qr,x);
  p(node,l,r);  
}
int query(Node* node,int l,int r,int ql){
  push(node,l,r);
  if(l==r) return node->min;
  int mid = (l+r)/2;
  if(ql<=mid) return query(node->left,l,mid,ql);
  else return query(node->right,mid+1,r,ql);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int ans[])
{
  Node* root=new Node();
  build(root,0,n-1);
  for(int i=0;i<k;i++){
    int t=op[i];
    int l=left[i];
    int r=right[i];
    int x=height[i];
    if(t==1){
      setmax(root,0,n-1,l,r,x);
    }else{
      setmin(root,0,n-1,l,r,x);
    }
  }
  for(int i=0;i<n;i++){
    ans[i]=query(root,0,n-1,i);
  }
  return;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 3 ms 348 KB Output is correct
4 Correct 188 ms 1776 KB Output is correct
5 Correct 347 ms 1624 KB Output is correct
6 Correct 342 ms 1872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 82 ms 8160 KB Output is correct
3 Correct 67 ms 5968 KB Output is correct
4 Correct 180 ms 21332 KB Output is correct
5 Correct 151 ms 21844 KB Output is correct
6 Correct 184 ms 21844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 4 ms 348 KB Output is correct
4 Correct 184 ms 1780 KB Output is correct
5 Correct 334 ms 1628 KB Output is correct
6 Correct 334 ms 1792 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 86 ms 8020 KB Output is correct
9 Correct 58 ms 6008 KB Output is correct
10 Correct 173 ms 21332 KB Output is correct
11 Correct 144 ms 21840 KB Output is correct
12 Correct 184 ms 21840 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 84 ms 8096 KB Output is correct
15 Correct 2012 ms 3072 KB Output is correct
16 Execution timed out 3030 ms 20560 KB Time limit exceeded
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 4 ms 496 KB Output is correct
4 Correct 198 ms 1796 KB Output is correct
5 Correct 349 ms 1628 KB Output is correct
6 Correct 337 ms 1800 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 78 ms 8188 KB Output is correct
9 Correct 60 ms 5972 KB Output is correct
10 Correct 178 ms 21360 KB Output is correct
11 Correct 169 ms 21840 KB Output is correct
12 Correct 177 ms 21844 KB Output is correct
13 Correct 0 ms 344 KB Output is correct
14 Correct 100 ms 8124 KB Output is correct
15 Correct 1938 ms 3156 KB Output is correct
16 Execution timed out 3016 ms 20560 KB Time limit exceeded
17 Halted 0 ms 0 KB -