BZOJ2695 保護古蹟

2022-05-25 11:06:11 字數 2322 閱讀 2020

非常帶勁之計算幾何

寫的頭暈= =

就是平面圖轉對偶圖然後最小割

由於p非常小我們列舉所有保護狀態然後割一下

建圖真的煩 就是把區域劃分出來看一下每乙個古蹟點是否被小區域包含【好像也可以寫點定位】

然後我好像判左右叉積又雙叒叕的寫反了?

整個畫出圖來然後發現好像沒建錯圖= = 然後把!刪掉竟然過了= =於是愉快改成onright= =

區域劃分就是雙向直線然後每次找反向的極角的最近的就可以了 可以畫個圖大概就是這個樣子

紅的就是反向邊 找的就是藍色的 找一圈就一定會找回來

然後別忘了記錄那個外邊的無限平面

寫起來帶勁2333

//love and freedom.

#include#include#include#include#include#include#include#define inf 20021225

#define ll long long

#define db double

#define eps 1e-8

using namespace std;

#define mxm 200000

#define mxn 1100

struct poi

poi(db _x,db _y)

};typedef poi vec;

vec operator +(vec a,vec b)

vec operator -(vec a,vec b)

vec operator *(vec a,db b)

db cross(vec a,vec b)

db value(vec a)

db len(vec a)

struct line

line(poi _p,vec _v)

};bool onright(poi p,line l)

vectore[mxn];

poi spc[mxn],stk[mxn];

bool v[mxn],out[mxn];

int n,m,p,bel[mxn];

line li[mxm];

bool cmp(int a,int b)

void find(int tmp,int id)

while(start!=now);

for(int i=1;i<=p;i++) if(v[i]) bel[i]=id;

if(area>0) out[id]=1;

}int ed,blk;

struct edge

edge(int _x,int _y,int _w)

}e[mxm];

int ecnt;

int ans[mxn];

struct edge;

struct maxflow

void add(int x,int y,int f)

bool bfs()

}return false;

} int dfs(int x,int flow)

}dis[x] = -1;

return flow-cur;

} int dinic()

int build(int state)

for(int i=1;i<=ecnt;i++)

return one;

}}flow;

int main()

for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end(),cmp);

for(int i=1;i<=ed;i++) if(!li[i].flag) find(i,++blk);

for(int i=1;i<=ed;i++) e[++ecnt] = edge(li[i].flag,li[li[i].another].flag,li[i].w);

//for(int i=1;i<=ed;i++) printf("%d %d\n",i,li[i].flag);

memset(ans,48,sizeof(ans));

int top=(1<

//for(int i=1;i<=p;i++) printf("%d\n",bel[i]);

for(int i=1;i

for(int i=p;i;i--) ans[i]=min(ans[i],ans[i+1]);

for(int i=1;i<=p;i++) printf("%d\n",ans[i]);

return 0;

}

bzoj 3203 保護出題人

題意 在乙個詭異的植物大戰殭屍遊戲中,給出n關 第i關隊首殭屍距房門xi,兩個殭屍之間間隔為d 每次在隊首新增乙個血量為ai的殭屍,其他殭屍不變 每關在門前放乙個攻擊力任意的植物,求n關放置植物總攻擊力的最小值 n 100000,其他資料 10 12 題解 題意敘述略詭異。建議還是去看一眼原題 首先...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...

BZOJ3203 SDOI2013 保護出題人

bzoj luogu 題面不太好簡化就不放了qaq。先對殭屍的血量做乙個字首和,然後在第 i 關中視第 j 只殭屍 j le i 的血量為 a i a 這樣就可以當作是開了穿牆掛,可以一直攻擊每乙隻殭屍直至其死亡。考慮最優策略,一定是某乙隻殭屍在剛好走到門前的時候把他打死。也就是算出打死每乙隻殭屍所...