[骗分技巧——随机化Ⅱ] [Poi2014]Couriers,CodeChef - TKCONVEX

文章目录

  • [Poi2014]Couriers
    • problem
    • solution
    • code
  • CodeChef - TKCONVEX
    • problem
    • solution
    • code

随机算法的典型套路:枚举太花时,转化为随机一个数。然后通过对正确率的分析,选择一个随机的次数来卡。前提是要保证每一次检验随机是否为答案的时间复杂度要能够接受。一般不超过 nlog⁡nn\log nnlogn

[Poi2014]Couriers

problem

BZOJ 3524

solution

如果有解,也就是说区间内的随机选择一个数是答案的概率不大于 12\frac 1 221。否则怎么随机都无解。

可以预处理相同值的数出现位置,二分查找求出某个值在 [l,r][l,r][l,r] 区间的出现次数。

所以一次判断是 O(log⁡n)O(\log n)O(logn) 的。

随机 202020 次,正确率就在 1−10−51-10^{-5}1105 左右了。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 500005
int n, m;
int a[maxn];
vector < int > pos[maxn];int find_l( int x, int p ) { int l = 0, r = pos[x].size() - 1, ans;while( l <= r ) {int mid = l + r >> 1;if( pos[x][mid] >= p ) ans = mid, r = mid - 1;else l = mid + 1;}return ans;
}int find_r( int x, int p ) {int l = 0, r = pos[x].size() - 1, ans;while( l <= r ) {int mid = l + r >> 1;if( pos[x][mid] <= p ) ans = mid, l = mid + 1;else r = mid - 1;}return ans;
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a[i] );pos[a[i]].push_back( i );}mt19937 wwl(time(0));for( int i = 1, l, r;i <= m;i ++ ) {scanf( "%d %d", &l, &r );uniform_int_distribution < int > range( l, r );for( int k = 1;k <= 20;k ++ ) {int x = range( wwl ); x = a[x];int L = find_l( x, l );int R = find_r( x, r );if( R - L + 1 << 1 > r - l + 1 ) { printf( "%d\n", x ); goto next_turn; }}printf( "0\n" );next_turn:;}return 0;
}

CodeChef - TKCONVEX

problem

vjudge链接

solution

定理1 能构成多边形的线段,必须满足任意一条边长度都小于剩余所有边长度的总和。

这是显然的,因为要形成封闭的图形,可以看作是这条边是最后一条连接两个端点的直线段,其余线段绕成了一个弧形。

事实上只需要长度最长的线段满足这个性质即可。

此定理只能保证构成多边形,但不保证是凸多边形。所以提出下一个定理。

定理2 任意非凸多边形都可以通过对边的旋转和平移构成一个新凸多边形。

在本题中,可以选择的集合为 (n2k)(2kk)\binom{n}{2k}\binom{2k}{k}(2kn)(k2k),已经是非常大了,不可能一个一个检验。

定理3 假设有解,那么一定存在一个解(大小为 kkk 的子集)满足:对所有线段长度排序后,这个子集的元素对应排序后序列的一段连续区间。

证明:显然。假设子集为 SSS,排序后的序列为 PPP

如果其对应的元素构成不连续的区间。即 ∃iPi∈S∧Pi+1∉S\exist_iP_i\in S\wedge P_{i+1}\notin SiPiSPi+1/S

找到满足条件的 iii,则 iii 肯定是一段连续区间的右端点,保证 iii 不是若干个不连续区间的最右端点。

重复操作移除 PiP_iPi,加入 Pi+1P_{i+1}Pi+1。直到将左边的若干个不连续区间和最右边的一个连续区间拼接成一整个大连续区间。

这样操作后,可以发现长度最大的依然是最右边的端点,没有移动过,但是其余线段的长度都有所增长。

既然原来都是符合条件的子集,那么现在肯定也是一个符合条件的子集。

题目要求两个大小为 kkk 的凸多边形。

不妨设第一个凸多边形从边集合为 SSS 中,选择另一个凸多边形从边集合 Sˉ\bar{S}Sˉ 中选择。

满足 S⋂Sˉ=∅∧S⋃Sˉ=ΩS\bigcap\bar{S}=\empty\wedge S\bigcup \bar{S}=\OmegaSSˉ=SSˉ=Ω

那么对于每一条线段,有 12\frac 1 221 的概率属于 SSS12\frac 1 221 的概率属于 Sˉ\bar{S}Sˉ。换言之,选出任意一个子集的概率是相同的。

