The Most Important 图论你妹妹 忽略了。。
A 动态维护凸包 / mutiset / 离线树状数组 / 平衡木
http://acm.nbut.cn/Problem/view.xhtml?id=1348
http://blog.youkuaiyun.com/c3568/article/details/8549325
From Ac:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int MAXN = 22222;
const int MAXM = 50001;
#define mp make_pair
#define pb push_back
int X[ MAXM ];
map< int, int > st_x ;
vector< int > dv;
int n;
int main(){
int T;
cin >> T;
for(int cas = 1; cas <= T; ++ cas) {
if(cas != 1) puts("");
printf("Case #%d:\n", cas );
memset(X,0x3f,sizeof X);
st_x.clear();
scanf("%d", &n);
int m=0;
for(int i=0;i<n;++i) {
int x,y; scanf("%d%d", &x, &y);
map< int, int >::iterator ps = st_x.lower_bound(x);
int pre = X[x];
X[x]=min(X[x],y);
dv.clear();
if(st_x.size() && ps!=st_x.begin()) {
--ps;
if(y<X[ps->first]) {
for(++ ps; ps != st_x.end();++ps) {
if(x<ps->first) {
if(X[ps->first]>= X[x])
dv.pb(ps->first); //to delete
else break;
}
}
//delete
for(int j=0;j<dv.size();++j) {
m -= st_x[ dv[j ] ];
st_x.erase( dv[j] );
}
m -= st_x[x];
if(y == pre){
st_x[x]++;
}else {
st_x[x] = 1;
}
m += st_x[x];
}
}else {
for(; st_x.size() && ps != st_x.end();++ps) {
if(x<ps->first) {
if(X[ps->first]>= X[x])
dv.pb(ps->first); //to delete
else break;
}
}
//delete
for(int j=0;j<dv.size();++j) {
m -= st_x[ dv[j ] ];
st_x.erase( dv[j] );
}
m -= st_x[x];
if(y == pre){
st_x[x]++;
}else {
st_x[x] = 1;
}
m += st_x[x];
}
printf("%d\n", m);
}
}
return 0;
}