Submission #156083

#TimeUsernameProblemLanguageResultExecution timeMemory
156083user202729허수아비 (JOI14_scarecrows)C++17
100 / 100
426 ms7444 KiB
#include<iostream> #include<vector> #include<algorithm> #include<climits> std::vector<int> y; int64_t ans; void solve(int l,int r){ if(r-l==1) return; int m=(l+r)>>1; // ans += number of pairs (i,j) such that l<=i<m, m<=j<r, y[i]<y[j] and there is no point in the rectangle { struct pt{int x,y;}; std::vector<pt> is;is.reserve(r-l); for(int x=l;x<r;++x) is.push_back({x,y[x]}); std::sort(begin(is),end(is),[](pt a,pt b){return a.y<b.y;}); std::vector<pt> pl; // x<m, visible from current y coord, sorted by decreasing x & increasing y std::vector<pt> pr; // x>=m, may block point at current y coord, sorted by increasing x & increasing y for(pt i:is) // sweep over points int increasing y coord direction if(i.x<m){ while(!pl.empty()&&pl.back().x<i.x) pl.pop_back(); pl.push_back(i); }else{ // find point with largest y coord that blocks this point (have x <= this point) auto iter=std::upper_bound(begin(pr),end(pr),i.x,[](int x,pt p){return x<p.x;}); auto block_y=iter==begin(pr)?INT_MIN:(--iter)->y; // count number of points int pl with y>block_y ans+=end(pl)-std::lower_bound(begin(pl),end(pl),block_y,[](pt p,int y){return p.y<y;}); // add this point to pr while(!pr.empty()&&pr.back().x>i.x) pr.pop_back(); pr.push_back(i); } } solve(l,m); solve(m,r); } int main(){ std::ios::sync_with_stdio(0);std::cin.tie(0); int n;std::cin>>n; std::vector<std::pair<int,int>> pts(n); for(auto& p:pts)std::cin>>p.first>>p.second; std::sort(begin(pts),end(pts)); // by x y.resize(n); std::transform(begin(pts),end(pts),begin(y),[](std::pair<int,int> p){ return p.second; }); // x coord compression (throw away the information) pts.clear(); ans=0; solve(0,n); std::cout<<ans<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...