洛谷T21778 过年
时间:2022-05-08
本文章向大家介绍洛谷T21778 过年,主要内容包括题目描述、输入输出格式、输入输出样例、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
有 n(1 leq n leq 10^5)n(1≤n≤105) 个小朋友,过年了,要发放 m(1 leq m leq 10^5)m(1≤m≤105) 次礼物。
每次发放,会给出三个参数 l,r,k(1 leq l leq r leq n, 1 leq k leq 10^5)l,r,k(1≤l≤r≤n,1≤k≤105) ,表示给区间 [l, r][l,r] 内的小朋友都发一个礼物 kk 。
所有礼物发放完成后,对于每一个小朋友,回答他接受的礼物中,出现次数最多的礼物是什么。如果有多个,输出编号最小的那个;如果不存在,输出 -1−1 。
输入输出格式
输入格式:
第一行两个整数 n, mn,m ,意义如上所述。
接下来 mm 行,每行三个数 l,r,kl,r,k ,意义如上所述。
输出格式:
一共 nn 行,每行一个数,表示答案。
输入输出样例
输入样例#1:
6 3
1 5 1
2 3 2
3 4 2
输出样例#1:
1
1
2
1
1
-1
思路比较无脑,全是套路类的问题
按照小盆友的序号建权值线段树
对于每个询问差分一下
在树上打标记,记录最大值和最大值的位置
emmm以后要考虑考虑线段树怎么写了,感觉用DFS序不仅内存小,还写着顺手
// luogu-judger-enable-o2
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
const int MAXN=1e6+10;
struct node
{
int l,r,ls,rs,mx,mxpos;
}T[MAXN];
vector<int>v[MAXN];
int root,tot;
void Build(int &k , int ll , int rr)
{
k=tot++;
T[k].mx=0; T[k].l = ll ; T[k].r = rr;
if( ll == rr ) { T[k].mxpos = ll; return ; }
int mid=ll + rr >>1;
Build( T[k].ls , ll , mid );
Build( T[k].rs , mid+1 , rr );
}
void update(int k)
{
if( T[ T[k].ls ].mx >= T[ T[k].rs ].mx ) T[k].mx = T[ T[k].ls ].mx , T[k].mxpos = T[ T[k].ls ].mxpos;
else T[k].mx = T[ T[k].rs ].mx , T[k].mxpos = T[ T[k].rs ].mxpos;
}
void Add(int k, int pos )
{
if( T[k].l == T[k].r )
{
T[k].mx++;
return ;
}
int mid=T[k].l + T[k].r >>1;
if(pos<=mid) Add( T[k].ls , pos );
else Add( T[k].rs , pos );
update(k);
}
void Delet(int k, int pos )
{
if( T[k].l == T[k].r )
{
T[k].mx--;
return ;
}
int mid= T[k].l + T[k].r >>1;
if(pos<=mid) Delet( T[k].ls , pos );
else Delet( T[k].rs , pos );
update(k);
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
int N,M;
scanf("%d%d",&N,&M);
for(int i=1; i<=M ;i++ )
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
v[l].push_back(k);
v[r+1].push_back(-k);
}
Build(root,1,N);
for(int i=1; i<=N ;i++)
{
for(int j=0; j<v[i].size() ;j++ )
{
// printf("*%d*",v[i][j]);
if( v[i][j]>0 )
Add(root , v[i][j] );
if( v[i][j]<0 )
Delet(root , -v[i][j] );
}
if( T[root].mx )
printf("%dn",T[ root ].mxpos );
else
printf("-1n");
}
return 0;
}
- OpenAI 开源机器人模拟 Python 库:优化API接口提升400%处理速度
- 远控木马上演白利用偷天神技:揭秘假破解工具背后的盗刷暗流
- 设计模式学习(三): 装饰者模式 (附C#实现)
- 浅谈非PE的攻击技巧
- hbase源码系列(十)HLog与日志恢复
- hbase源码系列(六)HMaster启动过程
- 如何写好一篇漏洞报告(国外篇)
- hbase源码系列(八)从Snapshot恢复表
- hbase源码系列(七)Snapshot的过程
- CVE-2017-3085:Adobe Flash泄漏Windows用户凭证
- hbase源码系列(九)StoreFile存储格式
- 如何确定恶意软件是否在自己的电脑中执行过?
- Carbondata源码系列(二)文件格式详解
- 挖洞经验 | 记一次针对Twitter(Periscope)API 的有趣挖洞经历
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kill -9 导致 Kakfa 重启失败的惨痛经历!
- 图解 DataX 核心设计原理
- 不会吧不会吧,你不会还不知道这些提高JS代码质量的骚操作吧?
- Flask架站基础篇(一)--环境配置
- Flask架站基础篇(三)--Flask生成文件内容和文件夹详解
- Flask架站基础篇(四)--URL
- Flask架站基础篇(六)--mysql-python 安装
- Flask架站基础篇(五)----Jinja2模板
- Flask架站基础篇(七)--SQLAlchemy(1)
- JavaScript 进阶教程(1)--面向对象编程
- Flask架站基础篇(八)--SQLAlchemy(2)
- JavaWeb - EL and JSTL
- Python模拟登陆新版知乎
- 第一天:创建型模式--工厂方法模式
- 第二天:创建型模式--抽象工厂模式