传送门


考虑如果我们当前可以询问\(x\)个数,还剩下\(q\)次询问机会,我们要怎么构造询问方式?

肯定会这么考虑:

找到一个尽可能大的\(P\)满足\([x,P]\)能在每一次能询问\(x\)个数、剩下\(q-1\)次询问机会的情况下被询问出来,然后在这一次询问\(P+1\);

接下来令\(x=P+2\),再去做这一个操作直到\(q\)次询问都被问完。

那么我们现在要求解这个\(P\),也就是要求每一次能询问\(x\)个数、剩下\(q-1\)次询问机会的情况下最长可以求解多长的区间;而我们当前的问题可以看做可以询问\(x\)个数,还剩下\(q\)次询问机会能够求解最长多长的区间,可以发现前者是后者的一个子问题,可以\(DP\)处理。

设\(dp_{x,q}\)表示当前可以询问\(x\)个数,还剩下\(q\)次询问机会时最长的能够处理的区间长度。那么我们的转移如下:

①\(r_0=x\)

②\(r_i = r_{i-1} + dp_{min\{r_i,10000\},q-1} + 1\)

③\(dp_{x,q}=r_{q+1}-r_0\)

其中\(dp_{i,0}=0\),因为没有询问显然啥都不知道

我们每一次需要询问的序列为\(r_i-1\)。

显然复杂度是\(O(5 \times 10^8)\)的,但我们只需要解决\(dp_{1,5}\),其中有很多冗余状态,实际上可以记忆化搜索解决。

然后考虑如何进行询问。

我们的初始的最长解决长度是\(dp_{1,5}\),初始的最小知道的值为\(cur=1\),询问次数为\(q=5\),那么我们按照下面这种方法进行交互:

①构造上面对应的询问序列,询问一次

②得到\(K\)

③如果\(K=-1\)直接退出,否则\(cur=r_K\),最长解决长度变为\(dp_{min(cur,10000),q-1}\)

④\(q--\),回到第\(1\)步

然后就做完了

思路的确比较火

还有\(dp_{1,5}\)就等于\(M\)到底是什么鬼啊喂

#include<bits/stdc++.h>
#define int long long
//This code is written by Itst
using namespace std;

const int MAXN = 10004205361450474ll;

int dp[10010][5];
vector < int > query;

int dfs(int l , int q){
    if(!q)
        return 0;
    if(l > 10000)
        l = 10000;
    if(dp[l][q])
        return dp[l][q];
    int r = l;
    for(int i = 1 ; i <= l ; ++i)
        r = r + dfs(r , q - 1) + 1;
    r = r + dfs(r , q - 1);
    return dp[l][q] = r - l;
}

void interact(){
    int cur = 1 , q = 5 , K;
    for(int i = 1 ; i <= 5 ; ++i){
        query.clear();
        query.push_back(cur - 1);
        int now = cur;
        for(int j = 1 ; j <= min(cur , 10000ll) ; ++j){
            now += dp[min(now , 10000ll)][q - 1];
            query.push_back(now);
            ++now;
        }
        cout << query.size() - 1 << ' ';
        for(int i = 1 ; i < query.size() ; ++i)
            cout << query[i] << ' ';
        cout << endl;
        cin >> K;
        if(K == -1)
            exit(0);
        cur = query[K] + 1;
        --q;
    }
}

signed main(){
    dfs(1 , 5);
    interact();
    return 0;
}

CF1028G Guess the Numbers 构造、记忆化搜索的更多相关文章

  1. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】

    任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 1048576K,其他语言2097152K6 ...

  2. hdu 5535 Cake 构造+记忆化搜索

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...

  3. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  4. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  5. cdoj Dividing Numbers 乱搞记忆化搜索

    //真tm是乱搞 但是(乱搞的)思想很重要 解:大概就是记忆化搜索,但是原数据范围太大,不可能记下所有的情况的答案,于是我们就在记下小范围内的答案,当dfs落入这个记忆范围后,就不进一步搜索,直接返回 ...

  6. HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  7. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  8. CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化

    Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...

  9. hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)

    pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/ ...

随机推荐

  1. Linux 下修改网卡接口名

    Linux下修改网卡接口名 by:授客 QQ:1033553122 (测试环境:CentOS-6.0-x86_64-bin-DVD1.iso+Vmware) 作用 可以用于解决类似如下Device n ...

  2. 安卓开发_WebView如何在Fragment中使用

    之前学习了如何在activity中使用WebView控件来显示网页. 在我的实际开发中,有需要在Fragment中用到WebView控件的,那么就百度学习了一下 其实很简单,但是当然不是和在Activ ...

  3. python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...

  4. 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码

    其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...

  5. python第九十五天--js正则

    定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^ ...

  6. 第三章————用SQL语句操作数据

    第三章————用SQL语句操作数据 *********************新增**************************** 1. insert into 表名(列名1,列名2...) ...

  7. nslookup debug

    Try adding forwarders to some public DNS servers leave the box ticked which says use root hints if f ...

  8. python中urllib的整理

    本不想使用这个玩意,奈何看到很多地方使用,随手整理下 urllib模块提供的urlretrieve()函数,urlretrieve()方法直接将远程数据下载到本地 urlretrieve(url, f ...

  9. Python基础知识:字符串

    1.Python中大写字母命名的变量,默认为常量,不可修改:列如:MYSQL_CONNECTION = '192.168.1.1' 2.字符串换行输入格式:换行用\隔开,两行分别用引号,制表符\t,换 ...

  10. flask框架的教程--虚拟环境的安装[一]

    为什么需要安装虚拟环境呢? 因为虚拟环境中扩展包对本机软件中不影响 安装 查看是否安装了虚拟环境 安装虚拟环境的第三方工具 sudo pip install virtualenv sudo pip i ...