Codeforces Aim Tech Round4 (Div2) D

题目链接:

题意:

  给你一个严格升序的单链表,但是是用数组来存放的。对于每一个位置来说,你可以知道这个位置的值和下一个的位置。你每一个可以询问一个位置,机器会告诉你这个位置的值,和下一个位置的指针。要你确认大于等于x的值。(询问次数不能超过2000).

题解:

  由于给你的可能有5e4个数,除了随机算法,没有一种可以在2000步以内找到小于等于x。

  对与随机算法:我们先随机找500个点,找到小于x的点0值中最大的一个。然后暴力询问。小于2000的直接暴力找了。  

  证明:

    我们假设x的位置在Y, 那么在[Y-1500, Y] 将会有一个点被随机到。如果没有一个被随机到,这个概率是:1-1500/5e4 = 0.97。有97%的机率选不到。但是500次随机之后 (0.97)500 = 2.4e- 7。

    也就是1e7次的期望值才2。

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <cmath>
 8 #include <ctime>
 9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <stack>
13 #include <set>
14 using namespace std;
15 typedef long long LL;
16 typedef unsigned long long uLL;
17 #define ms(a, b) memset(a, b, sizeof(a))
18 #define pb push_back
19 #define mp make_pair
20 #define eps 0.0000000001
21 #define IOS ios::sync_with_stdio(0);cin.tie(0);
22 #define random(a, b) rand()*rand()%(b-a+1)+a
23 const LL INF = 0x3f3f3f3f3f3f3f3f;
24 const int inf = 0x3f3f3f3f;
25 const int maxn = 50000+10;
26 const int mod = 1e9+7;
27 bool vis[maxn];
28 int maxval, pos;
29 int main() {
30 #ifdef LOCAL
31 //    freopen("input.txt", "r", stdin);
32 //    freopen("output.txt", "w", stdout);
33 #endif
34
35 //    IOS
36     srand(time(0));
37     int n, start, x, val, next;
38     scanf("%d%d%d", &n, &start, &x);
39     if(n<=2000){
40         int hh = start;
41         while(1){
42             printf("? %d\n", hh);fflush(stdout);
43             scanf("%d%d", &val, &hh);
44             if(val>=x){
45                 printf("! %d\n", val);
46                 return 0;
47             }
48             if(hh==-1){
49                 printf("! -1\n");
50                 return 0;
51             }
52         }
53     }
54     printf("? %d\n", start);fflush(stdout);
55     scanf("%d%d", &maxval, &next);
56     pos = start;
57     for(int i = 1;i<500;i++){
58         int hh = random(1, n);
59         while(vis[hh])  hh = random(1, n);
60         vis[hh] = 1;
61         printf("? %d\n", hh);fflush(stdout);
62         scanf("%d%d", &val, &next);
63         if(val==x){
64             printf("! %d\n", x);
65             return 0;
66         }
67         if(val<x){
68             if(val>maxval){
69                 maxval = val;
70                 pos = hh;
71             }
72         }
73     }
74     int hh = pos;
75     for(int i = 0;i<1500;i++){
76         printf("? %d\n", hh);fflush(stdout);
77         scanf("%d%d", &val, &hh);
78         if(val>=x){
79             printf("! %d\n", val);
80             return 0;
81         }
82         if(hh==-1){
83             printf("! -1\n");
84             return 0;
85         }
86     }
87     return 0;
88 }

时间: 2024-10-10 18:47:14

Codeforces Aim Tech Round4 (Div2) D的相关文章

Codeforces AIM Tech Round3

打得最烂一场Codeforces,多次都错题,无限WA... A题: 题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次 分析:直接模拟即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm>

AIM Tech R3 div2 E Centroid

思路很明显了,假设是点x,则看它的子树中是否有大于n/2的,如果有,则在该子树中剪去它可以剪的且小于n/2的,接到点x上. 则统计出在以x点为根的子树中,它的各子树可以剪去的且小于n/2的最大子子树.对于除去以x为根的子树的其他部分,记为up,则同样地统计它的可以剪除的符合条件的子树,最后对每个点判断一下就可以了. 代码如下::(额,想的时候对up的这个不知道怎么写~谢指导) #include <iostream> #include <cstdio> #include <cs

Codeforces Round #FF(255) DIV2 C - DZY Loves Sequences

A - DZY Loves Hash 水题,开辟一个数组即可 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main(){ int p,n; cin >> p >> n; vector<bool> buckets(302,false); bool flag = fal

Codeforces gym Hello 2015 Div2 B

Codeforces gym 100571 problem B Problem 设函数F(x),F(1)与F(2)已知,且当 i>=3,F(i)=a*F(i-2)+b*F(i-1).再给一个长度为N的数列A,进行Q次如下操作:每次给一个区间[L, R],对于每个k(L=<k<=R),将A[k]=A[k]+F[k-L+1].最后输出数列A(mod 10^9+7). Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N, Q: [1, 10^

codeforces AIM Tec round 5(div1+div2) C. Rectangles

这道题注意矩形的交集还是矩形,所以求交集搞出一个类似于前缀和后缀和的东西,从头到位暴力,只要满足出去当前矩形的其余n-1个的交集满足左下角小于等于右下角就可以啦 #include<bits/stdc++.h> using namespace std; struct rectangle{ int x1,y1,x2,y2; rectangle operator + (const rectangle &rec) { rectangle newrec; newrec.x1=max(x1,rec

AIM Tech Round 3 (Div. 2)

5/5 这一场是比较水的一场(当然我是指div2),所以前面三题就略过吧... 题D D. Recover the String 题意:让你构造一个01串,给你00,01,10,11的子序列个数,问你有没有满足的串. 题解:这题实际上并不难, 只是分类讨论有点麻烦. 首先是00和11一定是满足n * (n - 1)  / 2,先判定一下 然后得到0的个数x,1的个数y 然后我们注意到,现一开始所有的0放在一起,然后插入一个位置k,那么我们发现01多了k,10多了x – k:假设这y个1 的位置是

Codeforces Round #326(Div2)

CodeForces 588A 题意:Duff喜欢吃肉,想在接下来的n天,每天都有Ai斤肉吃,但每一天肉的单价Pi不定,肉 可以保存不过期,现已知n天每天肉的斤数Ai,以及单价Pi,为了使每天都             有想要的Ai斤肉吃,求最小花费.  思路:cost=Ai*min(pi)  1<=i<=n; 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using

Codeforces Round #328(Div2)

CodeForces 592A 题意:在8*8棋盘里,有黑白棋,F1选手(W棋往上-->最后至目标点:第1行)先走,F2选手(B棋往下-->最后至目标点:第8行)其次.棋子数不一定相等,F1,F2中其中一个           棋子最先到达目标点对应方胜利. 思路:W,B棋子分别只能上.下,所以需知道:离第一行最近的W棋距离S1(并且这个W上方没有B),离第八行最近的B棋距离S2(这个B下方没有W) 胜利者为 S1<=S2?F1:F2 注意:S1==S2时 F1胜. 代码: 1 #inc

AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)

A. Diversity time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Calculate the minimum number of characters you need to change in the string s, so that it contains at least k different letters,