TC SRM 655 Div1 Level 3 题解

题目传送门

dp+几何

首先可以发现凸包是顺时针排列的一些线段构成的。我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] r[i]\rightarrow r[j] r[i]→r[j],(箭头表示在凸包上的方向)的内测。

然后蓝点就没有用了。

然后再回想一下凸包的定义:所有点连接起来都是外凸的,且可以框住所有的点。

然后我们像构建凸包那样来dp。

首先钦定最下面,最靠左的点。然后将其它的极角排序。 d p i , j dp_{i,j} dpi,j​表示当前凸包上的线段为 r [ i ] − > r [ j ] r[i]->r[j] r[i]−>r[j]的概率。

注意:需要判断凸包的凸性!

/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
struct vec{int x,y;vec (mp A){x=A.FIR;y=A.SEC;}vec (int A,int B){x=A,y=B;}vec (){}bool operator * (vec oth){//返回叉乘结果是否>=0 return 1ll*x*oth.y>=1ll*y*oth.x;}vec operator - (vec oth){return vec (x-oth.x,y-oth.y);}vec operator + (vec oth){return vec(x+oth.x,y+oth.y);}
};
bool cmp(vec A,vec B){if(A.y!=B.y){return A.y<B.y;}return A.x<B.x;
}
bool cmp_angle(vec A,vec B){//极角排序 return (B-A)*(vec(0,0)-A);
}
bool ok[120][120];
bool ok2[120][120];
double pro[120][120];
double dp[120][120];
map<mp,int> id;
class BichromeSky{public:double totallyCovered(vector<int> rx,vector<int> ry,vector<int> P,vector<int> bx,vector<int> by){vector<vec> r,b;int n=rx.size();vector<double> p(n);rep(i,n){p[i]=P[i]/1000.0;}rep(i,n){r.PB(vec(II(rx[i],ry[i])));id[II(rx[i],ry[i])]=i;}rep(i,bx.size())b.PB(vec(II(bx[i],by[i])));sort(ALL(r),cmp);sort(ALL(b),cmp);rep(i,n) rep(j,n){if(j==i) continue;int idi,idj;idi=id[II(r[i].x,r[i].y)];idj=id[II(r[j].x,r[j].y)];ok[idi][idj]=true;rep(k,b.size()){ok[idi][idj]&=(r[i]-b[k])*(r[j]-b[k]);}}double rest=0;double pp=1.0;rep(i,n){if(n-i<2) break;deque<vec> oth;for(int j=i+1;j<n;++j) oth.PB(r[j]-r[i]);sort(ALL(oth),cmp_angle);oth.push_front(vec(II(0,0)));oth.PB(vec(II(0,0)));int sz=oth.size();vector<double> thisp(sz);rep(j,sz){vec now=oth[j]+r[i];int idd=id[II(now.x,now.y)];thisp[j]=p[idd];}rep(j,sz)for(int k=j+1;k<sz;++k){dp[j][k]=0.0;pro[j][k]=1.0;int idj,idk;vec jv,kv;jv=oth[j]+r[i];kv=oth[k]+r[i];idj=id[II(jv.x,jv.y)];idk=id[II(kv.x,kv.y)];ok2[j][k]=ok[idj][idk];for(int l=j+1;l<k;++l){if(!((oth[j]-oth[l])*(oth[k]-oth[l]))){pro[j][k]*=1.0-thisp[l];      }}}double tmp=0.0;for(int j=1;j+1<sz;++j){if(ok2[0][j])dp[0][j]=thisp[j]*pro[0][j];    }rep(j,sz)for(int k=j+1;k<sz;++k){for(int l=k+1;l<sz;++l){if(ok2[k][l]&&(oth[l]-oth[k])*(oth[j]-oth[k])){                         dp[k][l]+=dp[j][k]*thisp[l]*pro[k][l]; } }}rep(j,sz){if(ok2[j][sz-1])tmp+=dp[j][sz-1];}tmp*=pp;rest+=tmp;pp*=(1.0-thisp[0]);}return rest;}
};

TC SRM 655 Div1 Level 3 题解相关推荐

  1. 【TC SRM 312 Div1 Level3】CheapestIsland(轮廓线DP)(最小表示法)

