[CSP-S模拟测试72]题解
A.简单的序列
遇到括号匹配,先将左右括号转化为1和-1。
那么一个括号序列合法的必要条件:总和为0且所有时刻前缀和$\ge 0$。
用dp预处理出长度为$i$,总和为$j$的括号序列数量。那么如果p的方案数为$dp[i][j]$,与之匹配的q的方案数即为$dp[n-m-i][j+串m的总和]$。
注意需要保证统计的方案前缀和处处$\ge 0$。用原串的最小前缀和限制一下即可。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+5;
typedef long long ll;
const ll mod=1e9+7;
int n,m,sum,minx;
ll dp[2005][2005];
char s[N];
int main()
{
/*freopen("dt.in","r",stdin);
freopen("my.out","w",stdout);*/
scanf("%d%d%s",&n,&m,s+1);
if(s[1]=='(')sum=minx=1;
else sum=minx=-1;
for(int i=2;i<=m;i++)
{
if(s[i]=='(')sum++;
else sum--;
minx=min(minx,sum);
}
//cout<<sum<<' '<<minx<<endl;
dp[0][0]=1;
for(int i=1;i<=n-m;i++)
for(int j=0;j<=i;j++)
dp[i][j]=((j?dp[i-1][j-1]:0)+dp[i-1][j+1])%mod;//cout<<dp[i][j]<<endl;
ll ans=0;
for(int i=0;i<=n-m;i++)
{
for(int j=0;j<=i;j++)
{
if(j+sum>n-m||j+minx<0)continue;
(ans+=dp[i][j]*dp[n-m-i][sum+j]%mod)%=mod;
}
}
cout<<ans<<endl;
return 0;
}
B.简单的期望
设$dp[i][j][k][0/1]$为进行i次操作,得到数值的二进制后八位为j,第九位开始有几位相同,第九位是0 or 1的概率。
为什么取后八位呢?
一个数含2的多少次幂其实就是它二进制表示下末尾有多少连续的0。由于只有200次操作,取后8位可以保证高于8位的进位最多发生一次,避免未知数量的1变成0对答案的影响。
大力分类讨论转移即可。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int side=(1<<8)-1,U=230;
int n,x;
double p,dp[202][(1<<8)+5][235][2],q,ans=0.0;
int cacl(int x)
{
int res=0;
for( ;x%2==0;x>>=1)res++;
return res;
} int main()
{
scanf("%d%d%lf",&x,&n,&p);
p/=100.0;q=1.0-p;
int bit=x&(1<<8);
int cnt=1;
if(!(x>>8))goto ak;
for(int i=9;i<=30;i++)
{
int now=x&(1<<i);
if(now!=bit)break;
else cnt++;
}
ak:
//cout<<(x&side)<<' '<<cnt<<' '<<bit<<endl;
dp[0][x&side][cnt][bit]=1.0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<side;j++)
{
for(int k=1;k<=U;k++)
dp[i][j+1][k][0]+=dp[i-1][j][k][0]*q,dp[i][j+1][k][1]+=dp[i-1][j][k][1]*q;
}
for(int j=1;j<=U;j++)
dp[i][0][j][0]+=dp[i-1][side][j][1]*q;
for(int j=1;j<=U;j++)
dp[i][0][1][1]+=dp[i-1][side][j][0]*q;
for(int j=0;j<128;j++)
for(int k=1;k<=U;k++)
dp[i][j<<1][1][0]+=dp[i-1][j][k][1]*p,dp[i][j<<1][k+1][0]+=dp[i-1][j][k][0]*p;
for(int j=128;j<=side;j++)
for(int k=1;k<=U;k++)
dp[i][j<<1&side][1][1]+=dp[i-1][j][k][0]*p,dp[i][j<<1&side][k+1][1]+=dp[i-1][j][k][1]*p;
}
for(int i=1;i<=side;i++)
for(int j=1;j<=U;j++)
ans+=dp[n][i][j][0]*cacl(i)+dp[n][i][j][1]*cacl(i);
for(int i=1;i<=U;i++)
ans+=dp[n][0][i][0]*(8+i)+dp[n][0][i][1]*8;
printf("%.8lf\n",ans);
return 0;
}
C.简单的操作
首先很容易发现奇环是无法处理的,一个大奇环再怎么合并也会剩下一个长度为3的奇环而无法成链。
如果是一棵树,那显然可以把枝杈往直径上合并得到最优答案。
对于图也一样,偶环一定可以缩到任意一条边所在的链上。这样一个联通块的答案就是它的直径。(“最长的最短路”)
如果是不同联通块,那就把两个端点直接连起来。答案相加即可。
//不要卡spfa啊!!!
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
#define re register
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=1e3+5,M=2e5+5;
int n,m;
int to[M],head[N],nxt[M],tot;
int col[N],bel[N],part,dis[N],v[N],len[N],ans;
inline void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int c,int now)
{
bel[x]=now;col[x]=c;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(!col[y])dfs(y,-c,now);
else if(col[x]==col[y])
{
puts("-1");exit(0);
}
//cout<<x<<' '<<y<<endl;
}
}
inline int spfa(int s)
{
queue<int> q;
for(re int i=1;i<=n;i++)
dis[i]=0x3f3f3f3f,v[i]=0;
dis[s]=0;q.push(s);v[s]=1;
int maxx=0;
while(!q.empty())
{
int x=q.front();q.pop();
maxx=max(maxx,dis[x]);
for(re int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dis[y]>dis[x]+1)
{
dis[y]=dis[x]+1;
if(!v[y])v[y]=1,q.push(y);
}
}
v[x]=0;
}
return maxx;
}
int main()
{
/*freopen("dt.in","r",stdin);
freopen("my.out","w",stdout);*/
n=read();m=read();
for(re int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);add(y,x);
}
for(re int i=1;i<=n;i++)
if(!col[i])dfs(i,1,++part); for(re int i=1;i<=n;i++)
len[bel[i]]=max(len[bel[i]],spfa(i));
for(re int i=1;i<=part;i++)
ans+=len[i];
cout<<ans<<endl;
return 0; }
即可真是个美妙的词语
[CSP-S模拟测试72]题解的更多相关文章
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
- [CSP-S模拟测试92]题解
A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...
随机推荐
- Python基础教程(022)--Pycharm快速体验
前言 熟悉掌握Python工具 内容 提示 断点调试 目的 学会了解Pycharm的使用 掌握Pycharm执行程序 掌握断点调试模式
- php面试专题---4、流程控制考点
php面试专题---4.流程控制考点 一.总结 一句话总结: 理解循环内部机制(指针操作),更易于记忆foreach的reset特性,分支结构中理解了switch...case的执行步骤(跳转表)也就 ...
- php中class类文件引入方法汇总
在项目中 总是会用到类文件引入的操作,在此简单总结下: 方法一: 使用 include,require,include_once,require_once. 其中:*_once once意为曾经 ...
- error C2872: ‘ofstream’ : ambiguous symbol
转自VC错误:http://www.vcerror.com/?p=1123 问题描述: 编译时出现: error C2872: 'ofstream' : ambiguous symbol error ...
- 安装Elasticsearch5.4.0以及head,kibana插件
可以在网盘中下载也可以去官网下载 网盘: Elasticsearch 地址:http://pan.baidu.com/s/1hrI0AFU elasticsearch-head 地址:http:// ...
- ORM模型类介绍,
所有的软件开发过程中,都会涉及到对象和关系型数据库,在用户层面和业务逻辑层面,程序员编写代码都是面向对象的,当我们对象的信息发生变化的时候,都需要将对应的信息,传到关系型数据库中.而在此之前,需要我们 ...
- 洛谷P3366 【模板】最小生成树(LCT)
[模板]最小生成树 题目传送门 解题思路 用LCT来维护最小生成树. 除了把各顶点作为节点外,每条边也都视为一个节点.对于要加入的边\(e\),检查其两顶点\(x\)和\(y\)是否在同一棵树中,如果 ...
- Android深度探索-卷1第六章心得体会
这章主要介绍了第一个linux驱动程序:统计单词个数.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.大多数Linux驱动都有与其对应的设备文件,因 ...
- BootStrap的一些基本语法
一, 1.@using :引入命名空间 2.@model:声明强类型的数据 Model 类型 3.@section:定义要实现母版页的节信息 4.@RenderBody():当创建基于此布局页面的视图 ...
- Linux vsftpd服务配置以及三种验证方式以及常见错误解决办法
文件传输协议(FTP): 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件 ...