Gym 101667I Slot Machines
题意:给定n(n≤106)个数,要求将它化为混偱环小数的形式,即前k个数不参与循环,之后所有数以p为循环节长度进行循环。求k和p,要求k+p尽量小,k+p相等时要求p尽量小。
样例1
输入:
6
612534 3157 423 3157 423 3157
输出:
1 2
样例2
输入:
9
1 2 1 3 1 2 1 3 1
输出:
0 4
分析:想了两个晚上,没有想到有什么数据结构可以支持这种操作,想要二分答案又不满足单调性,于是去请教TJW,TJW一语点醒梦中人:(还是log n的?,不大清楚)。那么直接暴力枚举p,然后均摊O(ln n)验证一下即可。以上是TJW的原话,具体细节还要处理一下:比如如何O(1)比对两段数?哈希即可,具体写法是设一个base数组,base[i]表示哈希常数key的i次方,再开一个hash数组,hash[i]表示前i位的哈希值,具体构造方法是,hash[i]=hash[i-1]*key。然后求l-r的hash值时只要求hash[r]-hash[l-1]*base[r-l+1]。除此以外,还有一个问题:循环节的开头(结尾)不一定是完整的,如何用较小的复杂度计算这段不完整的开头的长度?如果直接一个一个判断,整体复杂度就退化为O(n^2)了。这里我的解决方法是二分(刚好满足单调性),整体复杂度大概是O(nlogn + nlnn)。
/* Gym 101667I Slot Machines
1st Edition:2018.1.13 Saturday
Algorithm:Simulation
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cctype>
using namespace std; #define is_lower(c) (c>='a' && c<='z')
#define is_upper(c) (c>='A' && c<='Z')
#define is_alpha(c) (is_lower(c) || is_upper(c))
#define is_digit(c) (c>='0' && c<='9')
#define stop system("PAUSE")
#define ForG(a,b,c) for(int (a)=c.head[b];(a);(a)=c.E[a].nxt)
#define For(a,b,c) for(int (a)=(b);(a)<=(c);++a)
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define shl(x,y) ((x)<<(y))
#define shr(x,y) ((x)>>(y))
#define mp make_pair
#define pb push_back
#ifdef ONLINE_JUDGE
#define hash rename_hash
#define next rename_next
#define prev rename_prev
#endif
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef double db;
const ll inf=2000000007LL;
const double EPS=1e-;
const ll inf_ll=(ll)1e18;
const ll maxn=1000005LL;
const ll mod=1000000007LL; int n;
int a[maxn]; ull base[maxn];
ull hash[maxn];
const ll hash_base=; inline ull get_hash(int l,int r){
return (hash[r]-hash[l-]*base[r-l+]);
} int main(){
scanf("%d",&n);
base[]=;
For(i,,n) base[i]=base[i-]*hash_base;
For(i,,n){
scanf("%d",a+i);
hash[i]=hash[i-]*hash_base+a[i];
}
/*
For(i,1,n) printf("%llu ",hash[i]);
puts("");
*/
int ansk=inf>>,ansp=inf>>;
For(i,,n){
int pos=n;
ull nhash=get_hash(n-i+,n);
while(pos-i>=){
if(get_hash(pos-i+,pos)!=nhash) break;
pos-=i;
}
int l=,r=i+,mid,res=;
while(l<r){
mid=(l+r)>>;
if(pos-mid+<= || get_hash(pos-mid+,pos)!=get_hash(n-mid+,n)) r=mid;
else{l=mid+;res=mid;}
}
pos-=res;
if(i+pos<ansk+ansp){
ansk=pos;
ansp=i;
}
// printf("%d %d\n",pos,i);
}
printf("%d %d\n",ansk,ansp);
return ;
} /*
6
1 2 3 4 3 4 6
1 2 3 4 5 6 6
1 2 3 4 1 29 6
612534 3157 423 3157 423 3157 9
1 2 1 3 1 2 1 3 1 */
细节还要看代码
UPD.调和级数O(ln n) QwQ
Gym 101667I Slot Machines的更多相关文章
- 用KMP征服循环节问题
以前我还是写过KMP的文章的 现在我们可以求一下循环节啊 Slot Machines Gym - 101667I #include<bits/stdc++.h> using namespa ...
- 【转载】Bandits for Recommendation Systems (Part I)
[原文链接:http://engineering.richrelevance.com/bandits-recommendation-systems/.] [本文链接:http://www.cnblog ...
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest Solution
A:Broadcast Stations 留坑. B:Connect3 题意:四个栈,每次放棋子只能放某个栈的栈顶,栈满不能放,现在给出(1, x) 表示黑子放在第x个栈的第一个位置,白子放在第b个栈 ...
- 2017 ACM ICPC Asia Regional - Daejeon
2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest
题目传送门 只打了三个小时. A. Broadcast Stations B. Connect3 补题:zz 题解:因为格子是4*4的,而且每次落子的位置最多是只有四个,再加上剪枝,情况不会很多,直接 ...
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest PART(10/12)
$$2017-2018\ ACM-ICPC,\ Asia\ Daejeon\ Regional\ Contest$$ \(A.Broadcast\ Stations\) \(B.Connect3\) ...
- codeforces Gym 100187J J. Deck Shuffling dfs
J. Deck Shuffling Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...
- PatentTips - Method for network interface sharing among multiple virtual machines
BACKGROUND Many computing systems include a network interface card (NIC) to provide for communicatio ...
随机推荐
- 39.Linux应用调试-strace命令
1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...
- 【十九】require和include的区别
1.require是一个函数,include是一个关键字 2.require是无返回值,include有返回值 3.include()会产生一个警告,而require()则导致一个致命的错误(出现错误 ...
- UIImage类方法总结及UIImage生成方法对比
http://mp.weixin.qq.com/s/A900w0Y5pGjuaB4j9Os9ww1.UIImage 生成方法的对比 Apple官方的文档为生成一个UIImage对象提供了两种方法: 1 ...
- Visual Studio 2017 : client version 1.22 is too old
使用Vs2017 编译 eShopOnContainers-ServicesAndWebApps 时,报了错误: Microsoft.DotNet.Docker.CommandLineClientEx ...
- JavaWeb之数据源连接池(4)---自定义数据源连接池
[续上文<JavaWeb之数据源连接池(3)---Tomcat>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究其原 ...
- ls /proc/$$,self/fd/3,255 引发的一些琐事
我在使用bash的时候通常会利用它的自动补全功能来看看文件夹下的内容(连按两下Tab键),例如: 说明Music文件夹下有这三个文件,我也就不需要提前用ls命令来确定了. 但是最近我在查看当前shel ...
- lua的通用print函数
1.前言 最近在做关于openresty方面的工作,涉及到lua脚本语言,经常需要打日志查看内容.普通的print函数遇到nil或table时,非常无力.而项目中的代码经常遇到参数为nil或table ...
- Java 读者写者问题
实验存档.V 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; impor ...
- 串口调试者v2.1------开源c#串口调试工具
第一步:上图 第二步:上代码 >>>>>>>>>>>源代码下载<<<<<<<<< ...
- SpringBoot初步
1.创建maven 项目 quickstart类型 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...