제출 #391786

#제출 시각아이디문제언어결과실행 시간메모리
391786BartolMSegments (IZhO18_segments)C++17
75 / 100
5054 ms8112 KiB
#define DEBUG 1 #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define mp make_pair #define pb push_back typedef long long ll; typedef pair <int, int> pii; typedef pair <int, pii> pip; typedef pair <pii, int> ppi; typedef pair <ll, ll> pll; const int INF=0x3f3f3f3f; const int SIZ=500; const int CNT=1000; const int REB=500; const int N=2e5+5; #warning limiti int q, t, id=1, n=0, buc=1, lastans=0; pii p[N]; vector <int> R[CNT], L[CNT], v[CNT], pom; int maxi[CNT]; int cmp(int a, int b) { return p[a].Y-p[a].X<p[b].Y-p[b].X; } void xoraj(int &x) { x=x^(t*lastans); } void dodaj(pii pp) { int d=pp.Y-pp.X+1; for (int i=0; i<buc; ++i) { if (i!=buc-1 && maxi[i]<d) continue; v[i].pb(id); L[i].insert(lower_bound(L[i].begin(), L[i].end(), pp.X), pp.X); R[i].insert(lower_bound(R[i].begin(), R[i].end(), pp.Y), pp.Y); maxi[i]=max(maxi[i], d); break; } p[id++]=pp; n++; } void obrisi(int ind) { n--; pii pp=p[ind]; for (int i=0; i<buc; ++i) { if (maxi[i]<pp.Y-pp.X+1) continue; L[i].erase(lower_bound(L[i].begin(), L[i].end(), pp.X)); R[i].erase(lower_bound(R[i].begin(), R[i].end(), pp.Y)); int iz=-1; for (int j=0; j<v[i].size(); ++j) if (v[i][j]==ind) iz=j; assert(iz!=-1); v[i].erase(v[i].begin()+iz); break; } } void rebuild() { pom.clear(); for (int i=0; i<buc; ++i) { for (int x:v[i]) pom.pb(x); v[i].clear(); L[i].clear(); R[i].clear(); maxi[i]=0; } sort(pom.begin(), pom.end(), cmp); buc=1; for (int x:pom) { if (v[buc-1].size()>=SIZ) buc++; maxi[buc-1]=p[x].Y-p[x].X+1; v[buc-1].pb(x); L[buc-1].pb(p[x].X); R[buc-1].pb(p[x].Y); } for (int i=0; i<buc; ++i) sort(L[i].begin(), L[i].end()), sort(R[i].begin(), R[i].end()); } int query(int l, int r, int k) { if (k>r-l+1) return 0; int prvi=1, losi=0; for (int i=0; i<buc; ++i) { if (maxi[i]<k) { losi+=(int)v[i].size(); continue; } if (prvi) { for (int x:v[i]) if (p[x].Y-p[x].X+1<k || p[x].X>r-k+1 || p[x].Y<l+k-1) losi++; prvi=0; } else { losi+=L[i].end()-upper_bound(L[i].begin(), L[i].end(), r-k+1); losi+=lower_bound(R[i].begin(), R[i].end(), l+k-1)-R[i].begin(); } } return n-losi; } int main() { scanf("%d %d", &q, &t); for (int i=0; i<q; ++i) { int tip, l, r, k; scanf("%d", &tip); if (tip==1) { scanf("%d %d", &l, &r); xoraj(l); xoraj(r); if (l>r) swap(l, r); dodaj(mp(l, r)); } else if (tip==2) { scanf("%d", &k); obrisi(k); } else { scanf("%d %d %d", &l, &r, &k); xoraj(l); xoraj(r); if (l>r) swap(l, r); lastans=query(l, r, k); printf("%d\n", lastans); } if (i%SIZ==0 && i) rebuild(); } return 0; }

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

segments.cpp:21:2: warning: #warning limiti [-Wcpp]
   21 | #warning limiti
      |  ^~~~~~~
segments.cpp: In function 'void obrisi(int)':
segments.cpp:56:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for (int j=0; j<v[i].size(); ++j) if (v[i][j]==ind) iz=j;
      |                       ~^~~~~~~~~~~~
segments.cpp: In function 'int main()':
segments.cpp:104:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  104 |     scanf("%d %d", &q, &t);
      |     ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:107:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  107 |         scanf("%d", &tip);
      |         ~~~~~^~~~~~~~~~~~
segments.cpp:109:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |             scanf("%d %d", &l, &r); xoraj(l); xoraj(r);
      |             ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:114:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  114 |             scanf("%d", &k);
      |             ~~~~~^~~~~~~~~~
segments.cpp:118:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  118 |             scanf("%d %d %d", &l, &r, &k); xoraj(l); xoraj(r);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...