SDOI2017 Round1 Day2 题解
T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底。
BZOJ4819 新生舞会
模板题,分数规划+二分图最大权匹配。
费用流跑得过,可以不用KM。
UPD:分数规划用迭代跑得飞快。
#include<bits/stdc++.h>
#define pb push_back
#define FOR(i,v)\
for(typeof(v.end())i=v.begin();i!=v.end();++i)
using namespace std;
typedef double flo;
const int inf=1e9;
const int N=205;
struct edge{
int v,c;
flo w;
}e[20400];
vector<int>h[N];
int l;
void ins(int u,int v,int c,flo w){
edge a={v,c,w};
h[u].pb(l);
e[l++]=a;
edge b={u,0,-w};
h[v].pb(l);
e[l++]=b;
}
flo d[N];
int s1,s2,q[N*N],vis[N],p[N];
int n,a[N][N],b[N][N];
flo sol(flo c){
for(int i=s2;~i;--i)
h[i].clear();
l=0;
for(int i=1;i<=n;++i){
ins(s1,i,1,0);
ins(i+n,s2,1,0);
for(int j=1;j<=n;++j)
ins(i,j+n,1,a[i][j]-c*b[i][j]);
}
while(1){
fill(d,d+s2+1,-inf);
d[q[0]=s1]=0;
for(int a=0,b=0;a<=b;++a){
int u=q[a];
vis[u]=0;
FOR(i,h[u])
if(d[u]+e[*i].w>d[e[*i].v]&&e[*i].c){
d[e[*i].v]=d[u]+e[*i].w;
p[e[*i].v]=*i;
if(!vis[e[*i].v]++)
q[++b]=e[*i].v;
}
}
if(d[s2]==-inf)
break;
int f=inf;
for(int i=s2;i!=s1;i=e[p[i]^1].v)
f=min(f,e[p[i]].c);
for(int i=s2;i!=s1;i=e[p[i]^1].v){
e[p[i]].c-=f;
e[p[i]^1].c+=f;
}
}
flo p=0,q=0;
for(int u=1;u<=n;++u)
FOR(i,h[u])
if(!e[*i].c){
p+=a[u][e[*i].v-n];
q+=b[u][e[*i].v-n];
}
return p/q;
}
int main(){
scanf("%d",&n);
s2=n*2+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",a[i]+j);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",b[i]+j);
flo l=1;
while(1){
flo j=sol(l);
if(fabs(j-l)<1e-8)
return!printf("%.6f\n",j);
l=j;
}
}
BZOJ4820 硬币游戏
设$f_i$为经过$i$的次数的期望。把所有非终止态记为一个状态$p$,考虑$p$加上一个人的串,可能直接到对应的终止态,也可能先到其他终止态(可能是自己),因此要减去其他终止态的贡献。比如终止态$x$、$y$的串分别为TTH、HTT,那么$p$+TTH可能是$y$+TH或$y$+H,因此$f_x=\frac18f_p-\frac34f_y$,因为$p$有$\frac18$的概率到$x$,其中到了$y$的话有$\frac34$的概率到$x$。可能先到其他终止态的情况也就是其他串的后缀匹配了当前串的前缀,可以用kmp计算。列出这些方程后高斯消元即可。
#include<bits/stdc++.h>
using std::swap;
typedef long double flo;
const int N=302;
int n,m,f[N];
char z[N][N];
flo c[N][N];
void piv(int i){
int j=i;
for(int k=i+1;k<=n;++k)
if(fabs(c[k][i])>fabs(c[j][i]))j=k;
for(int k=i;k<=n+1;++k)
swap(c[i][k],c[j][k]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%s",z[i]);
f[0]=-1;
for(int i=0;i<n;++i){
int j=0,k=-1;
while(j<m){
while(~k&&z[i][j]!=z[i][k])k=f[k];
f[++j]=++k;
}
for(int l=0;l<n;++l){
j=k=0;
while(j<m){
while(~k&&z[l][j]!=z[i][k])k=f[k];
++j,++k;
}
for(;k;k=f[k])
c[i][l]+=pow(.5l,m-k);
}
c[i][n]=-pow(.5l,m);
c[n][i]=1;
}
c[n][n+1]=1;
for(int i=0;i<=n;++i){
piv(i);
for(int j=n+1;j>=i;--j)
c[i][j]/=c[i][i];
for(int j=0;j<=n;++j)
if(i!=j)
for(int k=n+1;k>=i;--k)
c[j][k]-=c[j][i]*c[i][k];
}
for(int i=0;i<n;++i)
printf("%.10f\n",double(c[i][n+1]));
}
BZOJ4821 相关分析
简单线段树,维护$\sum x$、$\sum y$、$\sum xy$、$\sum x^2$以及两种标记。
#include<cstdio>
#define P (k<<1)
#define S (P^1)
typedef long double flo;
const int N=1e5+5;
flo cal1(flo n){return n*(n-1)/2;}
flo cal2(flo n){return n*(n-1)*(n*2-1)/6;}
struct vec{flo a,b,c,d;};
vec operator+(vec a,vec b){
vec c={
a.a+b.a,a.b+b.b,a.c+b.c,a.d+b.d
};
return c;
}
struct node{
int i,j,n;
vec s;
flo xd,yd,xc,yc;
bool d,c;
void upd1(flo x,flo y){
if(!d)
xd=x,yd=y,d=1;
else
xd+=x,yd+=y;
s.c+=y*s.a+x*s.b+n*x*y;
s.d+=x*s.a*2+n*x*x;
s.a+=n*x;
s.b+=n*y;
}
void upd2(flo x,flo y){
xc=x,yc=y,c=1,d=0;
flo a=x+i,b=y+i;
s.a=n*a+cal1(n);
s.b=n*b+cal1(n);
s.c=n*a*b+cal1(n)*(a+b)+cal2(n);
s.d=n*a*a+cal1(n)*a*2+cal2(n);
}
}a[N*4];
void down(int k){
if(a[k].c){
a[P].upd2(a[k].xc,a[k].yc);
a[S].upd2(a[k].xc,a[k].yc);
a[k].c=0;
}
if(a[k].d){
a[P].upd1(a[k].xd,a[k].yd);
a[S].upd1(a[k].xd,a[k].yd);
a[k].d=0;
}
}
void upd1(int k){
a[k].s=a[P].s+a[S].s;
}
void upd2(int k){
a[k].i=a[P].i;
a[k].j=a[S].j;
a[k].n=a[P].n+a[S].n;
upd1(k);
}
int f[N],g[N];
void pre(int i,int j,int k){
if(i==j){
flo x=f[i],y=g[i];
a[k]=(node){i,j,1,x,y,x*y,x*x};
}else{
pre(i,i+j>>1,P);
pre((i+j>>1)+1,j,S);
upd2(k);
}
}
void inc(flo x,flo y,int s,int t,int k){
if(s<=a[k].i&&a[k].j<=t)
a[k].upd1(x,y);
else{
down(k);
if(s<a[S].i)inc(x,y,s,t,P);
if(t>a[P].j)inc(x,y,s,t,S);
upd1(k);
}
}
void cov(flo x,flo y,int s,int t,int k){
if(s<=a[k].i&&a[k].j<=t)
a[k].upd2(x,y);
else{
down(k);
if(s<a[S].i)cov(x,y,s,t,P);
if(t>a[P].j)cov(x,y,s,t,S);
upd1(k);
}
}
vec ask(int s,int t,int k){
if(s==a[k].i&&a[k].j==t)
return a[k].s;
down(k);
return t<a[S].i?ask(s,t,P):s>a[P].j?ask(s,t,S):ask(s,a[P].j,P)+ask(a[S].i,t,S);
}
int main(){
int n,m,o,s,t,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",f+i);
for(int i=1;i<=n;++i)scanf("%d",g+i);
pre(1,n,1);
while(m--){
scanf("%d%d%d",&o,&s,&t);
if(o==1){
vec v=ask(s,t,1);
int n=t-s+1;
printf("%.10f\n",double((v.c-v.a*v.b/n)/(v.d-v.a*v.a/n)));
}else{
scanf("%d%d",&x,&y);
(o==2?inc:cov)(x,y,s,t,1);
}
}
}
SDOI2017 Round1 Day2 题解的更多相关文章
- SDOI2017 Round1 简要题解
我们 TM 怎么又要上文化课..我 哔哔哔哔哔哔 「SDOI2017」数字表格 题意 有 \(T\) 组数据,求 \[ \prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[ ...
- SDOI2017 Round1 Day1 题解
不知道有几个AK的,除了出题人SB搬了个BZOJ3779以外,应该没什么因素阻碍AK吧.要是SCOI考这套题多好. BZOJ4816 数字表格 SB反演,推出答案为$\prod_{i=1}^nf^{\ ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- SDOI2017 Round1
SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...
- SDOI2017 Round1 起点
第二次打酱油了 高一两次考试以打两瓶酱油告终 来的时候明知自己没戏,却总存有一丝希望 NOIP连200都没考到,是不是有点儿不自量力 如果我真的去争取那一丝希望的话,该有多好 先简单分析下考试 Day ...
- SDOI2017 Round2 详细题解
这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\ ...
- NOIP2013 DAY2题解
DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...
- 二模Day2题解
小明搬家 题目描述 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运过程效率太 ...
- 【NOIP2012】DAY1+DAY2题解
不贴代码的原因是我的代码在初中机房.忘记带过来了. DAY 1 T1随便搞,但是字符串相关的题我经常犯蠢 T2 一个结论题,OAO但是需要高精度写. 具体就是按左手的数除右手的数(还是怎么的来着)排个 ...
随机推荐
- iOS7系统中的坑——UITableViewCellScrollView
今天开完一系列例会后,终于迎来放假的时候了,本来中午就要下班走的,想着火车票现在还很早,也就不急着走,闲着无聊,想着之前要写的内容,索性写一篇聊以打发时光,也希望对其他人有所帮助吧. 现在iOS的最新 ...
- Node.js知识点学习
Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期 ...
- PADS的历史版本
1986年:PADS PCB,DOS操作系统 1989年:PADS Logic,DOS操作系统 1990年:PADS 2000,DOS操作系统 1993年:PADS Perform,DOS和Windo ...
- idea常用的快捷命令
main方法: psvm System.out.println(): sout
- Android数据自己主动更新库DataAutoRefresh
非常多android应用.比方音乐播放器.视频播放器.小说阅读器或者其他须要获取本地磁盘指定数据格式数据列表的应用,在磁盘数据有变化(新增或者删除.比方下载完毕,拔TF卡.换TF卡)时.须要自己主动更 ...
- UVA - 11827 - Maximum GCD,10200 - Prime Time (数学)
两个暴力题.. 题目传送:11827 Maximum GCD AC代码: #include <map> #include <set> #include <cmath> ...
- linux的DNS相关介绍(转载)
1.DNS配置文件 /etc/hosts 这个是最早的 hostname 对应 IP 的档案: /etc/resolv.conf :这个重要!就是 ISP 的 DNS 服务器 IP 记录处: /e ...
- WPF控件模板和数据模板 - 醉意人间
来自:http://www.th7.cn/Program/WPF/2011/12/21/51676.shtml ControlTemplate用于描述控件本身. 使用TemplateBinding来绑 ...
- iOS9新特性之新添加的关键字
iOS9 新出的关键字:用来修饰属性,或者方法的参数,返回值 好处:1.迎合swift 2.提高我们开发人员开发规范,减少程序员之间的交流 注意:iOS9新出的的关键字nonnull,nullable ...
- 从S3中导入数据到Dynamodb
本节如果你已经从Dynamodb中导出过数据,而且导出的文件以及被存入S3.文件内部结构会在Verify Data Export File 中描写叙述. 我们称之前导出数据的原始表为source ta ...