[INFOR] 77 好孩子不要亂改別人東西
題目連結:https://oj.infor.org/problems/77
聽了AY的解說才會的。
將平面分成四塊,題目也就可以轉變成上半塊減左半塊或是右半塊減去下半塊,所以就離線做、離散化,BIT隨便弄一弄就OK了。
聽了AY的解說才會的。
將平面分成四塊,題目也就可以轉變成上半塊減左半塊或是右半塊減去下半塊,所以就離線做、離散化,BIT隨便弄一弄就OK了。
#include<bits/stdc++.h> using namespace std; int n; int a,b,c; typedef pair<int,int> pi; vector<pair<int,pi> > v; vector<int> lis; int bitx[600009]; int bity[600009]; const int N = 600009; void update(int x,int i,int t) { if(t == 1) { while(i <= N) { bitx[i] += x; i += i&-i; } } else { while(i <= N) { bity[i] += x; i += i&-i; } } } int sum(int i,int t) { int res = 0; if(t == 1) { while(i > 0) { res += bitx[i]; i -= i&-i; } } else { while(i > 0) { res += bity[i]; i -= i&-i; } } return res; } int main() { cin >> n; while(n--) { cin >> a >> b >> c; v.push_back({a,{b,c}}); lis.push_back(b); lis.push_back(c); } sort(lis.begin(),lis.end()); auto d = unique(lis.begin(),lis.end()); for(auto &i:v) { i.second.first = lower_bound(lis.begin(),d,i.second.first)-lis.begin()+1; i.second.second = lower_bound(lis.begin(),d,i.second.second)-lis.begin()+1; } for(auto i:v) { if(i.first == 1) { update(1,i.second.first,1); update(1,i.second.second,2); } else { int t1 = sum(600000,1)-sum(i.second.first-1,1); int t2 = sum(i.second.second,2); cout << t1-t2 << endl; } } }
留言
張貼留言