답안 #797331

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
797331 2023-07-29T09:19:56 Z Sam_a17 Election (BOI18_election) C++17
100 / 100
535 ms 52992 KB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
// #include <atcoder/all>
#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 blt(x) __builtin_popcount(x)
#define uniq(x) x.resize(unique(all(x)) - x.begin());
 
#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(unsigned long long t) {cerr << t;}
void print(long double t) {cerr << t;}
 
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> void print(T v[],T n) {cerr << "["; for(int i = 0; i < n; i++) {cerr << v[i] << " ";} 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(deque <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, class V> void print(map <T, V> v) {cerr << "[ "; for (auto i : v) {print(i); cerr << " ";} cerr << "]";}
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define nl '\n'
 
// 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};
char ch[4] = {'v', '>', '^', '<'};
 
long long ka() {
    long long x = 0;
    bool z = false;
    while (1)
    {
        char y = getchar();
        if (y == '-')
            z = true;
        else if ('0' <= y && y <= '9')
            x = x * 10 + y - '0';
        else
        {
            if (z)
                x *= -1;
            return x;
        }
    }
}
 
// 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 != "") {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
  } else if(str == "input") {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  }
}
 
// Indexed Set
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
const int N = 5e5 + 10;
vector<pair<int, int>> pp[N];
int ans[N];

struct segtree {
  struct node {
    long long sum, suffix;
  };

  node combine (node a, node b) {
    node c;
    c.sum = a.sum + b.sum;
    c.suffix = min(b.sum + a.suffix, b.suffix);
    return c;
  }

  vector<node> mTree;
  int size;

  void init(ll n) {
    size = 1;
    while(size < n)  {
      size *= 2;
    }
    mTree.assign(2 * size - 1, {0, 0});
  }

  void set(int u, ll v, int x, int lx, int rx) {
    if(rx - lx == 1) {
      mTree[x] = {v, min(0ll, v)};
      return;
    }

    int m = (lx + rx) / 2;
    if(u < m) {
      set(u, v, 2 * x + 1, lx, m);
    }else {
      set(u, v, 2 * x + 2, m, rx);
    }
    mTree[x] = combine(mTree[2 * x + 1], mTree[2 * x + 2]);
  }

  void set(int u, ll v) {
    set(u, v, 0, 0, size);
  }

  node range (int l, int r, int x, int lx, int rx) {
    if(l >= rx || lx >= r) {
      return {0, 0};
    }

    if(lx >= l && r >= rx) {
      return mTree[x];
    }

    int m = (rx + lx) / 2;
    node s1 = range(l, r, 2 * x + 1, lx, m);
    node s2 = range(l, r, 2 * x + 2, m, rx);
    return combine(s1, s2);
  }

  node range(int l, int r) {
    return range(l, r, 0, 0, size);
  }
};

segtree seg;

void solve_() {
  int n; cin >> n;
  string s; cin >> s;
 
  int q; cin >> q;
  for(int i = 1; i <= q; i++) {
    int l, r; cin >> l >> r;
    pp[l].emplace_back(r, i);
  }

  seg.init(n + 1);
  for(int i = 0; i < n; i++) {
    if(s[i] == 'T') {
      seg.set(i + 1, -1);
    } else {
      seg.set(i + 1, 1);
    }
  }

  vector<int> ts;
  for(int i = n; i >= 1; i--) {
    if(s[i - 1] == 'T') {
      ts.push_back(i);
      seg.set(i, 0);
    } else if(!ts.empty()) {
      seg.set(ts.back(), -1);
      ts.pop_back();
    }

    for(auto j: pp[i]) {
      int cur = seg.range(i, j.first + 1).suffix;
      if(cur < 0) {
        cur = -cur;
      } else {
        cur = 0;
      }

      ans[j.second] = cur + upper_bound(rall(ts), j.first) - ts.rbegin();
    }
  }

  for(int i = 1; i <= q; i++) {
    cout << ans[i] << '\n';
  }
}
 
int main() {
  setIO();
 
  auto solve = [&](int test_case)-> void {
    while(test_case--) {
      solve_();
    }
  };
 
  int test_cases = 1;
  // cin >> test_cases;
  solve(test_cases);
 
  return 0;
} 

Compilation message

election.cpp: In function 'void setIO(std::string)':
election.cpp:90:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |     freopen((str + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
election.cpp:91:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |     freopen((str + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
election.cpp:93:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
election.cpp:94:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |     freopen("output.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 12116 KB Output is correct
2 Correct 7 ms 12116 KB Output is correct
3 Correct 7 ms 12116 KB Output is correct
4 Correct 7 ms 12176 KB Output is correct
5 Correct 8 ms 12116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 12116 KB Output is correct
2 Correct 7 ms 12116 KB Output is correct
3 Correct 7 ms 12116 KB Output is correct
4 Correct 7 ms 12176 KB Output is correct
5 Correct 8 ms 12116 KB Output is correct
6 Correct 56 ms 19220 KB Output is correct
7 Correct 48 ms 18636 KB Output is correct
8 Correct 49 ms 18756 KB Output is correct
9 Correct 49 ms 19032 KB Output is correct
10 Correct 56 ms 19032 KB Output is correct
11 Correct 57 ms 19320 KB Output is correct
12 Correct 54 ms 19340 KB Output is correct
13 Correct 57 ms 19500 KB Output is correct
14 Correct 52 ms 19268 KB Output is correct
15 Correct 51 ms 19224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 12116 KB Output is correct
2 Correct 7 ms 12116 KB Output is correct
3 Correct 7 ms 12116 KB Output is correct
4 Correct 7 ms 12176 KB Output is correct
5 Correct 8 ms 12116 KB Output is correct
6 Correct 56 ms 19220 KB Output is correct
7 Correct 48 ms 18636 KB Output is correct
8 Correct 49 ms 18756 KB Output is correct
9 Correct 49 ms 19032 KB Output is correct
10 Correct 56 ms 19032 KB Output is correct
11 Correct 57 ms 19320 KB Output is correct
12 Correct 54 ms 19340 KB Output is correct
13 Correct 57 ms 19500 KB Output is correct
14 Correct 52 ms 19268 KB Output is correct
15 Correct 51 ms 19224 KB Output is correct
16 Correct 465 ms 51104 KB Output is correct
17 Correct 348 ms 47076 KB Output is correct
18 Correct 373 ms 48228 KB Output is correct
19 Correct 393 ms 49768 KB Output is correct
20 Correct 440 ms 50148 KB Output is correct
21 Correct 535 ms 52632 KB Output is correct
22 Correct 456 ms 52064 KB Output is correct
23 Correct 480 ms 52992 KB Output is correct
24 Correct 439 ms 52300 KB Output is correct
25 Correct 437 ms 51404 KB Output is correct