博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 12174 (滑动窗口) Shuffle
阅读量:5103 次
发布时间:2019-06-13

本文共 1511 字,大约阅读时间需要 5 分钟。

首先预处理一下以每个数为结尾的前s个数是否能构成一个1~s的排列。

可以用cnt数组来记录每个数出现的次数和用一个变量记录一共有多少个不同的数出现。

 

然后枚举每种可能的情况,也就是枚举第一首歌会出现的位置,注意要考虑到不完整的序列。

代码不长,但是那个ok数组写起来有点蛋疼,因为要考虑到不完整序列的存在,改了好久才改对。

1 #include 
2 #include
3 #include
4 5 const int maxn = 100000 + 10; 6 int a[maxn], s, n, cnt[maxn * 2]; 7 bool ok[maxn * 3]; 8 9 inline bool in(int x) { return x >= 1 && x <= n; }10 11 int main()12 {13 //freopen("in.txt", "r", stdin);14 15 int T; scanf("%d", &T);16 while(T--)17 {18 scanf("%d%d", &s, &n);19 memset(a, -1, sizeof(a));20 for(int i = 1; i <= n; i++) scanf("%d", &a[i]);21 memset(cnt, 0, sizeof(cnt));22 //memset(ok, false, sizeof(ok));23 int tot = s;24 for(int i = 1; i < n + s; i++)25 {26 if(in(i-s)) { cnt[a[i-s]]--; if(!cnt[a[i-s]]) tot--; }27 else tot--;28 if(in(i)) { cnt[a[i]]++; if(cnt[a[i]] == 1) tot++; }29 else tot++;30 ok[i] = tot == s;31 }32 33 int ans = 0;34 for(int x = 1-s; x <= 0; x++)35 {36 bool flag = true;37 for(int i = x; i < n+s; i += s)38 {39 if(i <= 0) continue;40 if(!ok[i]) { flag = false; break; }41 }42 if(flag)43 ans++;44 }45 46 printf("%d\n", ans);47 }48 49 return 0;50 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4431824.html

你可能感兴趣的文章
关于给构造函数传达参数方法
查看>>
mysql忘记密码时如何修改root用户密码
查看>>
STM32单片机使用注意事项
查看>>
在linux中出现there are stopped jobs 的解决方法
查看>>
获取浏览器版本信息
查看>>
SQLServer之删除视图
查看>>
js forEach跳出循环
查看>>
MyBatis---动态SQL
查看>>
快速创建一个 spring mvc 示例
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
JVM-class文件完全解析-类索引,父类索引和索引集合
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Spring 整合 Redis
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
SQLite3初探
查看>>
多线程/多进程/异步IO
查看>>