目录
P8661 [蓝桥杯 2018 省 B] 日志统计
解题思路:
AC代码:
P3367 【模板】并查集
AC代码:
题目描述
小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 N 行。其中每一行的格式是 ts id
,表示在 ts 时刻编号 id 的帖子收到一个“赞”。
现在小明想统计有哪些帖子曾经是“热帖”。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是“热帖”。
具体来说,如果存在某个时刻 T 满足该帖在[T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是“热帖”。
给定日志,请你帮助小明统计出所有曾是“热帖”的帖子编号。
输入格式
第一行包含三个整数 N、D 和 K。
以下 N 行每行一条日志,包含两个整数 ts 和 id。
输出格式
按从小到大的顺序输出热帖 id。每个 id 一行。
输入
7 10 2 0 1 0 10 10 10 10 1 9 1 100 3 100 3
输出
1 3
说明/提示
对于 50%50% 的数据,1≤K≤N≤1000。
对于 100%100% 的数据,1≤K≤N≤105,0≤id,ts≤105。
时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛
将每个id的获赞时间都统计下来,可以利用vector a[id],记录每个id的获赞时间;
如果获赞次数小于k,则不需要判断,直接为非热帖;
如果获赞次数大于k,可以通过双指针进行判断,看每个id的获赞时间中,的d秒内是否有k个赞;
如果正好k个赞,就是热帖,如果没找到就继续移动指针,直到无法移动。
#include //万能头文件
using namespace std;
int t,n,k;
vector q[100010];
int a[100010];
bool check(int x)
{
if(q[x].size()=k) return 1;
}
else
{
l++;
}
}
return 0;
}
int main()
{
cin>>t>>n>>k;
while(t--)
{
int ts,id;
cin>>ts>>id;
q[id].push_back(ts);
}
int cnt=0;
for(int i=0;i<=1e5;i++)
{
if(check(i))
cout<
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。
接下来 M 行,每行包含三个整数Zi,Xi,Yi 。
当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。
当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出 Y
;否则输出 N
。
输出格式
对于每一个Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y
或者 N
。
输入输出样例
输入
4 7 2 1 2 1 1 2 2 1 2 1 3 4 2 1 4 1 2 3 2 1 4
输出
N Y N Y
说明/提示
对于 30%30% 的数据,N≤10,M≤20。
对于 70%70% 的数据,N≤100,M≤103。
对于 100%100% 的数据,1≤N≤104,1≤M≤2×105,1≤Xi,Yi≤N,Zi∈{1,2}。
#include
#include
int n , m ; //n个元素,m次操作
int pre[100000] ;
int find1(int x)
{
while(x!=pre[x])
{
x = pre[x] ;
}
return x;
}
int main()
{
scanf("%d %d",&n,&m) ;
for(int i =1 ; i<=n ; i++)
{
pre[i] = i ; //初始化其祖先一开始是他自己本身
}
while(m--)
{
int op ; //用来表示操作
int x, y;
scanf("%d %d %d",&op,&x,&y) ;
int a , b ; //用来记录x、y的祖先
a = find1(x) ;
b = find1(y) ;
if(op == 1)
{
pre[a] = b;
}
else if(op == 2)
{
if(a == b)
{
printf("Y\n") ;
}
else printf("N\n") ;
}
}
return 0 ;
}
启航实验室第二周作业完成情况:(加上上面这道并查集!)