【uva 12174】Shuffle(算法效率--滑动窗口)
题意:假设一种音乐播放器有一个乱序的功能,设定每播放S首歌为一个周期,随机播放编号为1~S的歌曲。现在给一个长度为N的部分播放记录,请统计下次随机排序所发生的时间的可能性种数。(1≤S,N≤100000)
解法:由“连续的S个数”想到滑动窗口。O(n)循环一次,每次判断一个周期的[i-S+1,i]是否可行,记录入tf[i]。最后O(n)枚举第一个“窗口”的初始结束位置来得到可能性种数。
实现:在N个数后另外添加S-1个与之前都互不相同的数,以补全最后几个数的周期。当然,像一开始的几个数一样特判也可以。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7 const int N=100010,D=100010;
8
9 int a[2*N],v[2*N];
10 bool tf[2*N];
11
12 int main()
13 {
14 int T,n,s;
15 int i,j,k,tot;
16 scanf("%d",&T);
17 while (T--)
18 {
19 scanf("%d%d",&s,&n);
20 memset(tf,0,sizeof(tf));
21 memset(v,0,sizeof(v));
22 for (i=1;i<=n;i++) scanf("%d",&a[i]);
23 for (i=1;i<s;i++) a[n+i]=s+i;
24 tot=0;
25 for (i=1;i<n+s;i++)
26 {
27 if (v[a[i]])
28 {
29 k=v[a[i]];
30 for (j=v[a[i]];j>=i-tot;j--)
31 v[a[j]]=0;
32 tot=i-k-1;
33 }
34 if (tot==s) v[a[i-tot]]=0,tot--;
35 tot++,v[a[i]]=i;
36 if (tot==s) tf[i]=true;
37 if (i<s && tot==i) tf[i]=true;
38 }
39 tot=0;
40 for (i=1;i<=s;i++)
41 {
42 bool ok=true;
43 for (j=i;j<n+s;j+=s)
44 if (!tf[j]) {ok=false;break;}
45 if (ok) tot++;
46 }
47 printf("%d\n",tot);
48 }
49 return 0;
50 }
另外,我几天前按紫书说的“直接一点”的方法:据相同的数的相邻出现排除一些非法区间,利用这些并集得出答案。打了很久,调了很久,但一直WA~(搞得我这之后去做了几题图论了。qwq)求正解~
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7 const int N=100010,D=100010;
8 //Shuffle 2 WA
9 int a[N],last[N],first[N];
10 int mmin(int x,int y) {return x<y?x:y;}
11 int mmax(int x,int y) {return x>y?x:y;}
12 int main()
13 {
14 int T,n,s;
15 scanf("%d",&T);
16 while (T--)
17 {
18 scanf("%d%d",&s,&n);
19 for (int i=1;i<=s;i++)
20 last[i]=first[i]=-s;
21 int l=s+1,r=0,x,ans=s;
22 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
23 for (int i=1;i<=n;i++)
24 {
25 if (first[a[i]] && i-first[a[i]]<s+1) {ans=0;break;}
26 {
27 int t=i-last[a[i]];
28 if (t<=s)
29 {
30 int ll=(i+1)%s,rr=last[a[i]]%s;
31 if (ll>rr) x=ll,ll=rr,rr=x;
32 l=mmin(l,ll),r=mmax(r,rr);
33 }
34 }
35 first[a[i]]=last[a[i]],
36 last[a[i]]=i;
37 }
38 if (ans && l<=r) ans-=r-l+1;
39 if (s==1) ans=1;
40 printf("%d\n",ans);
41 }
42 return 0;
43 }
WA
【uva 12174】Shuffle(算法效率--滑动窗口)的更多相关文章
- UVA - 12174 Shuffle (预处理+滑动窗口)
题意:已知歌单中的歌曲数目s,和部分的播放历史,问下一首可能播放的歌曲种数. 分析: 1.按照歌单数目s,将播放历史划分为几部分. 2.将播放历史的n首歌曲之前加上s首歌曲,之后加上s首歌曲,为防止标 ...
- 【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)
题意:求长度为N的序列中,最长的一个无重复元素的连续子序列. 解法:[L,R]每次R++或L++延伸就可以得到答案. 实现:(1)next[],last[]--O(n): 1 #include< ...
- UVa 12174 Shuffle(滑动窗口)
https://vjudge.net/problem/UVA-12174 题意: 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个1~n的排列,然后就按这个排列顺序播放歌曲.播放完 ...
- UVa 12174 Shuffle (滑动窗口)
题意:你正在使用的音乐播放器有一个所谓的乱序播放功能,即随机打乱歌曲的播放顺序.假设一共有s首歌, 则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序.继续播放,依次类推.注意,当s首歌播放完 ...
- UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口
1.经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认. 2.nagle算法: 一个TCP连接 ...
- UVa 11572 Unique snowflakes【滑动窗口】
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...
- Uva - 12174 - Shuffle
用滑动窗口的思想,用一个数组保存每个数在窗口中出现的次数.再用一个变量记录在窗口中恰好出现一次的的数的个数,这样可以枚举所有可能的答案,判断它所对应的所有串口,当且仅当所有的串口均满足要求时这个答案可 ...
- TCP之四:TCP 滑动窗口协议 详解
滑动窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口:同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.发送窗口和接收窗口的序号的 ...
- Sentinel源码解析三(滑动窗口流量统计)
前言 Sentinel的核心功能之一是流量统计,例如我们常用的指标QPS,当前线程数等.上一篇文章中我们已经大致提到了提供数据统计功能的Slot(StatisticSlot),StatisticSlo ...
随机推荐
- 【Java基础】常用类
常用类 字符串相关的类 String类:代表字符串,使用一对 "" 引起来表示. public final class String implements java.io.Seri ...
- Java并发包源码学习系列:详解Condition条件队列、signal和await
目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...
- 【Linux】ssh反映特别慢,但是网络没有问题的时怎么办
用crt连接服务器的时候,感觉很久才有反映,大约持续2秒以上,这种情况下,是解析的问题 这里有一个方法可以优化ssh cd /etc/ssh/ cp sshd_config sshd_config.b ...
- 数据分析 Pandas 简介和它的的数据结构
本文主要讲Pandas 的Series和DataFrame 的相关属性和操作 1.Series的相关属性和操作# --Series是一种类似于一维数组的对象,只能存放一维数组!由以下两部分组成:# v ...
- WMIC 查看bios配置信息
如何查看我们的主板上的BIOS信息呢?有办法,不用安装任何软件,只需要windows自带的命令提示符就行,哈哈 WMIC BIOS LIST FULL /FORMAT:VALUE 如果第一次使用wmi ...
- C语言中二维数组声明时,探究省略第一维的原因
我们在使用二维数组作为参数时,我们既可以指明这个数组各个维度的维数,同时我们也可以省略一维,但是二维却不能省略.why呢?由于编译器原理的限制,在一个数组Elemtype test[m][n]中,访问 ...
- 在vCenter Server中添加ESXi 主机失败的问题
报错:出现了常规系统错误: Timed out waiting for vpxa to start 报错是这个,我看了下vcenter的版本是6.5,如图右上,这个报错是因为我ESXI主机是6.7的, ...
- Bitter.Core系列十:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore 之 Log 日志
Bitter 框架的 Log 全部采用 NLog 日志组件.Bitter.Core 的 执行语句的日志记录 Nlog 日志级别为:info. 如果想要查看Bitter.Core 的执行SQL,先要去 ...
- 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化
<英雄联盟>在线服务运维之道 - InfoQ https://www.infoq.cn/article/running-online-services-riot/ 第一章 简 介 我是Jo ...
- Redis 实战 —— 10. 实现内容搜索、定向广告和职位搜索
使用 Redis 进行搜索 P153 通过改变程序搜索数据的方式,并使用 Redis 来减少绝大部分基于单词或者关键字进行的内容搜索操作的执行时间. P154 基本搜索原理 P154 倒排索引 (in ...