首页 > 其他分享 >qoj1138 Counting Mushrooms

qoj1138 Counting Mushrooms

时间:2024-05-05 19:55:39浏览次数:29  
标签:... le sqrt Mushrooms 算法 qoj1138 序列 操作 Counting

交互题。

有一个隐藏的 01 序列 \(a\) ,你只知道 \(a\) 的长度,并记为 \(n\) 。保证 \(a_1=0\) 。你可以执行以下操作:

  • 询问一个序列 \(b\) ,满足两两不同且长度在 \([2,1000]\) 之间。交互库会返回 \(\sum[a(b_i)\not=a(b_{i+1})]\) 。

请在 \(226\) 次操作内求出 \(a\) 中 \(0\) 的个数。

\(2\le n\le 20000\) 。


算法一

对于每个 \(i\in[2,n]\) ,把下标 \(1\) 和下标 \(i\) 放在一个序列里做一次询问。

操作次数:\(19999\) 。

算法二

这个算法一看上去非常蠢,能不优化一下?

事实上,算法一可以直接求出所有 \(a_i\) ,而我们只要求 \(\sum a_i\) 就好了,感觉上就很浪费。

基于这个思路,考虑这样一种操作:每次询问 0 A 0 B 0 C 0 ... ,发现如果每个数是 \(0\) 就会贡献 \(0\) ,是 \(1\) 就会贡献 \(2\) ,那么把结果除以二就是 A B C ... 的和。

直接做仍然要 \(20000\) 次左右(因为一次还是只能做一个,就是算法一),但是我们可以先用算法一问出一些值,然后再做上面那个操作。记先做 \(B\) 次算法一,不难发现我们只要做 \(O(B+\frac nB)\) 次操作就可以问出所有数的和。于是我们就得到了一个 \(O(\sqrt n)\) 的做法。

还有一个小问题,就是可能我们会得到很多 \(1\) ,但是没有 \(0\) ,这时我们直接每次问 1 A 1 B 1 C 1 ... 就好了。所以需要问出 \(2B\) 个位置才保险。最后需要 \(2B+\frac nB\) 次操作,\(B\) 取 \(\sqrt {2n}\) 最优,此时是 \(2\sqrt {2n}\) 。

操作次数:

标签:...,le,sqrt,Mushrooms,算法,qoj1138,序列,操作,Counting
From: https://www.cnblogs.com/Z-301/p/18173793

相关文章

  • Codeforces 954H Path Counting
    令输入的为\(a'\),同时\(a'_0=1\)。对其做一个前缀积\(a_i=\prod\limits_{i=0}^ia'_i\),对于\(i\gen\),认为\(a_i=0\)。那么\(a_i\)就相当于是深度\(i+1\)的点的个数。同时也可以得到根的深度为\(l\)时子树内深度为\(r\)的深度的点数为\(\dfrac{a_{r-......
  • CF1748E Yet Another Array Counting Problem の Solution
    Link有些人还是啥都不会。看到题目应该能想到这是笛卡尔树的性质,因为每一对\((l,r)\)都满足最左端最大值位置相同,所以说明在笛卡尔树上,每一对点的lca相同,说明\(a\)和\(b\)序列的笛卡尔树相同。我们以下标为键,\(a_i\)为值建立大根笛卡尔树,现在题目就转换成在这个树上填......
  • (算法)Lake Counting <Flood Fill 洪水灌溉模型>
    题目:题解:#include<stdio.h>intn,m;chararr[110][110];//元数据数组intcount=0;//计数器intdx[8]={1,1,1,-1,-1,-1,0,0};intdy[8]={-1,0,1,-1,0,1,1,-1};intt[110][110];//判断是否被选择voiddfs(intx,inty){for(inti=0;i<......
  • Kirill and Mushrooms
    原题链接题解1.选k个数,就会有k-1个数没法选。我们可以倒着来,每少选一个数,就会多一个数可以选,添加总比删除简单2.最小的那个数,也就是第k小的数,因此我们可以维护一个大小为k的优先队列,最小值就是队首元素code#definelllonglong#include<bits/stdc++.h>usingnamespacest......
  • Counting Rhyme
    这道题目就是因为对数论容斥不熟悉导致的。。。之前也做到过看这篇题解首先这篇题解用到了一个很大的纲领:公约数是最大公约数的约数然后看下\(g_k\)怎么求:由于\(g_k\)表示的是\(k|gcd(a_i,a_j)\)的对数,相当于\(k\)是\(a_i,a_j\)的公约数,所以我们把数组中\(k\)的倍数全部标出来,......
  • CodeForces 1943D2 Counting Is Fun (Hard Version)
    洛谷传送门CF传送门被自己的赛时智障操作气笑了。谁告诉你容斥钦定了几个要记到状态里面的。。。/tuu显然先找“好数组”的充要条件。对原数组\(a\)差分,设\(b_i=a_i-a_{i-1}\)。那么一次可以选择一对\((i,j)\)满足\(i\lej-2\),然后给\(b_i\)减\(1\),给\(b_......
  • CF1857G Counting Graphs 题解
    题目描述给定一棵最小生成树,求有多少张图的最小生成树是给定的树,并且这张图的所有边边权不超过\(S\)。思路考虑在最小生成树中加边。我们回顾一下Kruskal的过程:找到没被用过的,最小的边判断这条边的两端是否在一个联通块中加入这条边,将两端的联通块连在一起根据第三条......
  • [ABC259Ex] Yet Another Path Counting 题解
    Description有\(N\)行\(N\)列的网格图,只能向下或向右走,合法路径的开端和结尾的格子上数字一样找到合法路径条数,对\(998244353\)取模\(1\leqN\leq400,1\leqa_{i,j}\leqN^2\)。Solution有一个\(O(n^4)\)的做法是每次枚举起点和终点然后用组合数计算答案,但是由于同......
  • P10013 Tree Topological Order Counting 题解
    首先题目里面写了每一个数都有权值,一般这种题只能去想求出每一个的具体方案数,那么也就是我们得求出\(h_{i,j}\)表示在所有合法拓扑序中\(a_i=j\)的方案数。一颗树的拓扑序数量是\(\dfrac{n!}{\prodsiz_i}\),相信大家都知道。因为我们需要保证这一棵树满足拓扑排序的条件,不......
  • double counting 小记
    前言:doublecounting即算两次,可以对比两次结果得出一些有用的结论。例1:求证:\[\sum_{i=0}^ni\binom{n}{i}=n\times2^{n-1}\]证明:考虑计数问题:从\(\{1,2,3,\dotsn\}\)中选取一个元素\(a\)和一个子集\(A\),要求\(a\inA\),求方案数。先取\(A\)再取\(a\),我们根据......