正题

题目链接:https://ac.nowcoder.com/acm/contest/11254/A


题目大意

现在有一个y∈[1,n]y\in[1,n]y∈[1,n],BobBobBob每次可以选择问AliceAliceAlice是否y≥xy\geq xy≥x,AliceAliceAlice可以说一次谎。BobBobBob要在最少次数内确定yyy的值,而AliceAliceAlice尽量使得次数最多。

现在已知第一次BobBobBob询问的是kkk且AliceAliceAlice回答了是,对于k∈[1,n]k\in[1,n]k∈[1,n]求每个kkk BobBobBob需要的最少询问次数。

1≤n≤20001\leq n\leq 20001≤n≤2000


解题思路

dlsdlsdls 在 WC 讲的神仙题目。

对于一种情况,假设y=iy=iy=i时,AliceAliceAlice说谎的次数是固定的,记这个次数为aia_iai​,所以如果当1∼n1\sim n1∼n中只有一个数字满足ai≤1a_i\leq 1ai​≤1时那么答案就是这个数字了。

然后看BobBobBob的操作,它每次可以选择一个xxx,AliceAliceAlice可以选择让≥x\geq x≥x的数字或者让<x<x<x的数字的位置ai=ai+1a_i=a_i+1ai​=ai​+1,BobBobBob需要用最少的次数使得只有一个位置ai≤1a_i\leq 1ai​≤1。

发现因为每次都是覆盖一个前缀或者一个后缀,所以如果只保留ai=0/1a_i=0/1ai​=0/1的话那么所有的状态肯定是若干个111+若干个000+若干个111,分别记为a/b/ca/b/ca/b/c个,我们就可以设状态为fa,b,cf_{a,b,c}fa,b,c​进行转移。

考虑到随着ccc的增大我们肯定会尽量选择中间的位置,也就是决策位置是单调递增的,所以我们可以做到O(n3)O(n^3)O(n3)的转移。

然后注意到这个和猜数字的规则很像,询问次数级别不会超过log⁡n\log nlogn,所以我们可以考虑交换次数和一个值域,记fw,a,bf_{w,a,b}fw,a,b​表示猜测了www次能够猜出来的aaa个000+bbb个111+ccc个000中最大的ccc,然后用决策单调性转移。

时间复杂度:O(n2log⁡n)O(n^2\log n)O(n2logn)


code

 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=2100;int n,inf,f[20][N][N];int calc(int u,int v){int ans=19;while(ans&&f[ans-1][u][v]>=0)ans--;return ans;}int main(){scanf("%d",&n);memset(f,0xcf,sizeof(f));inf=f[0][0][0];for(int i=0;i<=1;i++)for(int j=0;j<=1-i;j++)f[0][i][j]=1-i-j;for(int i=1;i<=19;i++){for(int j=0;j<=n;j++)for(int k=0;k<=j;k++){int u=f[i-1][j-k][k];int v=f[i-1][k][j-k];if(u!=inf&&v!=inf){u=min(u,n-j);f[i][u][j]=max(f[i][u][j],v);}}for(int j=0;j<=n;j++){int v=f[i-1][j][0];if(v!=inf){for(int k=0;k<=n-j;k++){int u=f[i-1][k][j];if(u==inf)break;f[i][min(u,n-j)][j]=max(f[i][min(u,n-j)][j],v+k);f[i][min(v+k,n-j)][j]=max(f[i][min(v+k,n-j)][j],u);}}}for(int j=0;j<=n;j++)for(int k=n-j-1;k>=0;k--)f[i][k][j]=max(f[i][k][j],f[i][k+1][j]);}for(int i=0;i<n;i++)printf("%d ",calc(i,n-i));return 0;}

2021牛客暑期多校训练营3A-Guess and lies【dp】相关推荐

  1. 2021牛客暑期多校训练营8 J-Tree(思维dp+rmq)

    J-Tree Cosmic_Tree题解 赛时队友想到了预处理s→ts\to ts→t路径上的点最远到达的点,后面贪心做的一直wa.正解是dp. 下面的solve(l,r,op)\text{solve ...

  2. 2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)

    D-Double Strings fi,jf_{i,j}fi,j​表示a中前i个字符,b中前j个字符相同子序列的数量,容斥转移 fi,j=fi−1,j+fi,j−1−fi−1,j−1+{(1+fi−1 ...

  3. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  4. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  5. 2021牛客暑期多校训练营4

    2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...

  6. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

  7. 2021牛客暑期多校训练营2

    2021牛客暑期多校训练营2 题号 题目 知识点 A Arithmetic Progression B Cannon C Draw Grids D Er Ba Game E Gas Station F ...

  8. 2021牛客暑期多校训练营1

    2021牛客暑期多校训练营1 题号 题目 知识点 难度 A Alice and Bob 博弈论 B Ball Dropping 计算几何 签到 C Cut the Tree D Determine t ...

  9. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  10. 2021牛客暑期多校训练营1, 签到题DFBG

    2021牛客暑期多校训练营1 题号 标题 已通过代码 通过率 团队的状态 A Alice and Bob 点击查看 1365/5586 通过(博弈论-打表) B Ball Dropping 点击查看 ...

最新文章

  1. alt+数字 符号大全_【BIM工具箱】Revit中特殊符号大全和输入技巧
  2. 【WP开发问题1】 请确保已为开发人员解锁此设备。有关开发人员解锁的详细信息,...
  3. php控制文本换行,css如何控制文字换行方式?(代码示例)
  4. Java:从Java 8开始受益于内联类属性
  5. Java 计算两个日期时间差,天数、时、分、秒
  6. QT5更改应用程序图标
  7. 安装,使用node和npm,切换镜像源cnpm
  8. iOS 系统级别录屏方式调研
  9. 网络编程套接字Socket
  10. 字典的启发——深入浅出数据库索引
  11. word文件做一半未响应_word文档未响应文件还没保存该怎么处理?
  12. tableau度量值计算_度量值与度量名称
  13. java redis 实现pv uv_redis实战-记录PV与UV
  14. 开源移动设备管理(MDM)解决方案的利与弊
  15. android 图片的处理方法,Android图片处理,ImageView的属性和方法大全
  16. 在AS模拟器上访问本地电脑tomcat部署的资源报错java.net.ConnectException: Failed to connect to localhost/127.0.0.1:8081
  17. hexo图片展示-blog图床迁移至七牛云
  18. 问题解决: ValueError: Can't Handle mix of binary and continuous
  19. Extracting and Composing Robust Features with Denoising Autoencoders论文笔记
  20. 输入一段英文句子,单词之间用若干空格隔开,将每个单词的首字母转换为大写字母。 例如,“I am very glad to see you”的转换结果为“I Am Very Glad To See Yo

热门文章

  1. linux daemon守护线程,线程8--守护线程Daemon
  2. java sql objects_Java SQL注入学习笔记
  3. unix系统mysql卸载教程_Linux操作系统下MySQL的卸载、安装全过程
  4. java hashmap实例,关于java中的HashMap的实例操作
  5. linux下mysql案例_Linux下安装MySQL多实例
  6. python list remove 删除引用_Python——list列表操作一坑(remove)
  7. html5 获取文件属性,H5新属性--file文件读取
  8. java编程_Java编程和C语言的比较
  9. 使用React hooks,些许又多了不少摸鱼时间
  10. [Java网络编程基础]网络编程概述,三要素,IP地址