답안 #641552

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
641552 2022-09-17T03:25:53 Z baojiaopisu 이상한 기계 (APIO19_strange_device) C++14
5 / 100
1611 ms 94264 KB
#include<bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using ull = unsigned long long;

using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pld = pair<ld, ld>;

#define fi first
#define se second
#define pb push_back
#define pf push_front
#define mp make_pair
#define ins insert
#define btpc __builtin_popcount
#define btclz __builtin_clz

#define sz(x) (int)(x.size());
#define all(x) x.begin(), x.end()
#define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};

template<class X, class Y>
    bool minimize(X &x, const Y &y) {
        if (x > y)
        {
            x = y;
            return true;
        }
        return false;
    }
template<class X, class Y>
    bool maximize(X &x, const Y &y) {
        if (x < y)
        {
            x = y;
            return true;
        }
        return false;
    }

const int MOD = 1e9 + 7; //998244353

template<class X, class Y>
	void add(X &x, const Y &y) {
		x = (x + y);
		if(x >= MOD) x -= MOD;
	}

template<class X, class Y> 
	void sub(X &x, const Y &y) {
		x = (x - y);
		if(x < 0) x += MOD;
	}

/* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/

const ll INF = 2e18;
const int N = 1e5 + 10;

ll gcd(ll x, ll y) {
    if(y == 0) return x;
    return gcd(y, x % y);
}

struct SegmentTree {
    ll n;
    struct NODE {
        NODE* left;
        NODE* right;

        ll sum;
        int lazy;
        NODE() {
            left = right = nullptr;
            sum = lazy = 0;
        };
    };
    NODE* root = new NODE();

    SegmentTree(ll _n = 0) {
        n = _n;
    }
private:
    void Down(NODE* &node, ll L, ll R) {
        int x = node->lazy;
        ll mid = (L + R) / 2;
        if(!x) return;
        if(node->left != nullptr) {
            node->left->sum = (mid - L + 1);
            node->left->lazy = 1;
        }

        if(node->right != nullptr) {
            node->right->sum = (R - mid);
            node->right->lazy = 1;
        }
        node->lazy = 0;
    }

    void Update(ll L, ll R, ll lo, ll hi, NODE* &node) {
        if(L > hi || R < lo) return;
        if(lo <= L && R <= hi) {
            node->sum = (R - L + 1);
            node->lazy = 1;
            return;
        }

        ll mid = (L + R) / 2;
        if(lo <= mid && node->left == nullptr) node->left = new NODE();
        if(hi > mid && node->right == nullptr) node->right = new NODE();
        Down(node, L, R);
        node->sum = 0;
        if(lo <= mid) Update(L, mid, lo, hi, node->left), node->sum += node->left->sum;
        if(hi > mid) Update(mid + 1, R, lo, hi, node->right), node->sum += node->right->sum;
    }
public:
    void update(ll L, ll R) {
        if(L > R) return;
        Update(0, n, L, R, root);
    }
};

void solve() {
	int n; ll A, B; cin >> n >> A >> B;
    ll m = A / gcd(B + 1, A);
    if(INF / m < B) m = -1;
    else m = m * B;

    if(m == -1) m = INF;
    if(m > 1e18) {
        ll ans = 0;
        for(int i = 1; i <= n; i++) {
            ll L, R; cin >> L >> R;
            ans += R - L + 1;
        }
        cout << ans;
        return;
    }

    SegmentTree IT = SegmentTree(m + 5);
    for(int i = 1; i <= n; i++) {
        ll L, R; cin >> L >> R;
        if(R - L + 1 >= m) {
            cout << m;
            return;
        }

        ll l = L % m;
        if(l + (R - L) >= m) {
            IT.update(l, m - 1);
            L += (m - 1) - l;
            L++;
            IT.update(0, R - L);
        } else {
            IT.update(l, l + (R - L));
        }
    }

    cout << IT.root->sum;
}

int main()
{

    int tc = 1, ddd = 0;
    // cin >> tc;
    while(tc--) {
        //ddd++;
        //cout << "Case #" << ddd << ": ";
        solve();
    }
}

Compilation message

strange_device.cpp: In function 'int main()':
strange_device.cpp:175:17: warning: unused variable 'ddd' [-Wunused-variable]
  175 |     int tc = 1, ddd = 0;
      |                 ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 27 ms 3868 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 3 ms 1236 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1611 ms 94264 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1611 ms 94264 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1611 ms 94264 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 247 ms 63140 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 27 ms 3868 KB Output isn't correct
3 Halted 0 ms 0 KB -