题解 v
考场上只会爆搜……觉得重复状态其实有很多但不知道怎么记忆化,结果……

- 对于类似这样n不算太小但只有二三十,而重复状态极多的题其实也是可以跑状压/记搜的,状态可以开map存
然后就是爆搜,就没什么了……
这题\(k=n-1\)其实有特解……白优化了半天hash 考虑\(k=n-1\)其实就是有一个点可以任选
upd: 其实不用特解,移位卡常可以过
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100
#define ll long long
#define ld long double
#define usd unsigned
#define ull unsigned long long
//#define int long long
#define max(a, b) ((a)>(b)?(a):(b))
#define reg register int
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n, k;
char s[N];
namespace force{
int v[N];
bool vis[N];
double dfs(int u, int sum) {
//cout<<"dfs "<<u<<' '<<sum<<endl;
if (u>k) return 1.0*sum;
int lim=n-u+1, bkpa, bkpb, cnt;
int a, b;
double ans=0; double t1, t2;
for (int i=1; i<=lim; ++i) {
cnt=0; for (int j=1; j<=n; ++j) {if (!vis[j]) {if (++cnt==i) {vis[j]=1; a=v[j]; bkpa=j;}}}
t1=dfs(u+1, sum+(a==0));
//cout<<a<<' '<<bkpa<<endl;
vis[bkpa]=0;
cnt=0; for (int j=n; j; --j) {if (!vis[j]) {if (++cnt==i) {vis[j]=1; b=v[j]; bkpb=j;}}}
t2=dfs(u+1, sum+(b==0));
vis[bkpb]=0;
//cout<<"u, i: "<<u<<' '<<i<<' '<<max(t1, t2)<<endl;
ans+=max(t1, t2)/(1.0*lim);
}
return ans;
}
void solve() {
for (int i=1; i<=n; ++i)
if (s[i]=='W') v[i]=0;
else v[i]=1;
//cout<<1<<endl;
printf("%.10lf\n", dfs(1, 0));
exit(0);
}
}
namespace task2{
void solve() {
int cnt=0;
for (int i=1; i<=n; ++i) if (s[i]=='W') ++cnt;
printf("%.10lf\n", double(cnt));
exit(0);
}
}
namespace task3{
void solve() {
int cntw=0;
for (int i=1; i<=n; ++i) if (s[i]=='W') ++cntw;
if (!cntw) {puts("0.0000000000"); exit(0);}
if (cntw==n) {printf("%.10lf\n", double(k)); exit(0);}
if (cntw==n-1 && n%2==0) {printf("%.10lf\n", double(k)); exit(0);}
if (cntw==n-1 && n%2) {printf("%.10lf\n", double(k-1)/double(k)); exit(0);}
if (k==n-1) {printf("%.10lf\n", double(min(cntw, n-1))); exit(0);}
force::solve();
}
}
namespace task{
//unordered_map<pair<int, int>, double> mp;
struct ele{int a, b; ele(){} ele(int a_, int b_):a(a_),b(b_){}};
inline bool operator == (ele a, ele b) {return a.a==b.a&&a.b==b.b;}
struct hush_table{
static const int SIZE=50000100;
int head[SIZE], size;
//int cnt[SIZE];
struct edge{double dat; ele p; int next;}e[5000010];
inline bool find(ele q) {
ll t=(998244353ll*q.a*q.b+(q.a))%SIZE;
//cout<<"t: "<<t<<endl;
for (int i=head[t]; i; i=e[i].next)
if (q==e[i].p) return 1;
return 0;
}
inline double operator [] (ele q) {
ll t=(998244353ll*q.a*q.b+(q.a))%SIZE;
//cout<<"t: "<<t<<endl;
for (int i=head[t]; i; i=e[i].next)
if (q==e[i].p) return e[i].dat;
}
inline void add(ele q, double dat) {
//cout<<"size: "<<size<<endl;
ll t=(998244353ll*q.a*q.b+(q.a))%SIZE;
//++cnt[t];
//cout<<"t: "<<t<<endl;
edge* k=&e[++size]; k->dat=dat; k->p=q; k->next=head[t]; head[t]=size;
//if (size > 10000010) cout<<"error"<<endl;
}
void check() {
//int maxn=0;
//for (int i=0; i<SIZE; ++i) maxn=max(maxn, cnt[i]);
//cout<<"maxn: "<<maxn<<endl;
//cout<<"size: "<<size<<endl;
}
}mp;
int v[N];
double dfs(int u, int s) {
//cout<<"dfs "<<u<<' '<<bitset<10>(s)<<endl;
if (u>k) return 0.0;
ele p(u, s);
//cout<<"go to find"<<endl;
if (mp.find(p)) return mp[p];
//cout<<"not return "<<endl;
int lim=n-u+1, cnt;
int a, b, s2, s3;
double ans=0; double t1, t2;
for (reg i=1; i<=lim/2; ++i) {
a=(s&(1<<(i-1)))?1:0;
cnt=s2=0;
#if 0
for (reg j=0; j<lim; ++j)
if (j!=i-1) {
if (s&(1<<j)) s2|=(1<<cnt);
++cnt;
}
#endif
s2=((s>>i)<<(i-1));
s2|=(s&((1<<(i-1))-1));
//cout<<"s2, s3: "<<bitset<5>(s2)<<' '<<bitset<5>(s3)<<endl;
//assert(s2==s3);
t1=dfs(u+1, s2)+(a==0);
b=(s&(1<<(lim-i)))?1:0;
cnt=s2=0;
#if 0
for (reg j=0; j<lim; ++j)
if (j!=lim-i) {
if (s&(1<<j)) s2|=(1<<cnt); //, cout<<"1<<"<<(cnt)<<endl;
++cnt;
}
#endif
s2=((s>>(lim-i+1))<<(lim-i));
s2|=(s&((1<<(lim-i))-1));
//cout<<"s2, s3: "<<bitset<5>(s2)<<' '<<bitset<5>(s3)<<endl;
//assert(s2==s3);
t2=dfs(u+1, s2)+(b==0);
ans+=max(t1, t2)/(0.5*lim);
}
if (lim&1) {
int i=lim/2+1;
a=(s&(1<<(i-1)))?1:0;
cnt=s2=0;
#if 0
for (reg j=0; j<lim; ++j)
if (j!=i-1) {
if (s&(1<<j)) s2|=(1<<cnt);
++cnt;
}
#endif
s2=((s>>i)<<(i-1));
s2|=(s&((1<<(i-1))-1));
t1=dfs(u+1, s2)+(a==0);
ans+=t1/(1.0*lim);
}
//cout<<"go to add"<<endl;
mp.add(p, ans);
//cout<<"return "<<endl;
return ans;
}
void solve() {
int ss=0;
for (int i=1; i<=n; ++i)
if (s[i]=='W') v[i-1]=0;
else v[i-1]=1, ss|=(1<<(i-1));
//cout<<1<<endl;
printf("%.10lf\n", dfs(1, ss));
mp.check();
exit(0);
}
}
signed main()
{
#ifdef DEBUG
freopen("1.in", "r", stdin);
#endif
n=read(); k=read();
scanf("%s", s+1);
if (k==0) {puts("0.0000000000"); return 0;}
if (k==n || (0&&k==n-1)) task2::solve();
//if (n>=10) task3::solve();
//force::solve();
task::solve();
return 0;
}
题解 v的更多相关文章
- FZU 2277 Change(dfs序+树状数组)
Problem Description There is a rooted tree with n nodes, number from 1-n. Root’s number is 1.Each no ...
- 【AtCoder】Dwango Programming Contest V题解
A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...
- csp-s模拟测试53u,v,w题解
题面:https://www.cnblogs.com/Juve/articles/11602450.html u: 用差分优化修改 二维差分:给(x1,y1),(x2,y2)加上s: $d[x1][y ...
- 题解 SP2916 【GSS5 - Can you answer these queries V】
前言 最近沉迷于数据结构,感觉数据结构很有意思. 正文 分析 先来分类讨论一下 1. \(x2<y1\) 如果 \(y1<x2\) 的话,答案 \(=\max \limits_{ y1 \ ...
- [V&N2020 公开赛] Web misc部分题解
0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...
- 题解报告:hdu1995汉诺塔V(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 Problem Description 用1,2,...,n表示n个盘子,称为1号盘,2号盘,. ...
- 「题解」「UOJ-164」「清华集训2015」V
目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...
- v&n赛 内存取证题解(已更新)
题目是一个raw的镜像文件 用volatility搜索一下进程 有正常的notepad,msprint,还有dumpit和truecrypt volatility -f mem.raw --profi ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- ADO.NET整理 [转]
虽然我们都知道ADO.NET是对数据库的操作,但是要真的说出ADO.NET的具体含义还不是很容易. ADO.NET是ActiveX Data Objects的缩写,它是一个COM组件库,用于在micr ...
- 史上最强Tableau Server 安装教程
前言 本文介绍的是单节点部署Tableau Server. 安装前 1.Tableau Server 的单节点安装的最低硬件推荐配置: 处理器: 64 位 必须支持 SSE4.2 和 POPCNT 指 ...
- 「 题解」NOIP2021模拟赛(2021-07-19)
小兔的话 欢迎大家在评论区留言哦~ D - 矩阵 简单题意 一个 \(i * i\) 的 \(01\) 矩阵,若满足 每一行 和 每一列 都满足 恰好 有 \(2\) 个位置是 \(1\) 时,称为 ...
- java集合(3)-Java8新增的Predicate操作集合
Java8起为Collection集合新增了一个removeIf(Predicate filter)方法,该方法将批量删除符合filter条件的所有元素.该方法需要一个Predicate(谓词)对象作 ...
- 【记录】如何造一个vite插件(1)
在看文章前,先做个定位,这不是一篇纯粹的技术性文章,可以把它理解成一个叙述文章,记录我开发插件的过程. 开始前简单的吹个牛 vue2 也写了很多年了,多人合作始终避不开用到别人的组件.关键是有些组件没 ...
- 使用deepin连接罗技k380
1,刚开始总是连不上,连上了就断开了,以为是deepin系统的问题. 2,首先在华为论坛上找到这样的一片解决方案:https://cn.ui.vmall.com/thread-21831568-1-1 ...
- tcpdump软件使用
tcpdump是一个抓包工具, -w 选项是把抓到的包写到二进制文件中,一般扩展名是.cap或.dmp,但tcpdump程序创建文件时并不添加扩展名,可自己指定. -i 是指定要抓包的interfac ...
- 每天五分钟Go - 函数基础
函数在定义 Go的函数使用func来定义,返回类型支持多个值的返回 func 函数名([参数列]) [返回值类型]{ 方法执行体 } 参数列支持多个参数的声明,同一类型的函数,声明时和变量的声明一样 ...
- 【排序+模拟】魔法照片 luogu-1583
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- 解决proto文件生成pb文件时提示(e.g."message")的问题
原因:格式不支持 解决办法:去下个notepad,打开方式选择notepad,文件属性的只读取消掉 打开后会发现最下面显示了文件的格式是unix,utf-8 右键红框处,选择转换为windows格式, ...