ABC372 (D,E)

news/2024/9/21 21:48:22/文章来源:https://www.cnblogs.com/superl61/p/18424550

ABC372 (D,E)

D

一道比较简单的二分查找题目。

观察到每个数能成为 \(j\) 的条件是独立的,因此想到统计每个数能成为它前面哪些数的 \(j\)

对于每个\(ed​\), 二分 \(1 \sim ed-1​\) 中最后一个大于 \(h[ed]​\) 的数的位置 \(st​\), 那么 \(h[ed]​\) 可作为 \(st \sim ed-1​\)\(j​\).

二分的检查方法中需要求区间max, 写个st表或者线段树就做完了(参考代码用的线段树)

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
const int N = 3e5 + 5;
int h[N], ans[N], mx[N << 2];
int n;
void pushup(int u){mx[u] = max(mx[u * 2], mx[u * 2 + 1]); 
}
void update(int u, int l, int r, int x, int y){if(l == r) {mx[u] += y;return ;}int mid = (l + r) >> 1;if(x<=mid) update(u * 2, l, mid, x, y);else update(u * 2 + 1, mid + 1, r, x, y);pushup(u);
}
int query(int u, int l, int r, int x, int y){if(x <= l && r <= y){return mx[u];}int mid = (l + r) >> 1, ret = 0;if(x <= mid) ret = query(u * 2, l, mid, x, y);if(y > mid) ret = max(ret, query(u * 2 + 1, mid + 1, r, x, y));pushup(u);return ret;
}
signed main(){ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n;F(i, 1, n) cin >> h[i], update(1, 1, n, i, h[i]);F(i, 1, n){int l = 0, r = i, mid;while(l + 1 < r){mid = (l + r) >> 1; if(query(1, 1, n, mid,i-1) > h[i]) l = mid;else r = mid;}ans[l] ++, ans[i]--;}F(i, 1, n) ans[i] += ans[i - 1], cout << ans[i] << ' ';return 0;
}

E

关键在于要读懂 type2 考察的对象是 \(u\) 所在连通块,想到这个,并查集就呼之欲出了。

而查询第 \(k\) 大的话,由于 \(k\) 不超过10, 所以暴力查是可以接受的。

合并用启发式合并保证复杂度控制在 \(O(n logn)\).

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
const int N = 3e5 + 5;
int n, q;
int fa[N];
set<int,greater<int>> s[N];
inline int get(int x){return (fa[x] != x) ? fa[x] = get(fa[x]) : x;
}
void merge(int u, int v){int fu = get(u), fv = get(v);if(fu == fv) return ;if((int)s[fu].size() > (int)s[fv].size()){fa[fv] = fu;for(auto x : s[fv]){s[fu].emplace(x);}s[fv].clear();}else{swap(fu, fv);// fu:biggerfa[fv] = fu;for(auto x : s[fv]){s[fu].emplace(x);}s[fv].clear();}
}
signed main(){ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n >> q;F(i, 1, n) fa[i] = i, s[i].emplace(i);F(i, 1, q){int op, u, v;cin >> op >> u >> v;if(op == 1){merge(u, v);}else{u = get(u);if((int)s[u].size() < v){cout << "-1\n";continue;}for(auto x : s[u]){if(--v==0){cout << x << '\n';break;}}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/801220.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析RocketMQ消息消费原理

本文参考转载至《RocketMQ技术内幕 第2版》一. 消息消费概述 消息消费以组的模式开展,一个消费组可以包含多个消费者,每个消费组可以订阅多个主题,消费组之间有集群模式和广播模式两种消费模式。集群模式是当前主题下的同一条消息只允许被其中一个消费者消费。广播模式是当前…

dc-8

靶机下载地址:dc-8 找到靶机 nmap -sV 192.168.6.0/24查看端口 疑似有注入点开始尝试 python sqlmap.py -u "http://192.168.6.135/?nid=*" --dbs 查库python sqlmap.py -u "http://192.168.6.135/?nid=*" -D "d7db" --tables 查表python sqlm…

27. 守护进程、进程间通信

1. 僵尸进程与孤儿进程1.1 前言 在unix中,所有的子进程都是由父进程创建的,子进程再创建新的子进程 子进程的结束和父进程的运行是一个异步的过程,即子进程运行完成时,父进程并不知道 当子进程运行完成时,父进程需要调用wait()或waitpid()来获取子进程的运行状态 1.2 僵尸…

BUU XSS COURSE 1

启动靶机有留言板和登录功能,很明显是存储性xss,通过留言功能插入xss代码,获取cookie登录后台 先测试过滤 <script>alert(1);</script> 查看源代码发现script被过滤 <input onfocus="alert(xss);">好像只过滤了script找一个xss平台或者自己用服…

Wireshark开源抓包工具

Wireshark零基础使用教程(超详细) - 元宇宙-Metaverse - 博客园 (cnblogs.com)一、Wireshark是什么 Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。 它使用WinPCAP作为接口,直接与网卡进行数据报文交换。 二、Wiresha…

Prompt提示词概念

什么是prompt提示词? 叮!快来看看我和文心一言的奇妙对话~什么是提示工程(prompt engineering)?点击链接 https://yiyan.baidu.com/share/vMZ69XCFTc?utm_invite_code=P0HSh4T14mrU4TwxGbJ%2BSw%3D%3D&utm_name=SGlkZGVuX3N0YXJz&utm_fission_type=common -- 文心…

C#|.net core 基础 - 深拷贝的五大类N种实现方式

C#深拷贝复杂,文中介绍了五大类N种深拷贝方法,包括简单引用类型、手动方式、序列化方式、第三方库方式和扩展视野方式,并对比了性能。建议使用AutoMapper和DeepCloner等成熟库或根据性能需求选择表达式树和Emit。在实际应用中经常会有这样的需求:获取一个与原对象数据相同但…

智能写作新体验:AI写作小助手助力内容创作

在信息时代的浪潮中,内容创作已成为连接世界、传递价值的重要桥梁。然而,传统的写作方式在效率和质量上往往难以满足现代社会的需求。此时,AI写作小助手的诞生,为内容创作带来了全新的体验。本文将深入探讨AI写作小助手如何助力内容创作,开启智能写作的新篇章。AI写作小助…

基于Vue实现动态组织结构图

最近一个项目里有个前端绘制家谱图的需求,大概是下面这个样子:组件源码如下<template><table v-if="treeData.name"><tr><td :colspan="Array.isArray(treeData.children) ? treeData.children.length * 2 : 1":class="{pare…

中国能源发展报告2022

中国能源发展与未来中国能源发展报告2022林伯强高耗能产业的出路CCUS(Carbon Capture,Utilization and Storage,即碳捕获、利用与封存技术)高耗能产业布局:08 年,东高西低 >> 08 年之后,西高东低,自南向北移动,东减西增; 转移趋势北部沿海城市-河北,山东,201…

Qt表格入门

这篇博客详细介绍了Qt表格的基础知识,包括如何使用QTableWidget和QTableView来显示数据,以及如何使用QStyledItemDelegate和QSortFilterProxyModel进行数据代理、过滤和排序。此外,博客还提供了完整的代码示例,用于演示如何在Qt中创建和定制表格视图。这些内容对于Qt初学者…

王悦帆的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 熟悉如何运用博客,展示自己姓名-学号 王悦帆 2022329301024一、自我介绍 (一)基本情况 大家好,我叫王悦帆,来自河南长垣,是自动化一班的成员,兴趣爱好是踢足球,看足球比赛。曾经去过现场…