那么就对每条边随机其属于哪个集合。

随机划分集合后,O(n)O(n)O(n) 的可以做到快速判断这个集合能否选出一个子集构成凸多边形。

最后来分析一下这个随机的正确率。

划分的总方案数为 2n2^n2n。考虑极端最坏情况,有且仅有两个互不相交的集合 X,YX,YX,Y 可以构成凸多边形。

那么一个随机划分方案有解,当且仅当 S⋂X=X∧S⋂Y=∅S\bigcap X=X\wedge S\bigcap Y=\emptySX=XSY= 或者 S⋂Y=Y∧S⋂X=∅S\bigcap Y=Y\wedge S\bigcap X=\emptySY=YSX=

这样的方案数为 2n−2k×22^{n-2k}\times 22n2k×2

因此在最坏情况下选出一个合法划分的概率为 122k−1\frac{1}{2^{2k-1}}22k11

设随机运行以上算法 ttt 次,那么 ttt 最多取到 200002000020000 左右,时间复杂度为 O(nlog⁡n+tn)O(n\log n+tn)O(nlogn+tn)

k=6k=6k=6 时,正确率为 1−(1−1211)t≈1−10−51-(1-\frac{1}{2^{11}})^t≈1-10^{-5}1(12111)t1105

注意:原题目 k∈[3,10]k\in[3,10]k[3,10]。这个随机算法是不能通过的。所以下面的代码不保证正确性。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
#define int long long
struct node { int val, id; }a[maxn];
int n, k;
int s[2][maxn];
pair < int, int > ans[2];signed main() {scanf( "%lld %lld", &n, &k );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i].val ), a[i].id = i;sort( a + 1, a + n + 1, []( node x, node y ) { return x.val < y.val; } );mt19937 wwl;uniform_int_distribution < int > range( 0, 1 );for( int t = 1;t <= 20000;t ++ ) {s[0][0] = s[1][0] = 0;for( int i = 1;i <= n;i ++ ) {int x = range( wwl );s[x][++ s[x][0]] = i;}int cnt = 0;for( int j = 0;j <= 1;j ++ ) {for( int i = 1, len = 0, sum = 0;i <= s[j][0];i ++ ) {len ++, sum += a[s[j][i]].val;if( len > k ) sum -= a[s[j][i - k]].val;if( len == k and sum > (a[s[j][i]].val << 1) ) {ans[j] = make_pair( i - k + 1, i );cnt ++;break;}}}if( cnt == 2 ) goto yes;}no : return ! printf( "No\n" );yes :printf( "Yes\n" );for( int i = 0;i <= 1;i ++ )for( int j = ans[i].first;j <= ans[i].second;j ++ )printf( "%lld ", a[s[i][j]].id );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…

I love max and multiply HDU - 6971(详细解答)

I love max and multiply HDU - 6971 题意&#xff1a; 数组a和b&#xff0c;现在构造一个数组c&#xff0c;使得c[k]max(a[i] * b[j]) , i&j>k 求数组c的和 题解&#xff1a; 我们可以考虑求出所有Dkmax(Ai * Bj)并满足i&jk&#xff0c;然后再从后向前取&#…

[NewLife.XCode]数据模型文件

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

[HNOI2013]数列(差分)

[HNOI2013]数列 problem 洛谷链接 solution 假设每天的股价为 a[i]a[i]a[i]。则需满足 ∀i<ka[i1]−a[i]≤m\forall_{i<k}a[i1]-a[i]\le m∀i<k​a[i1]−a[i]≤m。又有参数满足 m(k−1)<nm(k-1)<nm(k−1)<n。 也就是说每天的股价都可以取到上限&#xf…

24dian(牛客多校第三场)

24dian(牛客多校第三场) 题意&#xff1a; 给你n张牌&#xff0c;每张牌的大小为1 ~ 13&#xff0c;问这些牌与加减乘除任意组合(可以使用括号)&#xff0c;且但所有的有效解在计算过程中都涉及到分数&#xff0c;即非整数&#xff0c;能否组成答案m&#xff0c;如果可以&…

[NewLife.XCode]高级增删改

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

problem AtCoder solution 注意&#xff1a;本题不是平等博弈&#xff0c;因为先手只能取最左边&#xff0c;后手只能取最右边。 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 [l,r][l,r][l,r] 等待操作&#xff0c;第 lll 堆石子数量为 kkk 的时候&#xff0c;先手是…

P4147 玉蟾宫

