제출 #681264

#제출 시각아이디문제언어결과실행 시간메모리
681264DanTatarSegments (IZhO18_segments)C++17
100 / 100
2876 ms15324 KiB
#include <bits/stdc++.h>
#define pb push_back
#define sz(v) v.size()
#define in insert
#define ld double
#define all(v) v.begin(),v.end()
#define ent endl
#define S second
#define F first
#define pii pair <int, int>
#define int long long

/*#pragma optimize ("g",on)
#pragma GCC optimize ("inline")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize ("03")
#pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native")
#pragma comment(linker, "/stack:200000000")*/

using namespace std;

const int INF = 1e18 + 123;
const int N = 2e5 + 123;
const int mod = 998244353;
const double PI = 3.1415926536;

const double eps = 1e-20;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};

void speed(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

struct node{
    int l,r;
    int len(){
        return r-l+1;
    }
};

int n,t;
int B,m;
int last;
int del[N];
node seg[N];
vector <node> q;
vector <int> seg_cur, seg_del;
int cur = 1;
vector <vector<int>> L,R;

bool cmp(node a, node b){
    return a.len() > b.len();
}

int dist(int l,int r,int l1,int r1){
	if(l1 > r || r1 < l) return 0;
    return (int)min(r, r1) - (int)max(l, l1) + 1;
}

node decode(int a, int b){
    node tmp;
    tmp.l = (a^(t*last));
    tmp.r = (b^(t*last));
    if(tmp.l > tmp.r){
        swap(tmp.l, tmp.r);
    }

    return tmp;
}

int lg(int x){
    int res = 0;
    while(x){
        res ++;
        x/=2;
    }

    return res+1;
}

void add(node x){
    seg[cur] = x;
    seg_cur.pb(cur);
    cur ++;
}

void rem(int id){
    del[id] = 1;
    seg_del.pb(id);
}

void precalc(){
    seg_cur.clear();
    seg_del.clear();
    q.clear();
    for(int i = 1; i < cur; ++i){
        if(!del[i]){
            q.pb(seg[i]);
        }
    }

    sort(all(q), cmp);
    for(int i = 0; i < m; ++i){
        L[i].clear();
        R[i].clear();
    }

    for(int i = 0; i < sz(q); ++i){
        L[i/B].pb(q[i].l);
        R[i/B].pb(q[i].r);
    }

    for(int i = 0; i < m; ++i){
        sort(all(L[i]));
        sort(all(R[i]));
    }
}

int calc(int x){
    if(q.empty()) return 0;
	if(q.back().len() >= x) return sz(q);
	int l = -1, r = sz(q);
	while(l+1<r){
		int mid = (l+r)/2;
		if(q[mid].len() < x) r = mid;
		else l = mid;
	}

	return r;
}

int get(node x, int k){
    int S = calc(k);
    int S1 = 0;

    for(int i = 0; i < S/B; ++i){
        int p = upper_bound(all(L[i]), x.r-k+1) - L[i].begin();
        p = sz(L[i]) - p;
        S1 += p;
        p = lower_bound(all(R[i]), x.l+k-1) - R[i].begin();
        S1 += p;
    }

    int BB = S/B;
    for(int i = BB*B; i < min((BB+1ll)*B, (int)sz(q)); ++i){
        if(q[i].len() >= k && dist(x.l, x.r, q[i].l, q[i].r) < k){
            S1 ++;
        }
    }

    for(int i = 0; i < sz(seg_cur); ++i){
        int j = seg_cur[i];
        if(dist(x.l, x.r, seg[j].l, seg[j].r) >= k){
            S ++;
        }
    }

    for(int i = 0; i < sz(seg_del); ++i){
        int j = seg_del[i];
        if(dist(x.l, x.r, seg[j].l, seg[j].r) >= k){
            S --;
        }
    }

    S -= S1;
    return last=S;
}

void solve(){
    cin >> n >> t;
    B = sqrt(n*lg(n));
    m = n/B+2;

    L.resize(m);
    R.resize(m);

    for(int i = 1; i <= n; ++i){
        if(i%B==0){
            precalc();
        }

        int type;
        cin >> type;
        if(type == 1){
            int a,b;
            cin >> a >> b;
            add(decode(a,b));
        } else if(type == 2){
            int ind;
            cin >> ind;
            rem(ind);
        } else {
            int a,b,k;
            cin >> a >> b >> k;
            cout << get(decode(a,b), k) << ent;
        }
    }
}

signed main() {
	speed();
    int tt = 1;
    //cin >> tt;
    while(tt --){
        solve();
        cout << ent;
    }
}

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

segments.cpp: In function 'void precalc()':
segments.cpp:113:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |     for(int i = 0; i < sz(q); ++i){
      |                      ^
segments.cpp: In function 'long long int get(node, long long int)':
segments.cpp:156:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  156 |     for(int i = 0; i < sz(seg_cur); ++i){
      |                      ^
segments.cpp:163:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |     for(int i = 0; i < sz(seg_del); ++i){
      |                      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...