【BZOJ3616】War

原创 2016年04月24日 08:45:40

Description

小x所在的世界正在经历一场在k个阵营之间的战争。每个阵营有若干个炮塔,每个炮塔由攻击系统和防御系统组成。第i个炮塔可以攻击到离它欧几里德距离小于等于ri 或者曼哈顿距离小于等于ai的炮塔,被攻击到的炮塔防御系统就会崩溃,同一联盟的炮塔不会被攻击到。每次会随机选择一个炮塔攻击它能打到的所有炮塔,问进行m轮后期望剩下多少个阵营,使得这些阵营拥有的炮塔的防御系统全部完好。防御系统崩溃的炮塔还是会被打到的。值得注意的是,如果一个联盟没有任何炮塔,那么不管怎样它都是完好的。
Input

  输入文件第一行有三个整数n、m、k,分别表示炮塔数目、攻击轮数以及联盟个数。 接下去n行每行有五个正整数xi、yi、ri、ai、pi,其中xi、yi表示炮塔坐标,p表示炮塔所属于阵营。
Output

  输出一行一个实数表示答案,你的输出与标准输出的误差在1e-3以内会被认为是正确的。
Sample Input

2 2 3

0 0 2 2 1

1 1 2 2 2

Sample Output

1.500

HINT

  100%的数据, 0 <= n、m、k <= 35000,1 <= pi <= k,其余所有数字均非负且小于10000,保证在数据生成时不考虑一个点的具体位置,而将它的横纵坐标分开考虑。

Source

2014年国家集训队十五人互测 鸣谢佚名上传

