답안 #781702

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
781702 2023-07-13T10:12:37 Z Sam_a17 송신탑 (IOI22_towers) C++17
18 / 100
774 ms 6392 KB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
//#include "temp.cpp"
#include <cstdio>
using namespace std;
 
#ifndef ONLINE_JUDGE
#define dbg(x) cerr << #x <<" "; print(x); cerr << endl;
#else
#define dbg(x)
#endif
 
#define sz(x) (int)x.size()
#define len(x) (int)x.length()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define clr(x) (x).clear()
#define uniq(x) x.resize(unique(all(x)) - x.begin());
#define blt __builtin_popcount
 
#define pb push_back
#define popf pop_front
#define popb pop_back
#define ld long double
#define ll long long
 
void print(long long t) {cerr << t;}
void print(int t) {cerr << t;}
void print(string t) {cerr << t;}
void print(char t) {cerr << t;}
void print(double t) {cerr << t;}
void print(long double t) {cerr << t;}
void print(unsigned long long t) {cerr << t;}
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define nl '\n'
 
// Indexed Set  
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
template <class T, class V> void print(pair <T, V> p);
template <class T> void print(vector <T> v);
template <class T> void print(set <T> v);
template <class T, class V> void print(map <T, V> v);
template <class T> void print(multiset <T> v);
template <class T, class V> void print(T v[],V n) {cerr << "["; for(int i = 0; i < n; i++) {print(v[i]); cerr << " "; } cerr << "]";}
template <class T, class V> void print(pair <T, V> p) {cerr << "{"; print(p.first); cerr << ","; print(p.second); cerr << "}";}
template <class T> void print(vector <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
// template <class T> void print(vector <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(set <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(multiset <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(Tree <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void print(map <T, V> v) {cerr << "[ "; for (auto i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(deque <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
 
 
// for random generations
mt19937 myrand(chrono::steady_clock::now().time_since_epoch().count());
// mt19937 myrand(131);
 
// for grid problems
int dx[8] = {-1,0,1,0,1,-1,1,-1};
int dy[8] = {0,1,0,-1,1,1,-1,-1};
 
// lowest / (1 << 17) >= 1e5 / (1 << 18) >= 2e5 / (1 << 21) >= 1e6
void fastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr); cout.tie(nullptr);
}
// file in/out
void setIO(string str = "") {
  fastIO();
 
  if(str == "input") {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  } else if(str != "") {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
  }
}

const int N = 2e5 + 10;
int a[N], mid = -1;
int f1 = 1, n;
vector<int> b;
int pi[N];

struct segTreeMax {
  vector<long long> mTree;
  int size;
 
  void init(long long n) {
    size = 1;
    while(size < n)  {
      size *= 2;
    }
    mTree.assign(2 * size - 1, 0);
  }
 
  void upd(int u, long long v, int x, int lx, int rx) { // set value at pos u
    if(rx - lx == 1) {
      mTree[x] = v;
      return;
    }
 
    int m = (lx + rx) / 2;
    if(u < m) {
      upd(u, v, 2 * x + 1, lx, m);
    }else {
      upd(u, v, 2 * x + 2, m, rx);
    }
    mTree[x] = max(mTree[2 * x + 1], mTree[2 * x + 2]);
  }
 
  void upd(int u, long long v) {
    upd(u, v, 0, 0, size);
  }
 
  long long qry (int l, int r, int x, int lx, int rx) { // range queries
    if(l >= rx || lx >= r) {
      return 0;
    }
    if(lx >= l && r >= rx) {
      return mTree[x];
    }
 
    int m = (rx + lx) / 2;
    long long s1 = qry(l, r, 2 * x + 1, lx, m);
    long long s2 = qry(l, r, 2 * x + 2, m, rx);
    return max(s1, s2);
  }
 
  long long qry(int l, int r) {
    if(l >= r) {
      return -10;
    } 
    return qry(l, r, 0, 0, size);
  }
};

segTreeMax seg_max, seg_all;

vector<long long> ai;

