time limit per test:2 seconds

memory limit per test:256 megabytes

input:standard input

output:standard output

The only difference between easy and hard versions is constraints.

The BerTV channel every day broadcasts one episode of one of the k TV shows. You know the schedule for the next n days: a sequence of integers a1,a2,…,an (1≤ai≤k), where ai is the show, the episode of which will be shown in i-th day.

The subscription to the show is bought for the entire show (i.e. for all its episodes), for each show the subscription is bought separately.

How many minimum subscriptions do you need to buy in order to have the opportunity to watch episodes of purchased shows d (1≤d≤n) days in a row? In other words, you want to buy the minimum number of TV shows so that there is some segment of d consecutive days in which all episodes belong to the purchased shows.

Input

The first line contains an integer t (1≤t≤10000) — the number of test cases in the input. Then t test case descriptions follow.

The first line of each test case contains three integers n,k and d (1≤n≤2⋅105, 1≤k≤106, 1≤d≤n). The second line contains n integers a1,a2,…,an (1≤ai≤k), where ai is the show that is broadcasted on the i-th day.

It is guaranteed that the sum of the values ​​of n for all test cases in the input does not exceed 2⋅105.

Output

Print t integers — the answers to the test cases in the input in the order they follow. The answer to a test case is the minimum number of TV shows for which you need to purchase a subscription so that you can watch episodes of the purchased TV shows on BerTV for d consecutive days. Please note that it is permissible that you will be able to watch more than d days in a row.

Example

input

4
5 2 2
1 2 1 2 1
9 3 3
3 3 3 2 2 2 1 1 1
4 10 4
10 8 6 4
16 9 8
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3

output

2
1
4
5

Note

In the first test case to have an opportunity to watch shows for two consecutive days, you need to buy a subscription on show 1 and on show 2. So the answer is two.

In the second test case, you can buy a subscription to any show because for each show you can find a segment of three consecutive days, consisting only of episodes of this show.

In the third test case in the unique segment of four days, you have four different shows, so you need to buy a subscription to all these four shows.

In the fourth test case, you can buy subscriptions to shows 3,5,7,8,9, and you will be able to watch shows for the last eight days.

思路:

刚开始看到这个题目时,想到了莫队的分块统计+埃筛,写完了一直在debug,然后看了学长的代码明白过来了,原来是这样做

t组输入样例,

n表示n个数,k表示着n个数中的最大值,d表示连续的几个数中不同的数字个数(不重复的数字个数)

我可以表示出第一个区间里符合题意的树,然后依次往下移动,知道所有的都找完

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
const int maxn = 1e6 + 10;
set<int> s;
map<int,int> mp;
int a[maxn];
int t,n,k,d;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t--){
mp.clear();
s.clear();
cin >> n >> k >> d;
for(int i = 1; i <= n; i++)
cin >> a[i]; for(int i = 1; i <= d; i++){
mp[a[i]]++;
s.insert(a[i]);
}
//左右边界找到,然后依次下移,利用的map的计数和set的去重
int l = 1, r = d,ans = s.size();
while(r < n){//等于不成立,因为里面有r++
mp[a[l]]--;//我是想要右移
if(mp[a[l]]==0)//没有的话,就可以删除
s.erase(a[l]);
l++;
r++;
s.insert(a[r]);//向右移动,插入
mp[a[r]]++;//这一步刚开时忘记写,
if(s.size() < ans)
ans = s.size();
}
cout << ans << endl;
}
return 0;
}

cf--TV Subscriptions (Hard Version)的更多相关文章

  1. CF1225B2 TV Subscriptions (Hard Version)

    CF1225B2 TV Subscriptions (Hard Version) 洛谷评测传送门 题目描述 The only difference between easy and hard vers ...

  2. CF1225B1 TV Subscriptions (Easy Version)

    CF1225B1 TV Subscriptions (Easy Version) 洛谷评测传送门 题目描述 The only difference between easy and hard vers ...

  3. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B2. TV Subscriptions (Hard Version)

    链接: https://codeforces.com/contest/1247/problem/B2 题意: The only difference between easy and hard ver ...

  4. B2 - TV Subscriptions (Hard Version)

    题目连接:https://codeforces.com/contest/1247/problem/B2 题解:双指针,,一个头,一个尾,头部进入,尾部退出,一开始先记录1到k,并记录每个数字出现的次数 ...

  5. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B. TV Subscriptions 尺取法

    B2. TV Subscriptions (Hard Version) The only difference between easy and hard versions is constraint ...

  6. [CodeForces-1225B] TV Subscriptions 【贪心】【尺取法】

    [CodeForces-1225B] TV Subscriptions [贪心][尺取法] 标签: 题解 codeforces题解 尺取法 题目描述 Time limit 2000 ms Memory ...

  7. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)

    A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...

  8. HBase 数据模型(Data Model)

    HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...

  9. OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)

    20150729 Created By BaoXinjian

随机推荐

  1. layui-form下隐藏元素的验证问题

    1.情景: 设置为display:none的必填字段,在点击提交(form 包含 class="layui-form":button包含属性 lay-submit)的时候,依旧验证 ...

  2. easyui的combogrid

    easyui的combogri下拉框用在项目中很多,有时会出现很多问题,当然也好解决. 1.当向后台传id值时,用户输入的与查询出来的显示值一样,但combogrid为空? 情景:输入‘李四’,和显示 ...

  3. HTML5学习(4)文本元素

    使用VSCode编辑器,内置emmet插件. ctrl+/ 注释/取消注释 ctrl+enter 新起一行 ctrl+shift+enter 往上新起一行 h$*4>lorem10 <h1 ...

  4. 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用

    mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...

  5. Linux - Linux中线程为何有PID?

    重现 用htop的Tree view(按F5)之后查看线程 参考 https://segmentfault.com/q/1010000003586656 mousycoder的回答 https://u ...

  6. Maven快速创建SpringMVC web(1)

     Maven快速创建SpringMVC web工程详解  转自:http://blog.csdn.net/cndmss/article/details/52184836

  7. js中yyyymmdd hh:mm:ss字符转换为Date

    var dateString="20190102 10:30:35"; var pattern = /(\d{4})(\d{2})(\d{2})/; var formatedDat ...

  8. mybatis--多对一关联

    (1)首先,创建数据库mybatismanytoone并插入数据 create database mybatismanytoone; use mybatismanytoone; create tabl ...

  9. mysql 数据库中的模式替换

    1, REPLACE 使用 -UPDATE tbl_name SET field_name = REPLACE(field_name,old_str,new_str) WHERE conditions ...

  10. 67课 for循环1-为什么需要for循环

    # include <stdio.h> int main (void) { int i; ;.//sum代表和的意思 ; i<=; ++i)//第八行代码 sum = sum + i ...