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...