学习总结(2024/2/7)

目录

P8661 [蓝桥杯 2018 省 B] 日志统计  

解题思路:

AC代码:

P3367 【模板】并查集  

AC代码:


P8661 [蓝桥杯 2018 省 B] 日志统计  

题目描述

小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 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个赞,就是热帖,如果没找到就继续移动指针,直到无法移动。

AC代码:

#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<

P3367 【模板】并查集  

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 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}。

AC代码:

#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 ;
}

启航实验室第二周作业完成情况:(加上上面这道并查集!)

学习总结(2024/2/7)_第1张图片

你可能感兴趣的:(学习)