[INFOR] 77 好孩子不要亂改別人東西

題目連結:https://oj.infor.org/problems/77
  聽了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;
        }
    }
}

留言

這個網誌中的熱門文章

Shellshock.io從入門到上手(針對單狙)(沒有圖片、影片版本)

[TIOJ] 1007燈泡問題