题意假设一种音乐播放器有一个乱序的功能,设定每播放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(算法效率--滑动窗口)的更多相关文章

  1. UVA - 12174 Shuffle (预处理+滑动窗口)

    题意:已知歌单中的歌曲数目s,和部分的播放历史,问下一首可能播放的歌曲种数. 分析: 1.按照歌单数目s,将播放历史划分为几部分. 2.将播放历史的n首歌曲之前加上s首歌曲,之后加上s首歌曲,为防止标 ...

  2. 【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)

    题意:求长度为N的序列中,最长的一个无重复元素的连续子序列. 解法:[L,R]每次R++或L++延伸就可以得到答案. 实现:(1)next[],last[]--O(n): 1 #include< ...

  3. UVa 12174 Shuffle(滑动窗口)

    https://vjudge.net/problem/UVA-12174 题意: 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个1~n的排列,然后就按这个排列顺序播放歌曲.播放完 ...

  4. UVa 12174 Shuffle (滑动窗口)

    题意:你正在使用的音乐播放器有一个所谓的乱序播放功能,即随机打乱歌曲的播放顺序.假设一共有s首歌, 则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序.继续播放,依次类推.注意,当s首歌播放完 ...

  5. UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口

    1.经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认. 2.nagle算法: 一个TCP连接 ...

  6. UVa 11572 Unique snowflakes【滑动窗口】

    题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...

  7. Uva - 12174 - Shuffle

    用滑动窗口的思想,用一个数组保存每个数在窗口中出现的次数.再用一个变量记录在窗口中恰好出现一次的的数的个数,这样可以枚举所有可能的答案,判断它所对应的所有串口,当且仅当所有的串口均满足要求时这个答案可 ...

  8. TCP之四:TCP 滑动窗口协议 详解

    滑动窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口:同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.发送窗口和接收窗口的序号的 ...

  9. Sentinel源码解析三(滑动窗口流量统计)

    前言 Sentinel的核心功能之一是流量统计,例如我们常用的指标QPS,当前线程数等.上一篇文章中我们已经大致提到了提供数据统计功能的Slot(StatisticSlot),StatisticSlo ...

随机推荐

  1. python virtualenv 基本使用

    下载 pip install virtualenv 校验是否成功 virtualenv --version 使用 创建env环境 要写一个新项目,使用env先创建环境 cd xx\xx\xx\ # 进 ...

  2. js 数组的方法总结

    1.Array.map() 此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组 let arr = [1, 2, 3, 4, 5]     let newAr ...

  3. node.js中使用http-proxy-middleware请求转发给其它服务器

    var express = require('express');var proxy = require('http-proxy-middleware'); var app = express(); ...

  4. Python基础语法6-冒泡排序

    用for循环实现冒泡排序(升序): array = [3,2,1]  for i in range(len(array) - 1, 0, -1):  for j in range(0, i):  if ...

  5. Linux 文件查看相关的一些命令

    文件压缩解压命令 # 解压 xxx.xz 并删除 xz -d test.tar.xz # 打包成 xxx.tar , 语法: tar -cvf 最后包名.tar ./要打包文件 ./要打包的文件 ta ...

  6. EXPORT和IMPORT使用示例

    1 report ztestprog. 2 data:begin of itab1 occurs 0, 3 ff(10), 4 end of itab1. 5 data:itab2 like itab ...

  7. ABAP中SQL语句,指定索引(oracle)

    ①常用的两种方法: 1.指定使用全表扫描:%_HINTS ORACLE 'FULL(table_name)' 表示扫描整个表 2.指定索引:%_HINTS ORACLE 'INDEX("ta ...

  8. MySQL下载与安装教程

    一,下载篇 1,首先访问MySQL官网下载页,https://dev.mysql.com/downloads/mysql/ 如果是MAC系统,操作系统请选择macOS,Windows则选择Window ...

  9. mastercam2018安装教程

    安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文. [安装环境]:Win7/Win8/Win10 1.选中[Mastercam2018]压缩包,鼠标右击选择[解压到Ma ...

  10. Java开发工具类集合

    Java开发工具类集合 01.MD5加密工具类 import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...