P4147 玉蟾宫 题意&#xff1a; 给你一个n * m的矩阵&#xff0c;矩阵每个值有F或R&#xff0c;求最大的全为F的矩阵&#xff0c;输出面积 * 3 题解&#xff1a; 很明显&#xff0c;求最大01矩阵&#xff0c;悬线法或者单调栈 对于模板除了要记熟还要知道原理&#xff0c;不…

[NewLife.XCode]数据初始化

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

I love counting HDU - 6964

I love counting HDU - 6964 题意&#xff1a; 一个数组c&#xff0c;给你了(l,r)一个范围&#xff0c;问这个范围内满足ci ^ a < b数量的有多少&#xff1f; 题解&#xff1a; 我第一反应是莫队&#xff0c;直接莫队得到结果&#xff0c;但是发现样例不对&#xff0c;再…

CF98E Help Shrek and Donkey(纳什博弈 + 大讨论)

problem 洛谷链接 solution 纳什均衡 是博弈论中一种解的概念&#xff0c;它是指满足下面性质的策略组合&#xff1a;任何一位玩家在此策略组合下单方面改变自己的策略&#xff0c;其他玩家策略不变&#xff0c;都不会提高自身的收益。 一个策略组合被称为纳什均衡当且仅当…

[NewLife.XCode]反向工程(自动建表建库大杀器)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

树上启发式合并

文章内容选自OI Wiki 参考博客 内容&#xff1a; 树上启发式合并&#xff08;dsu on tree&#xff09;对于某些树上离线问题可以速度大于等于大部分算法且更易于理解和实现的算法。 他是用来解决一类树上询问问题&#xff0c;一般这种问题有两个特征&#xff1a; 只有对子树…

CF1270H Number of Components(线段树)

problem 洛谷链接 solution 定理 若 i<ji<ji<j 且 i,ji,ji,j 联通&#xff0c;则必有 k∈(i,j)k\in(i,j)k∈(i,j) 也与 i,ji,ji,j 联通。 下面给出证明&#xff0c;挺显然的。 若 ai<aja_i<a_jai​<aj​&#xff0c;则一定有 ai<ak∨ak<aja_i<…

tex模板

\documentclass{beamer} \usetheme{Madrid} \usecolortheme{default} \usepackage{ctex} \usefonttheme[math]{serif}\usepackage{graphicx} \graphicspath{{img/},{pics/}} % 图片在img目录\title{} \author{} \institute{} \date{\today} \begin{document}\maketitle\begin{f…

Wexflow:C#中的开源工作流引擎

Wexflow是一个高性能、可扩展、模块化和跨平台的工作流引擎。Wexflow在GitHub&#xff1a;https://github.com/aelassas/Wexflow。Wexflow的目标是在没有用户干预的情况下自动执行重复任务。在Wexflow的帮助下&#xff0c;构建自动化和工作流过程变得简单。Wexflow还有助于使长…

分析数学笔记

文章目录夹逼收敛定理(P45):单调收敛定理(P50):闭区间套定理(P56)&#xff1a;有限覆盖定理(P59)&#xff1a;可数集(P62)&#xff1a;聚点(P62)&#xff1a;聚点原理(P62)&#xff1a;波尔查诺-魏尔斯特拉斯定理(P64)柯西序列&柯西收敛准则(P65)压缩映照原理(P67)上下极限…

ASP.NET Core 沉思录 - Logging 的两种介入方法

ASP.NET Core 中依赖注入是一个很重要的环节。因为几乎所有的对象都是由它创建的&#xff08;相关文章请参见《ASP.NET Core 沉思录 - ServiceProvider 的二度出生》&#xff09;。因此整个日志记录的相关类型也被直接添加到了 IServiceCollection 中。今天我们将介绍各个接口/…

CF936D World of Tank(思维dp)

problem 洛谷链接 solution 有一种 dpdpdp 并不常见。其主要思想大概就是积累后再支出 / 先预支后再填充。 本题就是积累后再支出。显然炮冷却好了后就一直处于可用状态&#xff0c;玩没玩过游戏的都知道一冷却好就打一定不会劣于等一会再打&#xff0c;因为这道题的炮也没…

C# 中的Async 和 Await 的用法详解

众所周知C#提供Async和Await关键字来实现异步编程。在本文中&#xff0c;我们将共同探讨并介绍什么是Async 和 Await&#xff0c;以及如何在C#中使用Async 和 Await。同样本文的内容也大多是翻译的&#xff0c;只不过加上了自己的理解进行了相关知识点的补充&#xff0c;如果你…