【学习笔记】2021.10.6 - 清北学堂模拟赛
T1 区间第k大
题目内容
-
给定一个 的排列 以及整数 。
-
对于每个 ,你需要求出该排列中有多少个区间 的第 大恰好是 。
-
输入一行 个整数,第 个整数表示有多少个区间以 作为第 大。
-
输出一行 个整数,第 个整数表示有多少个区间以 作为第 大。
Subtask1
思路
- 建一棵主席树,干就完了
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAXN(300233);
struct poi{
int ls,rs,sum,lt;
}tree[MAXN<<5];
int cnt,p[MAXN],n,kkksc03,rt[MAXN],ans[MAXN],cha[MAXN];
inline int R(){
int x=0;char c='c';
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x;
}
inline void BUILD(int OLD,int &NOW,int l,int r,int num){
NOW=++cnt;
tree[NOW].ls=tree[OLD].ls;
tree[NOW].rs=tree[OLD].rs;
tree[NOW].sum=tree[OLD].sum+1;
if(l==r) return;
int mid=(l+r)>>1;
if(num<=mid) BUILD(tree[OLD].ls,tree[NOW].ls,l,mid,num);
else BUILD(tree[OLD].rs,tree[NOW].rs,mid+1,r,num);
return;
}
inline int QUERY(int L,int R,int l,int r,int k){
if(l==r) return l;
int lsum=tree[tree[R].ls].sum-tree[tree[L].ls].sum;
// printf("l %d r %d mid %d k %d lsum %d Llssum %d Rlssum %d\n",l,r,(l+r)>>1,k,lsum,tree[tree[L].ls].sum,tree[tree[R].ls].sum);
int mid=(l+r)>>1;
if(k<=lsum) return QUERY(tree[L].ls,tree[R].ls,l,mid,k);
else return QUERY(tree[L].rs,tree[R].rs,mid+1,r,k-lsum);
}
int main(){
// freopen("ex_sequence3.in","r",stdin);
// freopen("my.txt","w",stdout);
n=R();kkksc03=R();
for(register int i=1;i<=n;++i) p[i]=R(),cha[p[i]]=i;
for(register int i=1;i<=n;++i) BUILD(rt[i-1],rt[i],1,n,p[i]);
for(register int i=1;i<=n-kkksc03+1;++i)
for(register int j=i+kkksc03-1;j<=n;++j)
// printf("QUE %d ~ %d:\n",i,j),
ans[cha[QUERY(rt[i-1],rt[j],1,n,j-i-kkksc03+2)]]++;
for(register int i=1;i<=n;++i) printf("%d ",ans[i]);
printf("\n");
return 0;
}
//打五把CS:GO!
期望得分 50pts
正解
思路
-
由于k固定,主席树真是太亏了!
-
考虑到只关心大小关系,我们可以预处理一个01数组,把比某位置大的赋值为1,反之为0,只需向前向后暴力拓展k个,然后计算即可。
-
复杂度 。
T2 染色
题目内容
-
有 个球排成一排,有 种颜色。这些球中有 个球已经染上了某种颜色。
-
你可以选择某个未被染色的球 ,以及与它相邻且已被染色的球 ,将球 染成球 的颜色。
-
当所有球都被涂上颜色后,设第 种颜色的球有 个。定义长为 的序列 满足 ,其中括号表示有序对。
-
请求出对于所有可能的染色方案,序列 从大到小排序后字典序最大是多少。
-
两个有序对比较大小的方法为先比较第一个元素的大小,若相同再比较第二个元素的大小。
-
注意: 种颜色不一定会全部出现在已经染好色的球中。
-
输入第一行三个整数 ,分别表示球数,已染色的球数和颜色种数。
-
接下来 行,第 行两个整数 分别表示已染色球的位置和染的颜色。保证 严格递增。
-
输出输出 行,第 行两个正整数 表示答案序列(序列 从大到小排序后)的第 个有序对 。
Subtask1
思路
- 贪心,每次扫一遍整个序列,按照第一关键字找到颜色最多的染色,第一关键字相同根据第二关键字不同进行染色。
代码
- 无QWQ
期望得分 20pts
Subtask3
思路
-
枚举使用已经染色的球的所有方案,然后再进行处理即可
-
复杂度 。
代码
- 无QWQ
期望得分 40pts
正解
思路
- 对于每个染了色的球建点,向未染色的段连边,边权为段的长度,最后求最大值和删边,考虑用大根堆,更改操作不用管,把新点扔到大根堆里即可,复杂度 。
代码
- 无QWQ
期望得分 100pts
T3 博弈论
题目内容
-
小T刚刚学习了博弈论的相关内容,他对 函数很感兴趣,于是想出了如下问题。
-
给定 个结点的树,结点编号为 ,第 个结点上有点权 。保证 为一个 的排列。
-
你需要对于每个 ,求出将每个点的点权 变为 ,之后求出树上所有链的 值的最大值。
-
一条 到 的链的 值定义为这条链的点权构成的集合中,没有出现过的最小自然数(自然数包括0)。
-
注意:询问之间独立,也即每个询问的修改仅对当前询问有效。
-
输入:
-
第一行一个整数 ,表示树的大小。
-
第二行 个整数 ,表示点权。
-
接下来 行,每行两个整数 ,表示一条树边 。
-
输出一行 个整数,第 个整数表示 时的答案。
正解
思路
-
先考虑 时的答案,此时要将 依次加入直到不能形成链,使得mex最大。
-
维护链的起点 S 和终点 T ,若新加入的点正好在 S 或 T 上就直接把它挂上去。
-
若不是……
-
一会再说,先说一个重要的知识:
inline int LCA_OF_THREE(int x,int y,int z){
return lca(x,y)^lca(x,z)^lca(y,z);
}
//求三点LCA
-
多余的部分全都抑或抵消掉了,所以这是正确的。
-
后面的听不会了,人傻了,看Minus神仙的博客罢。
-
复杂度 。
代码
- 无QWQ
正解(超级加倍)
-
先讲一个技巧:双栈模拟队列。
-
就是让两个栈的栈底拼在一起,右栈往右移动时让右栈入栈,左栈弹栈,弹空了就把交界点的位置改变,防止GG。
-
剩下的仍然不会,看Minus神仙的博客罢。
T4 错排问题
题目内容
-
一个 的排列 被称为错排,当且仅当对于每个 ,有 。
-
给定整数 ,你需要求出对于每个 ,满足 且长为 的错排 有多少个。
-
由于答案很大,你只需要输出答案对 取模的结果。
-
输入一行两个整数 ,表示错排长度和 的取值范围。
-
输出一行 个整数,第 个整数表示 时的答案对 取模的结果。
Subtask1
思路
- 打表出省一。
代码
- 无QWQ
Subtask4
- 全程伞兵,弃疗了……
本文作者:Binaries
本文链接:https://www.cnblogs.com/Konjac-Binaries/p/15371157.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具