제출 #386708

#제출 시각아이디문제언어결과실행 시간메모리
386708clifter가로등 (APIO19_street_lamps)C++14
0 / 100
5063 ms96560 KiB
#include <iostream> #include <algorithm> #include <set> #include <vector> #define ll long long using namespace std; class event{ public: int t; int x; int y; ll value; }; bool cmpt(event a, event b){return a.t<b.t;} bool cmpx(event a, event b){if(a.x!=b.x) return a.x<b.x; else return a.t<b.t;} int last[300500],first[300500],toggle[300500]; ll ans[300500]; ll fw1[300500], fw2[300500]; set<int> S; vector<event> EA[300500], ER; void insert(vector<ll> &tree, int i, ll val){ while(i < tree.size()) { tree[i] += val; i += (i & -i); } } ll sum(vector<ll> &tree, int i){ ll ans = 0; while (i > 0) { ans += tree[i]; i -= (i & -i); } return ans; } void cdq(int l, int r, int n){ int mid = (l+r)/2; if(l==r) { ER.clear(); sort(EA[l].begin(), EA[l].end(), cmpx); for(int i=0; i<EA[l].size(); i++) ER.push_back(EA[l][i]); return; } vector<event> EB, EC; cdq(l, mid, n); for(int i=0; i<ER.size(); i++) EC.push_back(ER[i]); cdq(mid+1, r, n); int pt1 = 0, pt2 = 0; for(int i=l; i<=r; i++){ for(int j=0; j<EA[i].size(); j++){ EB.push_back(EA[i][j]); } } sort(EB.begin(), EB.end(), cmpx); for(int i=0; i<=n+1; i++) {fw1[i] = 0; fw2[i] = 0;} for(int i=0; i<EB.size(); i++){ if(EB[i].t<=mid){ int x = n+2-EB[i].y; while(x < n+2) { fw1[x] += EB[i].value*EB[i].t; fw2[x] += (EB[i].value>0)?1:((EB[i].value<0)?-1:0); x += (x & -x); } } if(EB[i].t>mid) { int x = n+2-EB[i].y; while (x > 0) { ans[EB[i].t] += fw2[x]*EB[i].t; ans[EB[i].t] -= fw1[x]; x -= (x & -x); } } } ER.clear(); for(int i=0; i<EB.size(); i++) ER.push_back(EB[i]); } int main() { cin.sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, m; cin>>n>>m; string s; cin>>s; last[n+1] = n+1; first[1] = 1; for(int i=n+1; i>=2; i--) last[i-1] = (s[i-2]=='1')?last[i]:(i-1); for(int i=2; i<=n+1; i++) first[i] = (s[i-2]=='1')?first[i-1]:i; S.insert(n+1); for(int i=1; i<=n; i++) if(s[i-1]=='0') S.insert(i); for(int i=1; i<=n+1; i++){ if(last[i]==i){ event e = {0, first[i], i, 1}; EA[0].push_back(e); } } for(int i=1; i<=m; i++){ string v; cin>>v; if(v=="query"){ int x, y; cin>>x>>y; event e = {i, x, y, 0}; EA[i].push_back(e); toggle[i] = 1; } else{ int a; event e1, e2, e3; cin>>a; if(s[a-1]=='0'){ s[a-1]='1'; e1 = {i, a+1, last[a+1], -1}; e2 = {i, first[a], last[a+1], 1}; EA[i].push_back(e1); EA[i].push_back(e2); last[first[a]] = last[a+1]; first[last[a+1]] = first[a]; auto k = S.find(a); S.erase(k); } else{ s[a-1] = '0'; int x1, x2; x2 = *S.lower_bound(a+1); x1 = first[x2]; e1 = {i, x1, x2, -1}; e2 = {i, x1, a, 1}; e3 = {i, a+1, x2, 1}; EA[i].push_back(e1); EA[i].push_back(e2); EA[i].push_back(e3); last[x1] = a; last[a+1] = x2; first[a] = x1; first[x2] = a+1; S.insert(a); } } } cdq(0, m, n); for(int i=1; i<=m; i++){ if(toggle[i]==1) cout<<ans[i]<<"\n"; } }

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

street_lamps.cpp: In function 'void insert(std::vector<long long int>&, int, long long int)':
street_lamps.cpp:24:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |   while(i < tree.size()) {
      |         ~~^~~~~~~~~~~~~
street_lamps.cpp: In function 'void cdq(int, int, int)':
street_lamps.cpp:45:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for(int i=0; i<EA[l].size(); i++) ER.push_back(EA[l][i]);
      |                  ~^~~~~~~~~~~~~
street_lamps.cpp:53:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |   for(int i=0; i<ER.size(); i++) EC.push_back(ER[i]);
      |                ~^~~~~~~~~~
street_lamps.cpp:58:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |     for(int j=0; j<EA[i].size(); j++){
      |                  ~^~~~~~~~~~~~~
street_lamps.cpp:66:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |   for(int i=0; i<EB.size(); i++){
      |                ~^~~~~~~~~~
street_lamps.cpp:93:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |   for(int i=0; i<EB.size(); i++) ER.push_back(EB[i]);
      |                ~^~~~~~~~~~
street_lamps.cpp:56:7: warning: unused variable 'pt1' [-Wunused-variable]
   56 |   int pt1 = 0, pt2 = 0;
      |       ^~~
street_lamps.cpp:56:16: warning: unused variable 'pt2' [-Wunused-variable]
   56 |   int pt1 = 0, pt2 = 0;
      |                ^~~
#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...