bzoj 1822: [JSOI2010]Frozen Nova 冷凍波 題解

來源:互聯網
上載者:User

標籤:題解   bzoj   網路流   二分答案   計算幾何   

【原題】

1822: [JSOI2010]Frozen Nova 冷凍波Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 796  Solved: 218
[Submit][Status]DescriptionWJJ喜歡“魔獸爭霸”這個遊戲。在遊戲中,巫妖是一種強大的英雄,它的技能Frozen Nova每次可以殺死一個小精靈。我們認為,巫妖和小精靈都可以看成是平面上的點。 當巫妖和小精靈之間的直線距離不超過R,且巫妖看到小精靈的視線沒有被樹木阻擋(也就是說,巫妖和小精靈的連線與任何樹木都沒有公用點)的話,巫妖就可以瞬間殺滅一個小精靈。 在森林裡有N個巫妖,每個巫妖釋放Frozen Nova之後,都需要等待一段時間,才能再次施放。不同的巫妖有不同的等待時間和施法範圍,但相同的是,每次施放都可以殺死一個小精靈。 現在巫妖的頭目想知道,若從0時刻開始計算,至少需要花費多少時間,可以殺死所有的小精靈?Input輸入檔案第一行包含三個整數N、M、K(N,M,K<=200),分別代表巫妖的數量、小精靈的數量和樹木的數量。 接下來N行,每行包含四個整數x, y, r, t,分別代表了每個巫妖的座標、攻擊範圍和施法間隔(單位為秒)。 再接下來M行,每行兩個整數x, y,分別代表了每個小精靈的座標。 再接下來K行,每行三個整數x, y, r,分別代表了每個樹木的座標。 輸入資料中所有座標範圍絕對值不超過10000,半徑和施法間隔不超過20000。Output輸出一行,為消滅所有小精靈的最短時間(以秒計算)。如果永遠無法消滅所有的小精靈,則輸出-1。Sample Input2 3 1
-100 0 100 3
100 0 100 5
-100 -10
100 10
110 11
5 5 10
Sample Output5HINT

Source

JSOI2010第二輪Contest1


【分析】最近刷題有點順(基本不看題解了)。像這道題,只需二分枚舉答案再網路流驗證。然而這道題的痛點就是如何判斷某一“巫妖”到“精靈”是否能打到。實際上就是判斷一條直線是否能喝一個圓產生交點。

因為不會向量的運算,我還傻傻地用KX+B的解析式算。然後化成一元二次方程求判別式。然後WA了異常久,後來發現一直被精度卡著。比如圓和直線相切是可行的,然後我就判成有交點,就預設不可行了= =。

PS:除了向量外,還有一種計算方法,就是求圓心到直線的距離和r的關係。

【代碼】

#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define INF 2139062143#define N 405using namespace std;struct arr{int x,y,r,t;}kill[N],p[N],tree[N];struct Arr{int go,s,next;}a[N*N];int end[N],f[N],F[N][N],q[N*100];const long double eps=1e-6;int n,m,k,i,j,flag,w,error,ans,S,T,cnt;bool get_root(){  int x1=kill[i].x,y1=kill[i].y,x2=p[j].x,y2=p[j].y,a=tree[w].x,b=tree[w].y,r=tree[w].r;  long double K=(x1==x2)?1e30+0.0:((y1-y2)*1.0/(x1-x2)),B=y1-K*1.0*x1+0.0;  long double AA=1.0+1.0*K*K,BB=-2.0*a+2.0*K*(B-b),CC=1.0*a*a+1.0*(B-b)*(B-b)-1.0*r*r;  long double temp=BB*BB-4*AA*CC;  return (temp>0);  //long double aa=K,bb=-1.0,cc=B;  //long double dis=(aa*a+bb*b+cc)/sqrt(aa*aa+bb*bb);  //return (dis+eps<=r);}inline bool bfs(){  memset(f,-1,sizeof(f));  int h=0,t=1;q[1]=S;f[S]=1;  while (h<t)  {    int now=q[++h];if (now==T) return 1;    for (int i=end[now];i;i=a[i].next)    {      int go=a[i].go;      if (f[go]==-1&&a[i].s)        f[go]=f[now]+1,q[++t]=go;    }  }  return 0;}int dinic(int sta,int sum){  if (sta==T) return sum;  int os=sum;  for (int i=end[sta];i&&os;i=a[i].next)  {    int go=a[i].go;    if (f[go]==f[sta]+1&&a[i].s)    {      int Min=dinic(go,min(os,a[i].s));      a[i].s-=Min;a[i^1].s+=Min;os-=Min;    }  }  if (os==sum) f[sta]=-1;return sum-os;}inline void add(int u,int v,int w){  a[++cnt].go=v;a[cnt].s=w;a[cnt].next=end[u];end[u]=cnt;  a[++cnt].go=u;a[cnt].s=0;a[cnt].next=end[v];end[v]=cnt;}inline bool check(int Time){  memset(end,0,sizeof(end));  S=0;T=n+m+1;cnt=1;Time++;  for (int i=1;i<=n;i++) add(S,i,(Time+kill[i].t-1)/(kill[i].t));  for (int i=1;i<=m;i++) add(n+i,T,1);  for (int i=1;i<=n;i++)    for (int j=1;j<=m;j++)      if (F[i][j]) add(i,n+j,1);  int flow=0;  while (bfs()) flow+=dinic(S,INF);  if (flow<m) return 0;error=0;return 1;}int erfen(int l,int r){  if (l==r) return l;  int mid=(l+r)>>1;  if (check(mid)) return erfen(l,mid);  return erfen(mid+1,r);}inline int dis(arr a,arr b){  return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}int main(){  scanf("%d%d%d",&n,&m,&k);  for (i=1;i<=n;i++)    scanf("%d%d%d%d",&kill[i].x,&kill[i].y,&kill[i].r,&kill[i].t);  for (i=1;i<=m;i++)    scanf("%d%d",&p[i].x,&p[i].y);  for (i=1;i<=k;i++)    scanf("%d%d%d",&tree[i].x,&tree[i].y,&tree[i].r);  for (i=1;i<=n;i++)    for (j=1;j<=m;j++)    {      flag=1;      if (dis(kill[i],p[j])>kill[i].r*kill[i].r) continue;      for (w=1;w<=k&&flag;w++)        if (get_root()) flag=0;      F[i][j]=flag;    }  error=1;ans=erfen(-1,4000000);  if (error) ans=-1;printf("%d",ans);  return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.