void init(int maxN, std::vector<int> H) {
  n = maxN;
  pair<int, int> mx = {0, 0};

  seg_all.init(n + 1);
  for(int i = 0; i < n; i++) {
    a[i] = H[i];
    seg_all.upd(i, a[i]);
    mx = max(mx, make_pair(a[i], i));
  }
  
  vector<int> lowRig(n + 1, n), lowLef(n + 1, -1);
  stack<pair<int, int>> st;
  for(int i = 0; i < n; i++) {
    while(!st.empty() && st.top().first > a[i]) {
      int cur = st.top().second;
      lowRig[cur] = i;
      st.pop();
    }

    if(!st.empty()) {
      lowLef[i] = st.top().second;
    }
    st.push({a[i], i});
  }

  for(int i = 0; i < n; i++) {
    long long curl = seg_all.qry(lowLef[i] + 1, i);
    if(i == 0) {
      curl = 2e9 + 10;
    }
    long long curr = seg_all.qry(i + 1, lowRig[i]);
    if(i == n - 1) {
      curr = 2e9 + 10;
    }
    ai.push_back(min(curl, curr) - a[i]);
  }

  sort(all(ai));
  mid = mx.second;
  for(int i = 0; i < mid; i++) {
    if(a[i + 1] <= a[i]) {
      f1 = 0;
    }
  }

  for(int i = mid + 1; i < n; i++) {
    if(a[i] >= a[i - 1]) {
      f1 = 0;
    }
  }

  for(int i = 1; i < n - 1; i++) {
    pi[i] = pi[i - 1] + (a[i] > a[i - 1] && a[i] > a[i + 1]);
  }
  pi[n - 1] = pi[n - 2];
}

int max_towers(int L, int R, int D) {

  if(L == 0 && R == n - 1) {
    auto it = lower_bound(all(ai), (long long )D);
    int answ = 1;
    if(it != ai.end()) {
      int ind = it - ai.begin();
      answ = max(answ, n - ind);
    }
    return answ;
  }

  if(f1) {
    if(R <= mid || L >= mid) {
      return 1;
    }

    if(R - L + 1 == 1) {
      return 1;
    }

    if(a[mid] - D >= max(a[L], a[R])) {
      return 2;
    } else {
      return 1;
    }
  } else if(D == 1) {
    int cur = pi[R - 1] - pi[L] + 1;
    return max(1, cur);
  } else {
    vector<long long> dp(n + 1);
    long long answ = 0;

    set<pair<long long, long long>> ft;
    deque<pair<int, int>> vec;
    seg_max.init(n + 5);
    for(int i = L; i <= R; i++) {
      dp[i] = 1;

      auto it = lower_bound(all(vec), make_pair(a[i] + D, -1));
      if(it != vec.end()) {
        int ind = it - vec.begin();
        if(vec[ind].second >= 1) {
          dp[i] = max(dp[i], seg_max.qry(0, vec[ind].second) + 1);
        }
      }

      while (!vec.empty() && a[i] > vec.front().first) {
        vec.pop_front();
      }
      vec.push_front({a[i], i});

      while(!ft.empty() && ft.begin()->first <= a[i] - D) {
        seg_max.upd(ft.begin()->second, dp[ft.begin()->second]);
        ft.erase(ft.begin());
      }
      ft.insert({a[i], i});

      answ = max(answ, dp[i]);
    }
 
    return answ;
  }
}

Compilation message

