2021CCPC河南省赛题解(主席树+二分)

2023-11-14

考场没看见随机化数据,写了一个主席树+二分,但是之前练习的时候没有做过多实例,忘记初始化上层用到的所有节点信息了, wa麻了。

	思路:主席树+二分, O(nlogn^2)
	二分距离当前点最近的,大于等于a[i]的数的个数最靠右的位置,
	然后利用主席树区间询问在mid到i-1这段大于x的数的数量,
	作为check函数
	

```cpp
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
const int N=1e5+10;
struct Node
{
	int l, r;
	int cnt;
};
int tfind(int l, int r, int k, int x);
int query(int pre, int now, int l, int r, int x);
int build(int l, int r);
void push_up(int u);
int add(int pre, int l, int r, int x);
int find(int x); 

int T;
int n, k;
int a[N];
Node tr[4*N+N*18];
int root[N], idx;
vector<int> alls;

signed main()
{
	cin>>T;
	
	while(T--)
	{
		alls.clear();
		for(int i=0;i<=idx;i++) tr[i]={0, 0, 0};
		idx=0;//不要忘记初始化!!!!! 
		scanf("%d%d", &n, &k);
		
		for(int i=1;i<=n;i++)
		{
			scanf("%d", &a[i]);
			alls.push_back(a[i]);
		}
		
		alls.push_back(-2e9);
		sort(alls.begin(), alls.end());//离散化 
		alls.erase(unique(alls.begin(), alls.end()), alls.end());
		root[0]=build(1, alls.size()-1);//建树 
		
		for(int i=1;i<=n;i++)
		{
			if(i-1<k||query(root[0], root[i-1], 1, alls.size()-1, find(a[i]))<k)//左边不足k个数或者大于x的数的个数小于k个, 无解 
			{
				puts("-1");
				root[i]=add(root[i-1], 1, alls.size()-1, find(a[i]));
			}
			else
			{
				printf("%d\n", tfind(0, i-1, k, find(a[i])));//二分查找 
				root[i]=add(root[i-1], 1, alls.size()-1, find(a[i]));
			}
		}
	}
}

int find(int x)
{
	return lower_bound(alls.begin(), alls.end(), x)-alls.begin();
}

int query(int pre, int now, int l, int r, int x)
{
	if(l==r)
	{
	    if(l>x) return tr[now].cnt-tr[pre].cnt;
	    return 0;
	}
	int cntr=tr[tr[now].r].cnt-tr[tr[pre].r].cnt;
	
	int sum=0;
	int mid=l+r>>1;
	if(mid+1>x) sum+=cntr;//如果右边都大于, 直接加上 
	else sum+=query(tr[pre].r, tr[now].r, mid+1, r, x);//否则大于x的数还在右边 
	if(mid>x) sum+=query(tr[pre].l, tr[now].l, l, mid, x);//若左边也有, 递归左边 
	
	return sum;//返回结果 
}

int tfind(int l, int r, int k, int x)//二分出来1~i-1中最靠右的位置, 使得>x的数的数量等于k 
{
	int i=r;
	while(l<r)
	{
		int mid=l+r+1>>1;//判断当前mid到i-1的位置, 大于x的数的数量,若<k则说明r更小 
		if(query(root[mid-1], root[i], 1, alls.size()-1, x)<k) r=mid-1;//若mid到i-1小于k说明,还在左边 
		else l=mid;//否则往右走 
	}
	
	return a[l];//最后这个l就是最靠右的大于x数的个数的位置, 输出a[l]即可 
}

int add(int pre, int l, int r, int x)
{
	int now=++idx;
	tr[now]=tr[pre];
	
	if(l==r)
	{
		tr[now].cnt++;
		return now;
	}
	
	int mid=l+r>>1;
	if(x<=mid) tr[now].l=add(tr[pre].l, l, mid, x);
	else tr[now].r=add(tr[pre].r, mid+1, r, x);
	push_up(now);
	
	return now;
}

void push_up(int u)
{
	tr[u].cnt=tr[tr[u].l].cnt+tr[tr[u].r].cnt;
}

int build(int l, int r)
{
	int now=++idx;
	if(l==r) return now;
	
	int mid=l+r>>1;
	tr[now].l=build(l, mid), tr[now].r=build(mid+1, r);
	
	return now;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021CCPC河南省赛题解(主席树+二分) 的相关文章

  • 多线程操作同一个变量

    在java线程并发处理中 有一个关键字volatile的使用目前存在很大的混淆 以为使用这个关键字 在进行多线程并发处理的时候就可以万事大吉 Java语言是支持多线程的 为了解决线程并发的问题 在语言内部引入了 同步块 和 volatile
  • Python算法工程师:心中无码便是高清,马赛克“脑补”算法 PULSE

    1 万恶马赛克 万恶的马赛克 是阻碍人类进步的绊脚石 马赛克 脑补 算法 PULSE 助你图片模糊变高清 这是杜克大学近期的一项研究 将模糊人脸秒变高清 PULSE 算法目前只支持人脸的马赛克 去除 因为训练数据都是人脸 也就是说 脑补 其
  • 华为X系列服务器,华为X系列高密服务器产品介绍.pptx

    华为X系列高密服务器产品介绍 目标 华为高密服务器总览X6000服务器介绍X8000服务器介绍 计算面临的挑战 云计算 IT面临的挑战 华为服务器家族 华为高密服务器总览X6000服务器介绍X6000服务器简介X6000服务器硬件结构X60

随机推荐

  • MySQL 视图(详解)

    文章目录 一 视图概念 使用视图的原因 二 创建视图 1 基本语法 2 创建基于单表的视图 实例 1 实例 2 3 创建基于多表的视图 实例 3 4 查询视图 实例 4 三 查看视图 1 查询表 包括view 2 查询视图 四 修改视图 1
  • 【Node】使用Node.js连接数据库时报错客户端不支持服务器请求的身份验证协议

    使用Node js连接数据库时报错 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by server c
  • 嗯… 无法访问此页面 www.bing.com 花了太长时间进行响应解决办法

    从昨天开始 Microsoft Edge浏览器在搜索栏输入中文后就无法响应 但是网络连接是好的 防火墙也没有设置过 问题见下图 点击运行Windows网络诊断 如下图 检测完成后 只是说你的计算机配置似乎是正确的 但该设备或资源 www b
  • 微信小程序animation动画,微信小程序animation动画无限循环播放

    需求是酱紫的 页面顶部的喇叭通知 内容不固定 宽度不固定 就是做走马灯 轮播 效果 从左到右的走马灯 轮播 每播放一遍暂停 1500ms 2000ms 刚开始想的是 css 的 position relative animation 如果宽
  • 自定义一个VideoCapturer(WebRTC)用于获取大疆无人机实时视频

    WebRTC做大疆无人机直播 大疆带屏遥控器有直播功能 用的是rtmp 但是延时有点大 所以在遥控器里安装自己的软件 用webrtc来做一个无人机视频实时传输 需要自定义一个VideoCapturer来获取无人机视频封装成便于webrtc使
  • Spring AOP 剖析(5)

    在动态代理 和 CGLIB 的支持下 Spring AOP 框架的实现经过了两代 从 Spring AOP 框架第一次发布 到 Spring 2 0 发布之前的 AOP 实现 是 Spring 第一代 AOP 实现 Spring 2 0 发
  • vue项目中修改页面logo和标题

    第一步 把图片转成icon格式 比特虫转换工具 建议尺寸为16 16 第二步 将图标重命名为 favicon ico 并放在项目根目录下 第三步 然后在index html中引入 title中修改页面标题 第四部 分别修改build文件夹下
  • 5. spark 参数问题

    如何传递spark 参数 在代码中设置参数 命令行 Spark Properties 动态加载参数 官网地址 spark 参数 在代码中设置参数 spark default conf lt 命令行 lt 代码内部设置参数 对于一常用的参数可
  • python 图像处理中PIL中image.convert()函数使用

    from PIL import Image img Image open E image myimg jpg result img convert P palette Image ADAPTIVE colors 10 3 模式 P 模式 P
  • 计算机图形学 3D 渲染 笔记(二)

    一 阴影 判断一个点是否被遮住 可以从该点像光源方向发射射线 P tL 若射线被与物体发生相交 则说明它在阴影中 而这个物体由于要在 P 和 光源之间 在方向光场景下 t 的取值范围是 0 lt t lt 因为光源无限远 而在点光下 t 的
  • 经济学人:重塑世界的区块链技术

    比特币背后的技术可让彼此互不认识的人建立可依赖的账簿 这远远超出了加密数字货币本身的意义 Mariana Catalina Izaguirre女士在她简陋的房子已经居住了三十年 但洪都拉斯的警察在2009年突然要将她赶走 不同于她在特古西加
  • Frida hook零基础教程

    1 环境搭建 1 准备frida服务端环境 Releases frida frida GitHub 根据手机具体版本下载对应文件并解压 Android手机一般是arm64架构 将解压后的frida server推送到手机端的 data lo
  • rocketmq客户端配置

    1 客户端配置 相对于RocketMQ的Broker集群 生产者和消费者都是客户端 2 客户端寻址方式 RocketMQ可以令客户端找到Name Server 然后通过Name Server再找到Broker 如下所示有多种配置方式 优先级
  • 智慧农业物联网系统 智慧农业解决方案

    智慧农业是智慧经济发展在农牧业上的运用反映 伴随着5G无线通信技术 互联网大数据信息资源管理技术性等现代化技术性普及化 物联网的实际运用标准逐渐完善 传统农业便熟练掌握物联网 摇身一变变成智能农业 智慧农业应用农业地区的每个传感器连接点检测
  • linux间文件实时同步(syncthing) ---带历史版本“后悔药”

    一 概念简介 syncthing 一款开源免费的数据同步工具 基于P2P的跨平台文件同步工具 通过tcp建立设备连接 再通过TLS进行数据安全传输 支持公网与局域网搭建 支持单双向同步与历史版本控制 后悔药 备份机未感染情况下 历史版本理论
  • 关于我“不小心”打开我姐浏览器这件事儿

    今天早上手机骤然没电 我犹如一只情急之下的小松鼠 抓紧时间把手机送回家中的充电宝岛 房间 接着 为了方便处理业务 扮演特别行动队员的角色 借来了姐姐的手机 结果可嚣张了 浏览器记录里居然有这么多 精彩 内容 哎呀 姐姐啊 你这是干啥呢 怎么
  • layui弹窗间的传值(layui弹出层传值)(窗口传值)

    layui弹窗间的传值 layui弹出层传值 窗口传值 LayUI父窗口向弹出层传递数据可以解决页面中的编辑数据的操作 点击编辑按钮 父窗口传递当前选中行当数据至弹出层 弹出层获取到父窗口传递的数据 接着在弹出层中展示出来 效果如下 具体步
  • 数据结构和算法(C)------4.线性表(2)单链表

    目录 1 链式存储结构 1 1 定义 1 2 实现方式 1 3 与链式存储有关的术语 1 4 链表 链式存储结构 的特点和优缺点 1 4 1 特点 1 4 2 优点 1 4 3 缺点 2 单链表的实现 2 1 单链表的存储结构定义 2 2
  • ImportError: cannot import name 'ndcg_score' from 'sklearn.metrics'

    用sklearn metrics调用ndcg score 出现找不到模块的情况 从网上找了资料都说是sklearn版本问题 查看了一下版本是0 20 3 然后就去更新sklearn pip install upgrade scikit le
  • 2021CCPC河南省赛题解(主席树+二分)

    考场没看见随机化数据 写了一个主席树 二分 但是之前练习的时候没有做过多实例 忘记初始化上层用到的所有节点信息了 wa麻了 思路 主席树 二分 O nlogn 2 二分距离当前点最近的 大于等于a i 的数的个数最靠右的位置 然后利用主席树