bzoj:3616: War

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

建完k-d树直接查找记得打标记就好了。

然而某邻接表写炸,RE了两发,最后#8还是不错的

从网上拷来3份标程(CA,Claris,鸟神),加上自己的AC代码共4份,随机造数据居然能出现4个不同的答案……(CA爷的代码最不和群

#include<cmath>
#include<bitset>
#include<cstdio>
#include<vector>
#include<algorithm>
#define ii inline int
#define MN 36000
#define MM 5000000
using namespace std;

int n,m,f,ro=0,num=0,xx,X,o,la=0,NO,l[MN+1],k;
double MMH=0;
char cs;
ii read(){
    cs=getchar();xx=0;f=1;
    while(cs<‘0‘||cs>‘9‘) {if (cs==‘-‘) f=-1;cs=getchar();}
    while(cs>=‘0‘&&cs<=‘9‘) xx=xx*10+cs-48,cs=getchar();
    return xx*f;
}
struct tr{
    int x,y,r,a;
    friend bool operator<(tr a,tr b){if (X) return a.y<b.y;else return a.x<b.x;}
    friend bool operator ==(tr a,tr b){return (a.x==b.x)&&(a.y==b.y);}
}a[MN+1],aw;
struct tree{
    int xa,xi,ya,yi,l,r;
}t[MN+1];
struct na{
    int y,ne;
}b[MM];
inline void in(int x,int y){
    b[++num].y=y;b[num].ne=l[x];l[x]=num;
}
bitset<MN+1> G[MN+1];
vector <int> V[MN+1];
ii S(int x){return x*x;}
ii A(int a,int b){return a>b?a:b;}
ii I(int a,int b){return a<b?a:b;}
ii B(int a){return a<0?-a:a;}
ii build(int l,int r,int now){
    X=now;
    int mid=(l+r)>>1;
    nth_element(a+l,a+mid,a+r+1);
    t[mid].xa=t[mid].xi=a[mid].x;
    t[mid].ya=t[mid].yi=a[mid].y;
    t[mid].l=t[mid].r=0;
    if (l<mid) t[mid].l=build(l,mid-1,now^1),
    t[mid].xa=A(t[t[mid].l].xa,t[mid].xa),
    t[mid].xi=I(t[t[mid].l].xi,t[mid].xi),
    t[mid].ya=A(t[t[mid].l].ya,t[mid].ya),
    t[mid].yi=I(t[t[mid].l].yi,t[mid].yi);
    if (mid<r) t[mid].r=build(mid+1,r,now^1),
    t[mid].xa=A(t[t[mid].r].xa,t[mid].xa),
    t[mid].xi=I(t[t[mid].r].xi,t[mid].xi),
    t[mid].ya=A(t[t[mid].r].ya,t[mid].ya),
    t[mid].yi=I(t[t[mid].r].yi,t[mid].yi);
    return mid;
}
ii gnm(int j){return A(a[NO].x-t[j].xa,0)+A(t[j].xi-a[NO].x,0)+A(a[NO].y-t[j].ya,0)+A(t[j].yi-a[NO].y,0);}
ii gnq(int j){return S(A(a[NO].x-t[j].xa,0)+A(t[j].xi-a[NO].x,0))+S(A(a[NO].y-t[j].ya,0)+A(t[j].yi-a[NO].y,0));}
ii gmm(int j){return A(B(a[NO].x-t[j].xa),B(a[NO].x-t[j].xi))+A(B(a[NO].y-t[j].yi),B(a[NO].y-t[j].ya));}
ii gmq(int j){return S(A(B(a[NO].x-t[j].xa),B(a[NO].x-t[j].xi)))+S(A(B(a[NO].y-t[j].yi),B(a[NO].y-t[j].ya)));}
ii in(int x){
    if (gmq(x)<=a[NO].r) return 1;
    if (gmm(x)<=a[NO].a) return 1;
    if (gnq(x)<=a[NO].r) return 2;
    if (gnm(x)<=a[NO].a) return 2;
    return 0;
}
ii ju(int x){
    if (S(a[x].x-a[NO].x)+S(a[x].y-a[NO].y)<=a[NO].r) return 1;
    if (B(a[x].x-a[NO].x)+B(a[x].y-a[NO].y)<=a[NO].a) return 1;
    return 0;
}
ii que(int p){
    int u=in(p);
    if (u)
    if (u==1) G[p][NO]=1;else{
        if (ju(p)) in(p,NO);
        if (t[p].l) que(t[p].l);
        if (t[p].r) que(t[p].r);
    }
}
inline void dw(int p){
    if (t[p].l) G[t[p].l]|=G[p],dw(t[p].l);
    if (t[p].r) G[t[p].r]|=G[p],dw(t[p].r);
    for (register int i=l[p];i;i=b[i].ne) G[p][b[i].y]=1;
}
int main(){
    register int i,j;
    n=read();m=read();k=read();
    for (i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].r=S(read()),a[i].a=read(),V[read()].push_back(i);
    ro=build(1,n,0);
    for (NO=1;NO<=n;NO++) que(ro);
    dw(ro);
    for (i=1;i<=k;i++){
        G[0]=0;
        for (j=0;j<V[i].size();j++) G[0]|=G[V[i][j]];
        for (j=0;j<V[i].size();j++) G[0][V[i][j]]=0;
        MMH+=pow(1.0-(1.0*G[0].count()/n),m);
    }
    printf("%.6lf\n",MMH);
}

200724 kb 8588 ms C++/Edit 3446 B

时间: 2024-08-04 06:38:21

bzoj:3616: War的相关文章

【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Length 695765 Eolv 1000 Accepted 804 kb 0 ms 118 B 739478 Eolv 2463 Accepted 804 kb 0 ms 134 B 696662 Eolv 1968 Accepted 1272 kb 48 ms 137 B 739546 Eolv

【BZOJ】【1863】【ZJOI2006】trouble 皇帝的烦恼

二分+DP Orz KuribohG 神题啊= = 满足单调性是比较显然的…… 然而蒟蒻并不会判断能否满足……QwQ 神一样的DP姿势:f[i]表示第 i 个与第1个最多有多少个相同,g[i]表示最少.那么如果g[n]==0就表示满足 1 /************************************************************** 2 Problem: 1863 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6

【BZOJ】【1067】 【SCOI2007】降雨量

思路题 玛雅,这分类讨论快讨论地疯了…… 从huzecong神的题解那里得到的灵感…… 首先考虑最好确定的情况:为true的时候,此时必须同时满足 1.x和y这两年的降雨量已知,且rain[x]<=rain[y] 2.中间每一年的降雨量都已知,且降雨量的最大值小于rain[x] 然后我们可以考虑一下为false的情况:(这两个条件满足其一即可) 1.x和y这两年的降雨量已知,且rain[x]>rain[y] 2.x和y这两年的降雨量只知其中之一,且中间这些年(已知的部分)最大的降雨量大于这个已

【BZOJ】【1640】【USACO2007 Nov】/【1692】【USACO2007 Dec】队列变换

后缀数组/贪心 每次从等待序列的头或尾拿出一个放到答案序列的末尾,那么每次贪心比较头和尾的字典序大小即可…… TAT贪心很好想,但是我一开始没想到是可以直接比较字符串大小……而是一位一位判的,WA了…… 膜拜了zyf的做法TAT 1 /************************************************************** 2 Problem: 1692 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Ti

【BZOJ】【1011】【HNOI2008】遥远的行星

神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信半疑,直到后来发现真的很有效果. 就是小于2000的,我们n^2爆搞一下,大于两千的,由于α很小,i又大于2000,所以i-i×α挺大的,准确的说1/(i-1)与1/(i-i×α)差不多大…… 那么对于大于2000的i,假如他能弄到k,我们只要把公式中的i-j都变成i-k/2就可以了,误差不会很大.

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

weblogic部署war

[HTTP:101216]Servlet: "DispatcherServlet" failed to preload on startup in Web application: "Ldzc.war". org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.neusoft.biz.Impl.BookBizImpl] for bean with n

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比