BZOJ2864 戰火星空

2021-07-10 20:57:21 字數 3015 閱讀 8128

description

從apio回來之後,xx便迷上了「戰火星空」這個遊戲。

原版戰火星空中,有一架小飛機和乙個boss,玩家控制小飛機來對boss進行射擊。然而,這種「一對一」的遊戲已經讓xx乏味,於是xx基於原版戰火星空,將其加強創造了一款新版戰火星空。

新版戰火星空中,有n個boss和m架小飛機。在遊戲過程中,boss的位置不會改變,而小飛機在從(sx, sy)到(ex, ey)的線段以速度v勻速飛行,並在到達終點後從地圖上消失;小飛機的子彈具有r的射程,在任意時刻,小飛機可以向在射程內的boss射擊;而為了使實力更加均衡,遊戲還規定在任意時刻,每個boss只能被一架小飛機作為目標射擊;每架小飛機也有乙個能量值e的限制,若某時刻小飛機向k個boss射擊,則每秒需要消耗k個單位的能量,所有能量消耗完之後小飛機不再能夠進行射擊。

在遊戲開始前,xx知道了所有boss的位置,以及每架小飛機的飛行路線以及各項屬性,他想知道所有boss被攻擊的總時間最大是多少,你能幫助他嗎?

input

第一行包含兩個整數n,m,分別表示boss和小飛機的個數。

接下來n行,每行乙個正整數點座標(x, y),表示boss所在的位置。

接下來m行,每行七個正整數:sx, sy, ex, ey, v, r, e,表示每架小飛機的運動路線、速度、射程以及能量值。

output

輸出乙個實數,表示所有boss被攻擊的最大總時間,保留6位小數。

sample input

樣例1:

1 12 2

1 1 5 3 2 1 2

樣例2:

2 412 10

7 510 10 12 10 1 1 3

6 1 8 10 1 2 3

3 6 8 2 5 3 1

42 42 42 42 6 6 6

sample output

樣例1:

0.894427

樣例2:

4.983771

hint

對於30%的資料,保證每個boss在任意時刻只在最多一架小飛機的射程範圍內。對於100%的資料,1≤n,m≤20,輸入的所有數均為正整數,且不超過1000。

source

如果我們不考慮計算幾何的問題的話,單純的最大流建圖還是非常好想的.

考慮對每個飛機和時間段+1個點,建立源匯,源點向飛機連流量e的邊,飛機向boss連流量無窮大的邊,時間段向可攻擊時間點連時間長度的邊,然後向匯點連inf的邊,跑最大流.

然後最大的問題就是幾何,需要線段和圓求交,然後就有比較多的細節要考慮了..

而且這題似乎還卡精度.

因為是暑假的考試題,直接拉來資料自己測完,交上去1a了.

#include

#include

#include

#include

#include

#define eps 1e-10

#define n 25

#define c n*n*5

#define maxn n*n*n*5

#define maxm maxn*10

using

namespace

std;

int n,m,tp,top,s,t,size;

double ans;

intmap[n][n];

struct point

};typedef point vector;

vector boss[n],s[n][2];

double v[n],r[n],e[n],tim[n];

inline vector operator + (const vector& a,const vector& b)

inline vector operator - (const vector& a,const vector& b)

inline vector operator * (const vector& a,double k)

inline vector operator / (const vector& a,double k)

inline

double dot(const vector& a,const vector& b)

inline

double cross(const vector& a,const vector& b)

inline

double length(const vector& a)

inline vector rot(const vector &a)

inline vector unit(const vector &a)

struct line

};inline vector linecross(const line& a,const line& b)

inline vector getcross(const line& l,const vector& b,double v,double r)

struct node

inline

bool

operator

<(const node& a)const e[maxm],*prev[maxn];

inline

void insert(int u,int v,double c)

inline

void add(int u,int v,double c)

int dis[maxn],cnt[maxn];

double isap()

if (b)

}else

}return ret;

}int main()

}sort(sta+1,sta+tp+1);int cost=0;s=m+1;t=s+1;size=t;

for (int i=1;i<=m;i++) add(s,i,e[i]);

for (int i=1;i<=tp;i++)}}

}ans=isap();printf("%.6f\n",ans);

}

BZOJ 2286 消耗戰(虛樹)

因為聽說多校第一場的09可以用虛樹來做,於是趕緊趁著沒比賽補一發相關知識點。臥槽寫完這篇題解之後,突然發現多校09題解給的方法不就是維護一顆動態虛樹嘛!只不過說虛樹是動態的,你需要將點插入虛樹中,就要動態維護這個樹的權值。事實上虛樹就是通過重新建樹,使得樹上的 無用決策點 全部去掉 當然相關資訊必須...

Bzoj3924 Fjoi2015幻想鄉戰略遊戲

傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有n塊空地,這些空地被...

bzoj 5329 Sdoi2018 戰略遊戲

n個點m條邊,每次給出乙個點集,可以刪掉乙個非點集中的點,問有多少刪法使得存在兩個點集中的點不連通。建出圓方樹的虛樹,顯然刪去上面的圓點是合法的。直接搞就好了。code include include include include include include using namespace s...