洛谷鏈結
太懶了,懶得描述題面了。。。
凸包刪點誰受得了,凸包就沒法維護了,所以我們倒著看,把刪點改為加點,每次加乙個可能導致一些點從凸包上消失,但每個點消失一次就回不來了,所以每個點訪問一次,可以保證複雜度。
還好這題是個殼不是個包,否則比較毒瘤了。
每次加入乙個點,首先需要考慮它是否在凸包中,如果在就 \(return\) ,如果不考慮這個的話,可能這個點左邊和右邊確實維護成了凸殼,但是自己這個位置是凹的。然後向左看,將叉積小於 \(0\) 的中間點刪除,向右看,將叉積大於 \(0\) 的中間點刪除。
用一顆平衡樹維護凸殼。由於博主太菜,\(set\) 用的不熟,怕那些奇奇怪怪的邊界問題,所以手寫了個 \(splay\),更靈活但是**稍長點。
#include #include #include #include #include #define qwq cout<<"qwq"<#include #include #include #define ls son[x][0]
#define rs son[x][1]
using namespace std;
const int n=401010;
const int qwq=303030;
const int inf=0x3f3f3f3f;
int r;
int n,m;
struct e
}val[n],a[n];
int root = 1,tot;
int son[n][2],fa[n];
int cz[n],cx[n],vis[n];
double ans,ans[n];
inline int read()
while(z7z>='0'&&z7z<='9')
return lyy * zbk;
}inline double cha(e aa,e bb,e cc)
inline double ju(int aa,int bb)
inline bool touhou(int x)
inline void rotate(int x)
inline void splay(int x,int goal)
rotate(x);
} if(!goal) root = x;
}inline int qian(int x)
inline int hou(int x)
inline void del(int x)
void insert(e u)
ans -= ju(lv,rv); ans += ju(v,lv); ans += ju(v,rv);
while(2333)
else break;
} while(2333)
else break; }}
int main()
} for(int i=1;i<=n;i++) if(!vis[i]) insert(a[i]);
for(int i=m;i>=1;i--)
for(int i=1;i<=m;i++) if(cz[i]==2) printf("%.2lf\n",ans[i]);
return 0;
}
感覺考場上手敲平衡樹很不吃香,所以看了別的大佬的題解重寫了個 \(set\) 版的:
#include #include #include #include #include #define qwq cout<<"qwq"<#include #include #include using namespace std;
const int n=401010;
const int qwq=303030;
const int inf=0x3f3f3f3f;
int n,m;
int cz[n],cx[n],vis[n];
double ans[n],ans;
struct e
} a[n];
inline e operator - (e aa,e bb)
inline int operator * (e aa,e bb)
inline bool operator < (e aa,e bb)
while(z7z>='0'&&z7z<='9')
return lyy * zbk;
}inline double ju(e aa)
inline void push(e x)
while(2333)
s.insert(x);
l = r = s.find(x);
--l; ++r;
ans += ju(x - *l) + ju(x - *r);
}int main()
for(int i=1;i<=n;i++) if(!vis[i]) push(a[i]);
for(int i=m;i>=1;i--)
for(int i=1;i<=m;i++) if(cz[i]==2) printf("%.2lf\n",ans[i]);
return 0;
}
HAOI2011 防線修建
傳送門 參考部落格 練習s tl stlst l庫。動態維護凸包。由於題目要求乙個乙個刪除,可以考慮反過來離線操作,乙個乙個加回去。當新增加乙個點的時候,往它的左右兩邊擴張 set setse t中按照x xx排好序 看是否需要修改凸包。用叉積判斷即可。注意最開始要加上dis 0,0 x,y dis...
HAOI2011 防線修建
近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 給出你所有的a國城市座標 a國上層經過討論,考慮到經濟問題...
HAOI2011 BZOJ2300 防線修建
description 近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 給出你所有的a國城市座標 a國上層...