HAOI2011 防線修建

2022-05-06 19:48:12 字數 2573 閱讀 8696

洛谷鏈結

太懶了,懶得描述題面了。。。

凸包刪點誰受得了,凸包就沒法維護了,所以我們倒著看,把刪點改為加點,每次加乙個可能導致一些點從凸包上消失,但每個點消失一次就回不來了,所以每個點訪問一次,可以保證複雜度。

還好這題是個殼不是個包,否則比較毒瘤了。

每次加入乙個點,首先需要考慮它是否在凸包中,如果在就 \(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國上層...