towers.cpp: In function 'void setIO(std::string)':
towers.cpp:76:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
towers.cpp:77:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     freopen("output.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
towers.cpp:79:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |     freopen((str + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
towers.cpp:80:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |     freopen((str + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 354 ms 3524 KB Output is correct
2 Correct 774 ms 6212 KB Output is correct
3 Correct 749 ms 6228 KB Output is correct
4 Correct 756 ms 6332 KB Output is correct
5 Correct 723 ms 5564 KB Output is correct
6 Correct 697 ms 6236 KB Output is correct
7 Correct 494 ms 5588 KB Output is correct
8 Correct 1 ms 208 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 464 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 2 ms 464 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 1 ms 464 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 464 KB Output is correct
11 Correct 1 ms 336 KB Output is correct
12 Correct 0 ms 208 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 2 ms 336 KB Output is correct
17 Correct 1 ms 336 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 1 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 1 ms 336 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Incorrect 1 ms 336 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 464 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 2 ms 464 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 1 ms 464 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 464 KB Output is correct
11 Correct 1 ms 336 KB Output is correct
12 Correct 0 ms 208 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 2 ms 336 KB Output is correct
17 Correct 1 ms 336 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 1 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 1 ms 336 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Incorrect 1 ms 336 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 405 ms 5544 KB Output is correct
2 Correct 574 ms 5552 KB Output is correct
3 Correct 736 ms 5564 KB Output is correct
4 Correct 696 ms 5620 KB Output is correct
5 Correct 597 ms 5616 KB Output is correct
6 Correct 621 ms 5572 KB Output is correct
7 Correct 743 ms 5540 KB Output is correct
8 Correct 546 ms 6372 KB Output is correct
9 Correct 661 ms 5552 KB Output is correct
10 Correct 766 ms 6068 KB Output is correct
11 Correct 646 ms 5532 KB Output is correct
12 Correct 689 ms 6208 KB Output is correct
13 Correct 723 ms 5644 KB Output is correct
14 Correct 0 ms 208 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 1 ms 336 KB Output is correct
17 Correct 36 ms 5536 KB Output is correct
18 Correct 34 ms 5564 KB Output is correct
19 Correct 33 ms 5536 KB Output is correct
20 Correct 26 ms 5536 KB Output is correct
21 Correct 32 ms 6392 KB Output is correct
22 Correct 41 ms 5608 KB Output is correct
23 Correct 40 ms 5564 KB Output is correct
24 Correct 35 ms 5532 KB Output is correct
25 Correct 26 ms 5524 KB Output is correct
26 Correct 37 ms 6040 KB Output is correct
27 Correct 1 ms 336 KB Output is correct
28 Correct 1 ms 336 KB Output is correct
29 Correct 1 ms 336 KB Output is correct
30 Correct 1 ms 336 KB Output is correct
31 Correct 2 ms 336 KB Output is correct
32 Correct 1 ms 336 KB Output is correct
33 Correct 1 ms 336 KB Output is correct
34 Correct 1 ms 336 KB Output is correct
35 Correct 1 ms 336 KB Output is correct
36 Correct 1 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 261 ms 1620 KB 3rd lines differ - on the 1st token, expected: '150', found: '149'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 464 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 2 ms 464 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 1 ms 464 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 464 KB Output is correct
11 Correct 1 ms 336 KB Output is correct
12 Correct 0 ms 208 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 2 ms 336 KB Output is correct
17 Correct 1 ms 336 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 1 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 1 ms 336 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Incorrect 1 ms 336 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 354 ms 3524 KB Output is correct
2 Correct 774 ms 6212 KB Output is correct
3 Correct 749 ms 6228 KB Output is correct
4 Correct 756 ms 6332 KB Output is correct
5 Correct 723 ms 5564 KB Output is correct
6 Correct 697 ms 6236 KB Output is correct
7 Correct 494 ms 5588 KB Output is correct
8 Correct 1 ms 208 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
11 Correct 0 ms 336 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Correct 1 ms 464 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 2 ms 464 KB Output is correct
16 Correct 1 ms 336 KB Output is correct
17 Correct 1 ms 464 KB Output is correct
18 Correct 1 ms 348 KB Output is correct
19 Correct 1 ms 336 KB Output is correct
20 Correct 1 ms 464 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 0 ms 208 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 336 KB Output is correct
25 Correct 1 ms 336 KB Output is correct
26 Correct 2 ms 336 KB Output is correct
27 Correct 1 ms 336 KB Output is correct
28 Correct 1 ms 336 KB Output is correct
29 Correct 1 ms 336 KB Output is correct
30 Correct 1 ms 336 KB Output is correct
31 Correct 1 ms 336 KB Output is correct
32 Correct 1 ms 336 KB Output is correct
33 Correct 1 ms 336 KB Output is correct
34 Correct 1 ms 332 KB Output is correct
35 Incorrect 1 ms 336 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
36 Halted 0 ms 0 KB -