·题目:D. Interactive LowerBound

·英文题,述大意:

      有一个长度为n(n<=50000)的单链表,里面的元素是递增的。链表存储在一个数组里面,给出长度n、表头在数组的下标和一个值w。题目要求求出链表中大于等于w值的元素中的最小元素。注意,这道题是一道interactive。由于链表是未知的,最多可以进行1999个询问,询问形式:?i。表示询问数组下标为i,询问后,会得到一个答案组(val,Next),表示询问的元素是val,链表下一位所在的数组下标是Next。最终如果找到答案输出:!ans,如果没有找到答案输出:! –1。

分析:

      题目描述有点不准确,文中"没有找到答案"的意思是序链表中不存在满足条件的元素,而不仅仅是询问没找到。

      观察数据范围:50000对1999询问,这看上去是不可能的,因为交互题是询问后就在线回答,大概意思就是你问测评机问题,它回答你……所以这看上去就是在蒙答案,蒙不对就完了(50000这么大,肯定完了)!

      接下来用到随机算法。我们将总数1999拆成a+b。a表示我们先随机生成a个询问,表示在a个询问中最靠近答案的那个向后暴力行走链表b次。上文一句话就概括了本题的做法——为什么这样做是对的?我们将链表从左向右画出来(注意,不是把数组画出来),那么从左向右元素是递增的。我们现在尝试计算可能会遗漏答案情况的概率:

      如图,蓝色的点就是随机的点。然后我们会找比val小但是又最近的点,那么向前走链表b次,看看是否找到答案。如果我们不能找到答案,那么由图可知,只有当L>b时,我们的算法是错误的。现在来算一下概率:

      对于一个随机点,它不会落在答案点前面b长度的区间内的概率是:

      P1=(n-b)/n

      那么,由于我们随机了a个点,可得没有点落在答案点前b长度的区间的概率是(这个当然表示我们算法错误的概率啊):

     Pall=((n-b)/n)a

     这个呢,因为啊a+b=1999,我们令x=b,y=1-((n-x)/n)1999-x

     那么可以看出y表示我们的算法能够正确的概率,我们将这个函数分析一下(比如做出图像):

   

我们发现当x=1000左右时,y几乎是1了(更精确见图中数据)。所以这道题随机算法竟然可以这样达到美妙!所以我们最终的方法就是:先随机询问 1000个点,然后从最优点走999次,判断答案是否存在了啦啦。

    最后一个代码提醒:这道题直接用rand()会在第六个测试点WA,原因是随机数不均匀,我们需要改成:rand()*rand()*rand()……

    CF型短代码:

    

 #include<bits/stdc++.h>
#define _ fflush(stdout)
#define go(i,a,b) for(int i=a;i<=b;i++)
int n,val,a=-,T,w,Next,l;
int main()
{
srand(time(NULL));
scanf("%d%d%d",&n,&l,&val);
T=;while(T--)
{
printf("? %d\n",1ll*rand()*rand()*rand()%n+);_;
scanf("%d%d",&w,&Next);
if(w<val&&w>a)a=w,l=Next;
}
T=;while(T--)
{
if(l==-)break;
printf("? %d\n",l);_;
scanf("%d%d",&w,&Next);l=Next;
if(w>=val){printf("! %d\n",w);_;return ;}
}
puts("! -1");_;return ;
}//Paul_Guderian

    

又一种信仰将要破灭,又一个时代将要来临.———汪峰《风暴来临》

【AIM Tech Round 4 (Div. 2) D Prob】的更多相关文章

  1. 【AIM Tech Round 4 (Div. 1) B】Interactive LowerBound

    [链接]http://codeforces.com/contest/843/problem/B [题意] 给你一个数组模拟的单链表,放在一个长度为n的数组里面,然后告诉你表头的位置在哪里; 你可以最多 ...

  2. 【AIM Tech Round 4 (Div. 2) A】Diversity

    [链接]http://codeforces.com/contest/844/problem/A [题意] 大水题 [题解] 看看不同的个数num是不是小于k,小于k,看看len-num够不够补的 [错 ...

  3. 【AIM Tech Round 4 (Div. 2) B】Rectangles

    [链接]http://codeforces.com/contest/844/problem/B [题意] 也是道计数水题,没什么记录意义 [题解] 枚举每个点的位置在,然后往右往下 枚举和它一样颜色的 ...

  4. 【AIM Tech Round 4 (Div. 2) C】Sorting by Subsequences

    [链接]http://codeforces.com/contest/844/problem/C [题意] 水题,没有记录意义 [题解] 排序之后,记录每个数字原来在哪里就好. 可以形成环的. 环的个数 ...

  5. 【AIM Tech Round 5 (Div. 1 + Div. 2) 】

    A:https://www.cnblogs.com/myx12345/p/9844152.html B:https://www.cnblogs.com/myx12345/p/9844205.html ...

  6. codeforce AIM tech Round 4 div 2 B rectangles

    2017-08-25 15:32:14 writer:pprp 题目: B. Rectangles time limit per test 1 second memory limit per test ...

  7. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结】【题解往前或往后翻,不在这】

    又是爆炸的一场 心态有点小崩.但问题不大.. 看A题,一直担心有多个正方形..小心翼翼地看完之后,毅然地交上去了. [00:08] A[Accpted] 然后开始看B题. 觉得和之前做的某题很像,但翻 ...

  8. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) A】 Find Square

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找到左上角.往下一直走,往右一直走走到B边界就好. 中点的话.直接输出中位数 [代码] #include <bits/stdc ...

  9. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) B】Unnatural Conditions

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让a+b的和为100000000...0这样的形式就好了 这样s(a+b)=1<=m就肯定成立了(m>=1) 然后至于s ...

随机推荐

  1. 201621123057 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  2. 201621123043 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains的源代码如下 public boolean contain ...

  3. 【Swift】Runtime动态性分析

    Swift是苹果2014年发布的编程开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift已经开源,目前最新版本为2.2.我们知道Objec ...

  4. 【Swift】iOS导航栏错乱的原因

    #iOS开发高级技巧#导航栏错乱,也就是导航栏的显示效果与内容区不匹配,引发原因很多,其中最重要的有两个原因: 1.在viewwillappear,viewwilldisappear两个函数中,设置导 ...

  5. Flask学习 二 模板

    jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...

  6. 故障公告:IIS应用程序池停止工作造成博客站点无法访问

    非常抱歉,今天凌晨博客站点负载均衡中所有3台服务器的IIS应用程序池突然停止工作,造成 1:20-7:45 左右博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 服务器操作系统是 Window ...

  7. 20170222==(MODBUS读取多个寄存器)

    MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...

  8. Mego开发文档 - 基本保存操作

    基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...

  9. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...

  10. vmvare入门(1)使用移动,不要使用复制

    1.复制虚拟机会产生新的自动网卡,原来的 System Eth0废了? 2.xftp链接的时候,要选择sftp方式连接,utf8编码.