【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 ...
随机推荐
- node中 path.join 和 path.resovle 区别
console.log(__dirname) console.log('----') console.log(path.resolve(__dirname, '/a/b', '../')) conso ...
- 【SpringMVC】SpringMVC 异常处理
SpringMVC 异常处理 文章源码 异常处理思路 系统中异常包括两类:预期异常和运行时异常,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. Cont ...
- 天梯赛练习 L3-016 二叉搜索树的结构 (30分)
题目分析: 用数型结构先建树,一边输入一边建立,根节点的下标为1,所以左孩子为root*2,右孩子为root*2+1,输入的时候可用cin输入字符串也可用scanf不会超时,判断是否在同一层可以判断两 ...
- ElasticJob 快速上手
1. ElasticJob 是什么 ElasticJob 是一个分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成. Elasti ...
- 攻防世界—pwn—hello_pwn
题目分析 下载文件后首先使用checksec检查文件保护机制 使用ida查看伪代码 思路明确,让dword_60106C == 1853186401即可输出flag 信息收集 偏移量 sub_4006 ...
- 把vscode打造成技术写作神器
作为技术开发,大家平时肯定需要记录技术笔记.甚至有的同学还开通可自己的技术博客或者技术公众号进行创作. 这个时候有套趁手的写作工具尤为重要,节省下时间好好休息一下,对于咱们程序员来说更加重要.因为最近 ...
- 三节锂电池充电管理芯片,IC电路图如何设计
关于三节锂电池供电的产品,在三节锂电池上,需要三个电路系统: 1,三节锂电池保护电路, 2,三节锂电池充电电路, 3,三节锂电池输出电路. 1.三节锂电池保护电路,芯片电路图 控制三节锂电池池的充电电 ...
- 無法直接連接互聯網,需要使用代理時(Scrapy)
在windows系統中,如果無法直接連接互聯網,需要使用代理時該怎麽做呢? 1. 在powershell中設置proxy 背景:使用公司電腦,無法直接訪問互聯網,想要訪問互聯網就得使用代理,但是在控制 ...
- Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析
目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...
- Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令
就这三步骤,下面的是实例不看也罢. apt-get update ###第一步一定要先执行这个更新下.不更新下面的安装命令会显示找不到网络包 //ifconfig apt install net-to ...