    传送门 随便抓了一道题来复习轮廓线DP. 听说和[JLOI2009 神秘的生物]本质上是一样的,没看,不清楚. 题解: 给一个棋盘图,每个格子有权值,求权值之和最小的连通块. 没什么难度,熟悉轮廓线的 ...

  2. [TC SRM 685 div1 lev1] MultiplicationTable2

    转载: https://www.linkedin.com/pulse/topcoder-685-multiplicationtable2-yingwu-zhu Note: 生成封闭集合方式. Prob ...

  3. Topcoder SRM 655 DIV1 250 CountryGroupHard

    题意:不同国家的人站在一起,同一个国家的人相邻站,给你一个数组,表示 这个位置属于的国家有几个人,0可以是任何数字,问你能不能确定这个数组(只有一个解) 解题思路:搜索 解题代码: 1 // BEGI ...

  4. SRM 583 DIV1

    A 裸最短路. 1 class TravelOnMars { 2 public: 3 int minTimes(vector <int>, int, int); 4 }; 5 vector ...

  5. PAT (Advanced Level) Practice 题解代码 - II (1051-1100)

    PAT PAT (Advanced Level) Practice - II(1051-1100) -------------------------------------------------- ...

  6. TC(SRM)和CF入门教程for ACMer[转载]

    一.TC基本介绍TC的网址www.topcoder.com/tc,我们一般提到TC的时候是特指其中的Single Round Match(SRM).SRM的规则总结起来就是一句话:75分钟做完3道难度 ...

  7. TC(SRM)和CF入门教程for ACMer

    一.TC基本介绍 TC的网址www.topcoder.com/tc,我们一般提到TC的时候是特指其中的Single Round Match(SRM). SRM的规则总结起来就是一句话:75分钟做完3道 ...

  8. TC SRM 573

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 又来水一发.... 结果:过了250,challe ...

  9. SRM 591 div1 275

     topcoder被Appirio收购了 好久没做tc,这个题目挺简单.就是Arena里面看不到图片,只能去tc网站上找题目.http://community.topcoder.com/stat?c= ...

最新文章

  1. Python—自动化部署工具:Fabric
  2. 网页插件学javascript还是jquery好啊?
  3. 炸了!刚刚数学家获得了2020年诺贝尔物理学奖!没想到诺奖也能蝉联.......
  4. 中职计算机英语c答案,中职高考计算机试题及答案-20210622105004.docx-原创力文档...
  5. MySQL Shell副本集和MGR快速搭建详解
  6. otn系统中常用的电层_WDM与OTN浅谈
  7. puTTY、xshell链接Linux
  8. sql server 2005安装需求
  9. git删除远程库文件
  10. R语言数据接口(下载、读取、写入)
  11. 微信小程序图片上传uploadfile失败
  12. Linux网卡驱动发送超时看门狗,如何在linux嵌入式中更改看门狗定时器
  13. K-Means聚类算法原理及实现
  14. 如何实现罗克韦尔PLC的模拟量采集和远程上下载?
  15. Matlab基本函数-ceil函数
  16. kernel: kmalloc
  17. DameWare各种版本激活码-备份
  18. resip学习笔记之句柄Handle
  19. 个体功能网络分区的分割方法
  20. [面试]之:金山内推电话面试二面

热门文章

  1. c++ 海康工业相机回调方式抓图片
  2. QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞
  3. 《Adobe Audition CS6中文版经典教程》——导读
  4. 详解python框架django为例,还没开始写代码前的花式坑——解决办法和排错思路。pycharm解释器配置,虚拟环境venv配置,使用命令行。
  5. 用户第一 体验为王 Irontech Doll创始人Leonard的性趣生意之道
  6. 51单片机“密码锁”代码详解
  7. 电脑长时间不关机 会对电脑有伤害么???
  8. FFmpeg从入门到牛掰(二):转封装(remux)讲解
  9. 【专访】《妖怪宝可萌》H5游戏制作人朱顗:玩得轻松开心,留存就好。
  10. 【React】【Antd】警告报错:Warning: Function components cannot be given refs. Attempts to access this ref wil