제출 #1088518

#제출 시각아이디문제언어결과실행 시간메모리
1088518vladiliusSegments (IZhO18_segments)C++17
100 / 100
1765 ms13064 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second const int N = 2e9; const int S = 1500; // 1) l1 <= l && r1 >= k + l - 1 // 2) l1 є [l + 1, r - k + 1] && r1 - l1 >= k - 1 struct DS{ vector<pii> all, f, st; vector<int> L, R; vector<int> R1[150], R2[150]; void add(int l, int r){ all.pb({l, r}); f.pb({l, r}); if (all.size() == S){ st.clear(); for (int i = 0; i < L.size(); i++){ st.pb({L[i], R[i]}); } for (auto [l1, r1]: all){ st.pb({l1, r1}); } sort(st.begin(), st.end()); L.clear(); R.clear(); for (auto [l1, r1]: st){ L.pb(l1); R.pb(r1); } int l1 = 0, r1 = S - 1, cc = 0; while (r1 < L.size()){ R1[cc].clear(); R2[cc].clear(); for (int i = l1; i <= r1; i++){ R1[cc].pb(R[i]); R2[cc].pb(R[i] - L[i]); } sort(R1[cc].begin(), R1[cc].end()); sort(R2[cc].begin(), R2[cc].end()); l1 += S; r1 += S; cc++; } all.clear(); } } vector<int> :: iterator it; int g(int t, int k){ // l1 є [1, t] && r1 - l1 >= k if (L.empty()) return 0; it = upper_bound(L.begin(), L.end(), t); int j = (int) (it - L.begin()) - 1, out = 0; int l1 = 0, r1 = S - 1, cc = 0; while (true){ if (r1 >= j){ for (int i = l1; i <= j; i++){ out += ((R[i] - L[i]) >= k); } break; } if (!R2[cc].empty()){ it = lower_bound(R2[cc].begin(), R2[cc].end(), k); out += (int) (R2[cc].end() - it); } l1 += S; r1 += S; cc++; } return out; } int get(int l, int r, int k){ if ((r - l + 1) < k) return 0; int out = 0; if (!L.empty()){ it = upper_bound(L.begin(), L.end(), l); int j = (int) (it - L.begin()) - 1; int l1 = 0, r1 = S - 1, cc = 0; while (true){ if (r1 >= j){ for (int i = l1; i <= j; i++){ out += (R[i] >= (l + k - 1)); } break; } if (!R1[cc].empty()){ it = lower_bound(R1[cc].begin(), R1[cc].end(), l + k - 1); out += (int) (R1[cc].end() - it); } l1 += S; r1 += S; cc++; } } out += (g(r - k + 1, k - 1) - g(l, k - 1)); for (auto [l1, r1]: all){ out += ((min(r, r1) - max(l, l1) + 1) >= k); } return out; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q, out = 0; bool t; cin>>q>>t; vector<pii> f = {{0, 0}}; DS T1, T2; while (q--){ int type; cin>>type; if (type == 1){ int l, r; cin>>l>>r; l = (l ^ (t * out)); r = (r ^ (t * out)); if (l > r) swap(l, r); T1.add(l, r); f.pb({l, r}); } else if (type == 2){ int i; cin>>i; T2.add(f[i].ff, f[i].ss); } else { int l, r, k; cin>>l>>r>>k; l = (l ^ (t * out)); r = (r ^ (t * out)); if (l > r) swap(l, r); out = T1.get(l, r, k) - T2.get(l, r, k); cout<<out<<"\n"; } } }

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

segments.cpp: In member function 'void DS::add(int, int)':
segments.cpp:22:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |             for (int i = 0; i < L.size(); i++){
      |                             ~~^~~~~~~~~~
segments.cpp:34:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |             while (r1 < L.size()){
      |                    ~~~^~~~~~~~~~
#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...