제출 #913991

#제출 시각아이디문제언어결과실행 시간메모리
913991mychecksedadAdvertisement 2 (JOI23_ho_t2)C++17
100 / 100
329 ms36968 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;


int n, T[N*2][2], ans;
array<int, 3> A[N], B[N];
vector<bool> re;
void build(int l, int r, int k){
  if(l == r){
    T[k][0] = A[l][1] - A[l][0];
    T[k][1] = A[l][1] + A[l][0];
    return;
  }
  int m = l+r>>1;
  build(l, m, k<<1);
  build(m+1, r, k<<1|1);
  T[k][0] = min(T[k<<1][0], T[k<<1|1][0]);
  T[k][1] = min(T[k<<1][1], T[k<<1|1][1]);
}

void rem1(int l, int r, int p, int k, int val){
  if(l > p || T[k][0] > val) return;
  if(l == r){
    if(T[k][0] <= val){
      re[l] = 1;
      T[k][0] = INT_MAX;
      T[k][1] = INT_MAX;
    }
    return;
  }
  int m = l+r>>1;
  rem1(l, m, p, k<<1, val);
  rem1(m+1, r, p, k<<1|1, val);
  T[k][0] = min(T[k<<1][0], T[k<<1|1][0]);
  T[k][1] = min(T[k<<1][1], T[k<<1|1][1]); 
}
void rem2(int l, int r, int p, int k, int val){
  if(r < p || T[k][1] > val) return;
  if(l == r){
    if(T[k][1] <= val){
      re[l] = 1;
      T[k][0] = INT_MAX;
      T[k][1] = INT_MAX;
    }
    return;
  }
  int m = l+r>>1;
  rem2(l, m, p, k<<1, val);
  rem2(m+1, r, p, k<<1|1, val);
  T[k][0] = min(T[k<<1][0], T[k<<1|1][0]);
  T[k][1] = min(T[k<<1][1], T[k<<1|1][1]); 
}
void rem(int l, int r, int p, int k){
  if(l == r){
    re[l] = 1;
    T[k][0] = INT_MAX;
    T[k][1] = INT_MAX;
    return;
  }
  int m = l+r>>1;
  if(p <= m)
    rem(l, m, p, k<<1);
  else
    rem(m+1, r, p, k<<1|1);
  T[k][0] = min(T[k<<1][0], T[k<<1|1][0]);
  T[k][1] = min(T[k<<1][1], T[k<<1|1][1]); 
}




void solve(){
  cin >> n;
  ans = 0;
  for(int i = 1; i <= n; ++i){
    cin >> A[i][0] >> A[i][1];
  }
  sort(A+1, A+1+n);
  for(int i = 1; i <= n; ++i) A[i][2] = i;
  re.resize(n+1);
  build(1, n, 1);

  for(int i = 1; i <= n; ++i) B[i] = A[i];

  sort(B+1, B+1+n, [&](const array<int, 3> &x, const array<int, 3> &y){
    return x[1] < y[1];
  });
  for(int i = n; i >= 1; --i){
    int pos = B[i][2];
    if(re[pos]) continue;
    rem1(1, n, pos - 1, 1, B[i][1] - B[i][0]);
    rem2(1, n, pos + 1, 1, B[i][1] + B[i][0]);
    rem(1, n, pos, 1);
    ++ans;
  }

  cout << ans;
}



int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
    // en;
    en;
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  return 0;
} 

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void build(int, int, int)':
Main.cpp:22:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   22 |   int m = l+r>>1;
      |           ~^~
Main.cpp: In function 'void rem1(int, int, int, int, int)':
Main.cpp:39:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |   int m = l+r>>1;
      |           ~^~
Main.cpp: In function 'void rem2(int, int, int, int, int)':
Main.cpp:55:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |   int m = l+r>>1;
      |           ~^~
Main.cpp: In function 'void rem(int, int, int, int)':
Main.cpp:68:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   68 |   int m = l+r>>1;
      |           ~^~
Main.cpp: In function 'int main()':
Main.cpp:112:15: warning: unused variable 'aa' [-Wunused-variable]
  112 |   int tt = 1, aa;
      |               ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...