Submission #51540

#TimeUsernameProblemLanguageResultExecution timeMemory
51540moonrabbit2허수아비 (JOI14_scarecrows)C++17
100 / 100
2832 ms98140 KiB
#include <bits/stdc++.h>
#define N 200005
#define INF 1000000005
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
struct fenwick
{
    vector<int>tree;
    fenwick(int sz){tree.resize(sz+5);}
    void add(int k){
        for(;k<=tree.size();k+=k&-k)
            tree[k]++;
    }
    int sum(int k){
        int res=0;
        for(;k;k-=k&-k)
            res+=tree[k];
        return res;
    }
};
ll ans;
int n;P a[N];
void dnc(int s,int e)
{
    if(e==s)
        return;
    int m=(s+e)/2;
    dnc(s,m);
    dnc(m+1,e);
    set<int>st1,st2;
    vector<P> l,r;
    st1.insert(INF);
    for(int i=m;i>=s;i--){
        int p=*st1.lower_bound(a[i].y);
        l.push_back(P(a[i].y,p-1));
        st1.insert(a[i].y);
    }
    st2.insert(INF);
    for(int i=m+1;i<=e;i++){
        int p=-*st2.lower_bound(-a[i].y);
        r.push_back(P(p+1,a[i].y));
        st2.insert(-a[i].y);
    }
    sort(l.begin(),l.end());
    sort(r.begin(),r.end());
    map<int,int> mp;
    for(int i=0;i<l.size();i++){
        mp.insert(P(l[i].x,0));
        mp.insert(P(l[i].y,0));
    }
    for(int i=0;i<r.size();i++){
        mp.insert(P(r[i].x,0));
        mp.insert(P(r[i].y,0));
    }
    int k=1,c=0;
    for(auto it=mp.begin();it!=mp.end();it++)
        it->y=k++;
    fenwick tree(k);
    for(int i=0;i<l.size();i++){
        while(c<r.size()&&r[c].x<=l[i].x)
            tree.add(mp[r[c++].y]);
        ans+=tree.sum(mp[l[i].y])-tree.sum(mp[l[i].x]-1);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    sort(a+1,a+1+n);
    dnc(1,n);
    cout<<ans;
    return 0;
}

Compilation message (stderr)

scarecrows.cpp: In member function 'void fenwick::add(int)':
scarecrows.cpp:14:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(;k<=tree.size();k+=k&-k)
              ~^~~~~~~~~~~~~
scarecrows.cpp: In function 'void dnc(int, int)':
scarecrows.cpp:50:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<l.size();i++){
                 ~^~~~~~~~~
scarecrows.cpp:54:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<r.size();i++){
                 ~^~~~~~~~~
scarecrows.cpp:62:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<l.size();i++){
                 ~^~~~~~~~~
scarecrows.cpp:63:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while(c<r.size()&&r[c].x<=l[i].x)
               ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...