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 题解的更多相关文章

  1. SDOI2017 Round1 简要题解

    我们 TM 怎么又要上文化课..我 哔哔哔哔哔哔 「SDOI2017」数字表格 题意 有 \(T\) 组数据,求 \[ \prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[ ...

  2. SDOI2017 Round1 Day1 题解

    不知道有几个AK的,除了出题人SB搬了个BZOJ3779以外,应该没什么因素阻碍AK吧.要是SCOI考这套题多好. BZOJ4816 数字表格 SB反演,推出答案为$\prod_{i=1}^nf^{\ ...

  3. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  4. SDOI2017 Round1

    SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...

  5. SDOI2017 Round1 起点

    第二次打酱油了 高一两次考试以打两瓶酱油告终 来的时候明知自己没戏,却总存有一丝希望 NOIP连200都没考到,是不是有点儿不自量力 如果我真的去争取那一丝希望的话,该有多好 先简单分析下考试 Day ...

  6. SDOI2017 Round2 详细题解

    这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\ ...

  7. NOIP2013 DAY2题解

    DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...

  8. 二模Day2题解

    小明搬家 题目描述 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运过程效率太 ...

  9. 【NOIP2012】DAY1+DAY2题解

    不贴代码的原因是我的代码在初中机房.忘记带过来了. DAY 1 T1随便搞,但是字符串相关的题我经常犯蠢 T2 一个结论题,OAO但是需要高精度写. 具体就是按左手的数除右手的数(还是怎么的来着)排个 ...

随机推荐

  1. C# 将链表存入二进制文件及读取二进制文件得到链表示例

    // 将tasks保存到二进制文件中 public Boolean saveToFile(String file) { try { ) { // 没任务就不存 return false; } if ( ...

  2. G - Specialized Four-Digit Numbers(1.5.2)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit cid=1006#sta ...

  3. uva 11127(暴力)

    题意:给出一个字符串,包含0.1.*,当中×是能够替换成0或者1的,假设字符串的某个子串S有SSS这种连续反复3次出现,不是Triple-free串,问给出的字符串能够形成多少个非Triple-fre ...

  4. awk中的NR FNR

    shell编程中,awk简直就是一把利器,你能够把它看成shell的一部分,也能够看成一种单独的语言,功能十分强大.今天先来说一说NR与FNR 先准备两个文件: 1.txt,内容为: user pas ...

  5. CloudStack管理VMware遇到的问题

    话说前段安装了CloudStack并使用它来管理XenServer,这回要用它来管理VMware.虽说之前遇到了大大小小的问题都攻克了,但在VMware这一块还是遇到了一些麻烦. 在创建资源域.加入集 ...

  6. asp .net 为图片添加文字水印(内包含有加图片水印的方法) .

    在项目中先创建一个Imag_writer 类库 在该类库下分别创建两个枚举类型WaterMarkType (水印的类型).WaterMarkPosition (水印的位置).代码如下: using S ...

  7. 解读Unity中的CG编写Shader系列1——初识CG

    CG=C for Graphics  用于计算机图形编程的C语言超集 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函数名称可任意,但须 ...

  8. linux系列之-—04 自动删除n天前日志【转】

    让Linux系统定时清理一些不需要的文件,日志很有必要 1. 删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; ...

  9. 用Camshift算法对指定目标进行跟踪

    原理 Camshift算法是Continuously Adaptive Mean Shift algorithm的简称. 它是一个基于MeanSift的改进算法.它首次由Gary R.Bradski等 ...

  10. 网页编程-django前传

    1.js正则表达式  http://www.cnblogs.com/wupeiqi/articles/5602773.html test  - 判断字符串是否符合规定的正则 正则表达式: rep = ...