BZOJ1829 : [Usaco2010 Mar]starc星际争霸

设出$x,y,z$三个未知量分别表示三种单位的战斗力。

那么各种不等式都可以表示成$ax+by+cz\geq 0$的形式。

注意到$z>0$,那么两边都除以$z$得到$ax+by+c\geq 0$。

然后半平面交求出所有顶点后,对于每次询问将所有顶点带入求值即可。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=400;
const double eps=1e-10;
struct P{
  double x,y;
  P(){x=y=0;}
  P(double _x,double _y){x=_x,y=_y;}
  P operator-(const P&a)const{return P(x-a.x,y-a.y);}
  P operator+(const P&a)const{return P(x+a.x,y+a.y);}
  P operator*(double a)const{return P(x*a,y*a);}
}p[N],a[N];
struct L{
  P p,v;double a;
  L(){}
  L(P _p,P _v){p=_p,v=_v;}
  bool operator<(const L&b)const{return a<b.a;}
  void cal(){a=atan2(v.y,v.x);}
}line[N],q[N];
int n,m,cl,h,t;
inline double cross(const P&a,const P&b){return a.x*b.y-a.y*b.x;}
//新的半平面,在这条向量a->b的逆时针方向
inline void newL(const P&a,const P&b){line[++cl]=L(a,b-a);}
inline bool left(const P&p,const L&l){return cross(l.v,p-l.p)>0;}
inline P pos(const L&a,const L&b){
  P x=a.p-b.p;double t=cross(b.v,x)/cross(a.v,b.v);
  return a.p+a.v*t;
}
inline void halfplane(){
  for(int i=1;i<=cl;i++)line[i].cal();
  sort(line+1,line+cl+1);
  h=t=1;
  q[1]=line[1];
  for(int i=2;i<=cl;i++){
    while(h<t&&!left(p[t-1],line[i]))t--;
    while(h<t&&!left(p[h],line[i]))h++;
    if(fabs(cross(q[t].v,line[i].v))<eps)q[t]=left(q[t].p,line[i])?q[t]:line[i];else q[++t]=line[i];
    if(h<t)p[t-1]=pos(q[t],q[t-1]);
  }
  while(h<t&&!left(p[t-1],q[h]))t--;
  p[t]=pos(q[t],q[h]);
}
int main(){
  newL(P(0,0),P(100,1));
  newL(P(100,0),P(100,100));
  newL(P(1,100),P(0,0));
  newL(P(100,100),P(0,100));
  newL(P(0.01,100),P(0.01,0));
  newL(P(0,0.01),P(100,0.01));
  scanf("%d%d",&n,&m);
  while(n--){
    char ch[5];int a,b,c,d,e,f;
    scanf("%s",ch);
    if(ch[0]==‘J‘)scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
    else scanf("%d%d%d%d%d%d",&d,&e,&f,&a,&b,&c);
    a-=d,b-=e,c-=f;
    if(!a&&!b)continue;
    if(b){
      P A=P(0,-1.0*c/b),B=P(100,(-100.0*a-c)/b),C=A;C.y+=1;
      if(C.x*a+C.y*b+c>0)newL(A,B);else newL(B,A);
    }else{
      P A=P(-1.0*c/a,0),B=P(-1.0*c/a,100),C=A;C.x-=1;
      if(C.x*a+C.y*b+c>0)newL(A,B);else newL(B,A);
    }
  }
  halfplane();
  while(m--){
    int a,b,c,d,e,f;
    scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
    a-=d,b-=e,c-=f;
    int flag=0;
    for(int i=h;i<=t;i++){
      double tmp=p[i].x*a+p[i].y*b+c;
      if(tmp>-eps)flag|=1;
      if(tmp<eps)flag|=2;
    }
    if(flag==1)puts("J");
    else if(flag==2)puts("B");
    else puts("U");
  }
  return 0;
}

  

时间: 2024-10-13 03:04:47

BZOJ1829 : [Usaco2010 Mar]starc星际争霸的相关文章

FZU 2219 StarCraft(星际争霸)

Description 题目描述 ZB loves playing StarCraft and he likes Zerg most! One day, when ZB was playing SC2, he came up with an idea: He wants to change the queen's ability, the queen's new ability is to choose a worker at any time, and turn it into an egg,

星际争霸

时间限制: 2 Sec  内存限制: 32 MB提交: 48  解决: 12 题目描述 玩星际争霸时,我们常常会不顾一切地大肆建造军队以扩充自己的战斗力.当我们快速建造军队时,我们总想知道这支部队的战斗力,以便设计好战略.你的任务是设计出一个能够快速回答一支部队的战斗力强弱的程序,部队的战斗力就是部队的人数. C num,往编号为num的部队里加一个兵,如果当前还没有编号为num的部队,则建立这支部队并添加一个兵: D num,代表编号为num的部队里一个兵牺牲了,如果此时部队里没有兵了,则删掉

【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会

1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 793  Solved: 354[Submit][Status][Discuss] Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个

解决星际争霸1直播时黑屏的方法

在斗鱼直播时,不管是使用“选择游戏”还是“窗口截取”,在直播星际争霸1的时候,一直是黑屏.开始以为是星际版本的问题,毕竟这么老的游戏了,但测试了1.08,1.13,1.16后,都是如此,应该不是版本的问题.也测试用OBS软件来直播,发现问题依旧.既然斗鱼上有这么多人在直播星际争霸1,应该是有方法,只是我还没有找到而以.网上各种搜索,最后发现有人说需要安装一个虚拟摄像头.测试之后果然可以.具体步骤如下: 1.下载UScreenCapture软件,文章后面有下载地址. 2.按照软件安装说明安装好US

BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会( dp + dfs )

选取任意一个点为root , size[ x ] 表示以 x 为根的子树的奶牛数 , dp一次计算出size[ ] && 选 root 为集会地点的不方便程度 . 考虑集会地点由 x 点向它的子节点 son 转移 , 那么以 son 为集会地点比以 x 为集会地点要多 dist( x , son ) * ( tot - size[ x ] ) - dist( x , son ) * size[ x ] = dist( x , son ) * ( tot - 2 * size[ x ] )

3. 星际争霸之php设计模式--简单工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!============================================================================== 上次用星际争霸讨论了面向对象的基础知识

星际争霸之php面向对象(一)

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!============================================================================== 前言 面向对象博大精深,对于从未接触过

《星际争霸》拍“肥皂剧”(人民邮电报专栏《乐游记》之25)

创造电子竞技的姻缘石竟然是亚洲金融危机,韩国人为了电视台有收视率,开播星际争霸肥皂剧,这些历史你都知道吗? 文/张书乐 刊载于9月1日<人民邮电报>应用版乐游记专栏 有关电子竞技的起源,有个得到公认但略显"奇葩"的说法,1997年前后,亚洲金融危机让我们知道了"金融大鳄"索罗斯把很多个国家耍得团团转,甚至让亚洲"四小龙"神话破灭,但我们却不知道,正是这次危机,让电子竞技横空出世.看似风马牛不相及,但有个很关键的名字把它们联系在了一起,

星际争霸之php面向对象(二)

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!============================================================================== 五.访问控制 如果用$attackNu