考虑使用bitset,在kdtree的每个节点维护一个,然后连边,
然后发现其实概率论才是这个题考察的主要内容(雾
注意bitset不能写结构体里面..因为每个bitset都是35000的,然后如果一坨放一起做swap…场面太美,直接TLE

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#define MAXN 35002
#define Dnum 2
#define GET (ch>='0'&&ch<='9')
using namespace std;
inline void in(int &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
double ans;
int N,M,K,n,root,top,tp;
int r[MAXN],a[MAXN],p[MAXN],id[MAXN];
bool cmp_d;
struct edge {   int to; edge *next; }e[10000000],*prev[MAXN],E[MAXN<<1],*Prev[MAXN];
inline void insert(int u,int v) {   e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];  }
inline void insert1(int u,int v)    {   E[++tp].to=v;e[tp].next=Prev[u];Prev[u]=&E[tp]; }
struct KDtree
{
    int d[Dnum],ch[2],minn[Dnum],maxn[Dnum],fa;
    inline void init()  {   for (int i=0;i<Dnum;++i)    minn[i]=maxn[i]=d[i];   }
    inline bool operator < (const KDtree& a)const   {   return d[cmp_d]<a.d[cmp_d]; }
}tree[MAXN];
bitset<MAXN> P[MAXN];
inline void push_up(int rt)
{
    for (int i=0;i<2;++i)
        if (tree[rt].ch[i])
        {
            int x=tree[rt].ch[i];
            for (int j=0;j<Dnum;++j)
                tree[rt].minn[j]=min(tree[rt].minn[j],tree[x].minn[j]),
                tree[rt].maxn[j]=max(tree[rt].maxn[j],tree[x].maxn[j]);
        }
}
int rebuild(int l=1,int r=n,bool d=0,int f=0)
{
    cmp_d=d;int mid=(l+r)>>1;nth_element(tree+l,tree+mid,tree+r+1);
    id[tree[mid].fa]=mid;tree[mid].fa=f;tree[mid].init();
    if (l!=mid) tree[mid].ch[0]=rebuild(l,mid-1,d^1,mid);
    if (r!=mid) tree[mid].ch[1]=rebuild(mid+1,r,d^1,mid);
    return push_up(mid),mid;
}
inline int sqr(int x)   {   return x*x; }
void calc(int rt,int id,int x,int y)
{
    if (sqr(max(max(x-tree[rt].maxn[0],tree[rt].minn[0]-x),0))+sqr(max(max(y-tree[rt].maxn[1],tree[rt].minn[1]-y),0))>r[id]
        &&
        max(tree[rt].minn[0]-x,0)+max(x-tree[rt].maxn[0],0)+max(tree[rt].minn[1]-y,0)+max(y-tree[rt].maxn[1],0)>a[id])  return;
    if (max(sqr(x-tree[rt].minn[0]),sqr(x-tree[rt].maxn[0]))+max(sqr(y-tree[x].minn[1]),sqr(y-tree[x].maxn[1]))<=r[id]
        ||
        max(abs(x-tree[rt].maxn[0]),abs(tree[x].minn[0]-x))+max(abs(y-tree[x].maxn[1]),abs(tree[x].maxn[1]-y))<=a[id])
        {   P[rt][id]=1;return; }
    for (int i=0;i<2;++i)   if (tree[rt].ch[i]) calc(tree[rt].ch[i],id,x,y);    
}
void solve(int rt=root)
{
    for (int i=0,x=0;i<2;++i)   if ((x=tree[rt].ch[i])) P[x]|=P[rt],solve(x);
    for (edge *i=prev[rt];i;i=i->next)  P[rt][i->to]=1;
}
int main()
{
    in(N);in(M);in(K);n=N;int x;
    for (int i=1;i<=N;i++)
    {
        tree[i].fa=i;in(tree[i].d[0]);in(tree[i].d[1]);
        in(r[i]);in(a[i]);in(p[i]);
        insert1(p[i],i);
    }
    root=rebuild();
    for (int i=1;i<=N;i++)  calc(root,i,tree[id[i]].d[0],tree[id[i]].d[1]);
    for (solve(),x=1;x<=K;x++)
    {
        bitset<MAXN> tmp=0;
        for (edge *i=Prev[x];i;i=i->next)   tmp|=P[i->to];
        for (edge *i=Prev[x];i;i=i->next)   tmp[i->to]=0;
        int cnt=tmp.count();ans+=pow(1-1.0*cnt/N,M);
    }
    printf("%.6f\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【BZOJ】3616: War【KD树】

传送门:【BZOJ】3616: War【KD树】分析:建好树,对于每个塔,对他能打到的点打标记,这个用KD树+bitset打标记即可。所有标记打完后把标记下传,这样可以得到每个点在每一轮会被哪些塔打到...
  • u013368721
  • u013368721
  • 2015年11月10日 14:40
  • 833

gradle的war插件

war可以开发的应用打包成部署包.最常的打包方法: a.将开发的源目录src/main/java的文件打包成一个jar包,然后放入WEB-INF/lib目录下面. b.不要将配置文件打包到jar里...
  • xiejx618
  • xiejx618
  • 2014年07月30日 21:34
  • 10196

maven打造可执行war包(超详细)

在开发java Web时,有时我们会使用嵌入式jetty来运行,项目完成后,如果能够直接运行war包从而启动jetty来运行war包那就非常完美了,本文将讲解如何在maven项目中整合jetty 9,...
  • u013668852
  • u013668852
  • 2017年04月07日 15:39
  • 3736

jar包和war包的介绍和区别

JavaSE程序可以打包成Jar包(J其实可以理解为Java了),而JavaWeb程序可以打包成war包(w其实可以理解为Web了)。然后把war发布到Tomcat的webapps目录下,Tomcat...
  • u012110719
  • u012110719
  • 2015年03月14日 16:06
  • 42076

IDEA将web项目打成war包

非Maven项目打包方式 按ctrl+滚动鼠标滚轮就能放大浏览器看图片了。或者将图片拖到新窗口打开。 然后点击OK,然后build一下。然后去classes文件夹下面找就能找到打成war包...
  • u013632755
  • u013632755
  • 2016年02月24日 10:37
  • 39361

Eclipse如何将项目打成war吧

问题出现: 基于spring-Tool_Suite的项目要部署在docker上,需要将在spl 上的spring boot 项目打成war包。什么是war包? 答案链接: http://zhi...
  • u010714901
  • u010714901
  • 2016年05月27日 19:00
  • 1303

IDEA将web项目打成war包

非Maven项目打包方式       按ctrl+滚动鼠标滚轮就能放大浏览器看图片了。或者将图片拖到新窗口打开。  然后点击OK,然后build一下。然后去classes文件夹下面找就能...
  • lijinzhou2017
  • lijinzhou2017
  • 2017年06月05日 15:54
  • 1648

如何发布一个war网站

一,首先将工程打包,打成war包,点击右键,选择export          因为打包成war包之后,eclipse会将你的工程所需的所有文件,打包为war文件,如果你自己去拷贝的话,...
  • shinoey
  • shinoey
  • 2016年12月14日 16:23
  • 1187

Tomcat部署时war和war exploded区别以及平时踩得坑

war和war exploded的区别在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况:是选择war还是war exploded 这里首先看一下他们两个的区别:war模式:将W...
  • u010870518
  • u010870518
  • 2017年02月23日 10:11
  • 25580

maven 打jar包和war包

1.使用maven打jar包 1.1 打jar很简单的,只需要在pom.xml里面加一段插件代码即可 org.apache.maven.plugins m...
  • zy_281870667
  • zy_281870667
  • 2016年01月21日 15:43
  • 1811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ3616】War
举报原因:
原因补充:

(最多只允许输入30个字)