This documentation is automatically generated by competitive-verifier/competitive-verifier
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/problems/DSL_5_A"
#include "include/mtl/dual_disjoint_sparse_table.hpp"
#include <bits/stdc++.h>
using namespace std;
int sum(int a, int b) {
return a+b;
}
int e() {return 0;}
int main() {
int n,t; cin>>n>>t;
DualDisjointSparseTable<int, sum, e> st(t);
for (int i = 0; i < n; i++) {
int l,r; cin>>l>>r;
st.apply(l, r, 1);
}
st.build();
int ans = 0;
for (int i = 0; i < t; i++)
ans = max(ans, st.get(i));
cout << ans << endl;
}
#line 1 "test/aoj/aoj-the_maximum_number_of_customers.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/problems/DSL_5_A"
#line 2 "include/mtl/bit_manip.hpp"
#include <cstdint>
#include <cassert>
#if __cplusplus >= 202002L
#ifndef MTL_CPP20
#define MTL_CPP20
#endif
#include <bit>
#endif
namespace bm {
/// Count 1s for each 8 bits
inline constexpr uint64_t popcnt_e8(uint64_t x) {
x = (x & 0x5555555555555555) + ((x>>1) & 0x5555555555555555);
x = (x & 0x3333333333333333) + ((x>>2) & 0x3333333333333333);
x = (x & 0x0F0F0F0F0F0F0F0F) + ((x>>4) & 0x0F0F0F0F0F0F0F0F);
return x;
}
/// Count 1s
inline constexpr unsigned popcnt(uint64_t x) {
#ifdef MTL_CPP20
return std::popcount(x);
#else
return (popcnt_e8(x) * 0x0101010101010101) >> 56;
#endif
}
/// Alias to mtl::popcnt(x)
constexpr unsigned popcount(uint64_t x) {
return popcnt(x);
}
/// Count trailing 0s. s.t. *11011000 -> 3
inline constexpr unsigned ctz(uint64_t x) {
#ifdef MTL_CPP20
return std::countr_zero(x);
#else
return popcnt((x & (-x)) - 1);
#endif
}
/// Alias to mtl::ctz(x)
constexpr unsigned countr_zero(uint64_t x) {
return ctz(x);
}
/// Count trailing 1s. s.t. *11011011 -> 2
inline constexpr unsigned cto(uint64_t x) {
#ifdef MTL_CPP20
return std::countr_one(x);
#else
return ctz(~x);
#endif
}
/// Alias to mtl::cto(x)
constexpr unsigned countr_one(uint64_t x) {
return cto(x);
}
inline constexpr unsigned ctz8(uint8_t x) {
return x == 0 ? 8 : popcnt_e8((x & (-x)) - 1);
}
/// [00..0](8bit) -> 0, [**..*](not only 0) -> 1
inline constexpr uint8_t summary(uint64_t x) {
constexpr uint64_t hmask = 0x8080808080808080ull;
constexpr uint64_t lmask = 0x7F7F7F7F7F7F7F7Full;
auto a = x & hmask;
auto b = x & lmask;
b = hmask - b;
b = ~b;
auto c = (a | b) & hmask;
c *= 0x0002040810204081ull;
return uint8_t(c >> 56);
}
/// Extract target area of bits
inline constexpr uint64_t bextr(uint64_t x, unsigned start, unsigned len) {
uint64_t mask = len < 64 ? (1ull<<len)-1 : 0xFFFFFFFFFFFFFFFFull;
return (x >> start) & mask;
}
/// 00101101 -> 00111111 -count_1s-> 6
inline constexpr unsigned log2p1(uint8_t x) {
if (x & 0x80)
return 8;
uint64_t p = uint64_t(x) * 0x0101010101010101ull;
p -= 0x8040201008040201ull;
p = ~p & 0x8080808080808080ull;
p = (p >> 7) * 0x0101010101010101ull;
p >>= 56;
return p;
}
/// 00101100 -mask_mssb-> 00100000 -to_index-> 5
inline constexpr unsigned mssb8(uint8_t x) {
assert(x != 0);
return log2p1(x) - 1;
}
/// 00101100 -mask_lssb-> 00000100 -to_index-> 2
inline constexpr unsigned lssb8(uint8_t x) {
assert(x != 0);
return popcnt_e8((x & -x) - 1);
}
/// Count leading 0s. 00001011... -> 4
inline constexpr unsigned clz(uint64_t x) {
#ifdef MTL_CPP20
return std::countl_zero(x);
#else
if (x == 0)
return 64;
auto i = mssb8(summary(x));
auto j = mssb8(bextr(x, 8 * i, 8));
return 63 - (8 * i + j);
#endif
}
/// Alias to mtl::clz(x)
constexpr unsigned countl_zero(uint64_t x) {
return clz(x);
}
/// Count leading 1s. 11110100... -> 4
inline constexpr unsigned clo(uint64_t x) {
#ifdef MTL_CPP20
return std::countl_one(x);
#else
return clz(~x);
#endif
}
/// Alias to mtl::clo(x)
constexpr unsigned countl_one(uint64_t x) {
return clo(x);
}
inline constexpr unsigned clz8(uint8_t x) {
return x == 0 ? 8 : 7 - mssb8(x);
}
inline constexpr uint64_t bit_reverse(uint64_t x) {
x = ((x & 0x00000000FFFFFFFF) << 32) | ((x & 0xFFFFFFFF00000000) >> 32);
x = ((x & 0x0000FFFF0000FFFF) << 16) | ((x & 0xFFFF0000FFFF0000) >> 16);
x = ((x & 0x00FF00FF00FF00FF) << 8) | ((x & 0xFF00FF00FF00FF00) >> 8);
x = ((x & 0x0F0F0F0F0F0F0F0F) << 4) | ((x & 0xF0F0F0F0F0F0F0F0) >> 4);
x = ((x & 0x3333333333333333) << 2) | ((x & 0xCCCCCCCCCCCCCCCC) >> 2);
x = ((x & 0x5555555555555555) << 1) | ((x & 0xAAAAAAAAAAAAAAAA) >> 1);
return x;
}
/// Check if x is power of 2. 00100000 -> true, 00100001 -> false
constexpr bool has_single_bit(uint64_t x) noexcept {
#ifdef MTL_CPP20
return std::has_single_bit(x);
#else
return x != 0 && (x & (x - 1)) == 0;
#endif
}
/// Bit width needs to represent x. 00110110 -> 6
constexpr int bit_width(uint64_t x) noexcept {
#ifdef MTL_CPP20
return std::bit_width(x);
#else
return 64 - clz(x);
#endif
}
/// Ceil power of 2. 00110110 -> 01000000
constexpr uint64_t bit_ceil(uint64_t x) {
#ifdef MTL_CPP20
return std::bit_ceil(x);
#else
if (x == 0) return 1;
return 1ull << bit_width(x - 1);
#endif
}
/// Floor power of 2. 00110110 -> 00100000
constexpr uint64_t bit_floor(uint64_t x) {
#ifdef MTL_CPP20
return std::bit_floor(x);
#else
if (x == 0) return 0;
return 1ull << (bit_width(x) - 1);
#endif
}
} // namespace bm
#line 3 "include/mtl/dual_disjoint_sparse_table.hpp"
#include <vector>
#include <algorithm>
template<typename T, T (*op)(T, T), T (*e)()>
class DualDisjointSparseTable {
private:
int log_n_;
size_t n_;
std::vector<std::vector<T>> tb_;
public:
DualDisjointSparseTable(size_t n) :
log_n_(64-bm::clz(n-1)),
n_(1ull<<log_n_),
tb_(std::max(log_n_, 1), std::vector<T>(n_, e())) {}
template<typename It>
DualDisjointSparseTable(It begin, It end) :
DualDisjointSparseTable(std::distance(begin, end)) {
std::copy(begin, end, tb_[0].begin());
}
void apply(size_t l, size_t r, T a) {
if (l >= r) return;
if (r-l==1) {
tb_[0][l] = op(tb_[0][l], a);
return;
}
auto d = 63-bm::clz((r-1)^l);
tb_[d][l] = op(tb_[d][l], a);
tb_[d][r-1] = op(tb_[d][r-1], a);
}
void build() {
for (int i = 1; i < log_n_; i++) {
auto d = 1<<i;
for (size_t j = 0; j < n_; j += d*2) {
T ml = e();
for (size_t k = j; k < j+d; k++) {
ml = op(ml, tb_[i][k]);
tb_[0][k] = op(tb_[0][k], ml);
}
T mr = e();
for (size_t k = j+d*2-1; k >= j+d; k--) {
mr = op(mr, tb_[i][k]);
tb_[0][k] = op(tb_[0][k], mr);
}
}
}
}
T get(size_t i) const {
return tb_[0][i];
}
};
#line 3 "test/aoj/aoj-the_maximum_number_of_customers.test.cpp"
#include <bits/stdc++.h>
using namespace std;
int sum(int a, int b) {
return a+b;
}
int e() {return 0;}
int main() {
int n,t; cin>>n>>t;
DualDisjointSparseTable<int, sum, e> st(t);
for (int i = 0; i < n; i++) {
int l,r; cin>>l>>r;
st.apply(l, r, 1);
}
st.build();
int ans = 0;
for (int i = 0; i < t; i++)
ans = max(ans, st.get(i));
cout << ans << endl;
}
Env | Name | Status | Elapsed | Memory |
---|---|---|---|---|
g++ | 00_sample1_in1.in |
![]() |
6 ms | 3 MB |
g++ | 00_sample1_in2.in |
![]() |
5 ms | 3 MB |
g++ | sub1_in1.in |
![]() |
5 ms | 3 MB |
g++ | sub1_in2.in |
![]() |
5 ms | 3 MB |
g++ | sub1_in3.in |
![]() |
5 ms | 3 MB |
g++ | sub1_in4.in |
![]() |
5 ms | 3 MB |
g++ | sub1_in5.in |
![]() |
5 ms | 3 MB |
g++ | sub2_in1.in |
![]() |
6 ms | 4 MB |
g++ | sub2_in2.in |
![]() |
5 ms | 3 MB |
g++ | sub2_in3.in |
![]() |
6 ms | 4 MB |
g++ | sub2_in4.in |
![]() |
6 ms | 4 MB |
g++ | sub2_in5.in |
![]() |
6 ms | 4 MB |
g++ | sub2_in6.in |
![]() |
6 ms | 4 MB |
g++ | sub2_in7.in |
![]() |
6 ms | 4 MB |
g++ | sub3_in1.in |
![]() |
16 ms | 13 MB |
g++ | sub3_in2.in |
![]() |
16 ms | 13 MB |
g++ | sub3_in3.in |
![]() |
16 ms | 13 MB |
g++ | sub3_in4.in |
![]() |
16 ms | 13 MB |
g++ | sub3_in5.in |
![]() |
49 ms | 13 MB |
g++ | sub3_in6.in |
![]() |
48 ms | 13 MB |
g++ | sub3_in7.in |
![]() |
48 ms | 13 MB |
g++ | sub3_in8.in |
![]() |
48 ms | 13 MB |
g++ | sub4_corner_00.in |
![]() |
5 ms | 3 MB |
g++ | tle_dense_00.in |
![]() |
40 ms | 13 MB |
g++ | tle_dense_01.in |
![]() |
41 ms | 13 MB |
g++ | tle_dense_02.in |
![]() |
43 ms | 13 MB |
clang++ | 00_sample1_in1.in |
![]() |
6 ms | 3 MB |
clang++ | 00_sample1_in2.in |
![]() |
5 ms | 3 MB |
clang++ | sub1_in1.in |
![]() |
5 ms | 3 MB |
clang++ | sub1_in2.in |
![]() |
5 ms | 3 MB |
clang++ | sub1_in3.in |
![]() |
5 ms | 3 MB |
clang++ | sub1_in4.in |
![]() |
5 ms | 3 MB |
clang++ | sub1_in5.in |
![]() |
5 ms | 3 MB |
clang++ | sub2_in1.in |
![]() |
5 ms | 3 MB |
clang++ | sub2_in2.in |
![]() |
5 ms | 3 MB |
clang++ | sub2_in3.in |
![]() |
6 ms | 4 MB |
clang++ | sub2_in4.in |
![]() |
6 ms | 4 MB |
clang++ | sub2_in5.in |
![]() |
6 ms | 4 MB |
clang++ | sub2_in6.in |
![]() |
6 ms | 4 MB |
clang++ | sub2_in7.in |
![]() |
6 ms | 4 MB |
clang++ | sub3_in1.in |
![]() |
16 ms | 12 MB |
clang++ | sub3_in2.in |
![]() |
16 ms | 13 MB |
clang++ | sub3_in3.in |
![]() |
16 ms | 13 MB |
clang++ | sub3_in4.in |
![]() |
15 ms | 13 MB |
clang++ | sub3_in5.in |
![]() |
49 ms | 13 MB |
clang++ | sub3_in6.in |
![]() |
48 ms | 13 MB |
clang++ | sub3_in7.in |
![]() |
50 ms | 13 MB |
clang++ | sub3_in8.in |
![]() |
49 ms | 13 MB |
clang++ | sub4_corner_00.in |
![]() |
5 ms | 3 MB |
clang++ | tle_dense_00.in |
![]() |
40 ms | 13 MB |
clang++ | tle_dense_01.in |
![]() |
42 ms | 13 MB |
clang++ | tle_dense_02.in |
![]() |
43 ms | 13 MB |