[63] (多校联训) A层冲刺NOIP2024模拟赛19

news/2024/11/7 21:37:37/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18533865

lhx 对 \((\ln n)^{\ln n}\) 求导求出一个形如 \(\frac{1}{n\ln n\ln\ln n}\) 的东西

A.图书管理

说一种很好玩的 \(n^2\log n\) 做法(因为动态中位数我只会这个)

对顶堆:

就是你开一个大根堆和一个小根堆,然后把它们怼在一起,钦定比中位数大的放小根堆,小的放大根堆,这样中间就是中位数

关于怎么才能知道基准是哪个数,其实你没必要知道基准是哪个数,因为你这是两个堆顶在一块了,你完全可以根据堆的特性来做,现在你只需要维护两个堆大小的平衡,这样就能保证找到中位数,加入插入某个数之后不平衡了,那么直接弹出较大的堆的堆顶,插入另一个堆(这样你还能保证两个堆的值域不交,除非堆顶相等,证明考虑直接想这个对顶堆的性质)

因此这玩意实现了动态插入,平衡,寻找中位数,可以用优先队列实现堆,复杂度均挂 \(\log\)\(2s\) 的话是稳过的,如果值域很大的话,这个做法是相当优秀的那一种

对顶堆写法
#include<bits/stdc++.h>
using namespace std;
template<typename T>
class single_mid_t{private:priority_queue<T,vector<T>,less<T>>p1;priority_queue<T,vector<T>,greater<T>>p2;inline void fixed(){while((int)p1.size()-(int)p2.size()>1){p2.push(p1.top());p1.pop();}while((int)p1.size()-(int)p2.size()<1){p1.push(p2.top());p2.pop();}}public:inline void insert(T x){p1.push(x);fixed();}inline T askmid(){return p1.top();}
};
int n;
long long ans;
int a[10001];
single_mid_t<int>s[10001];
int main(){scanf(n);for(int i=1;i<=n;++i){scanf(a[i]);}for(int i=1;i<=n;++i){ans+=1ll*i*i*a[i];s[i].insert(a[i]);for(int j=i+1;j+1<=n;j+=2){s[i].insert(a[j]);s[i].insert(a[j+1]);ans+=1ll*i*(j+1)*s[i].askmid();}}cout<<ans;
}

然后说 \(n^2\) 的正解

因为这个题是排列,你可以枚举中位数

钦定一个数 \(a_i\) 是中位数,考虑位每个地方赋值,令 \(a_j\lt a_i\) 处的 \(j\) 的值与 \(a_j\gt a_i\) 处的 \(j\) 的值相等,问题转化为求包含 \(i\) 的区间 \([l,r]\) 数量,满足区间和为 \(0\)

还是一样的,如果你钦定每处值的绝对值是 \(1\) 的话,这个值还是不会超过 \([-n,n]\),因此仍然考虑开桶,内层也可以 \(O(n)\) 做出来

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int dx=10000;
int n,ans;
int a[20001],cnt[20001];
signed main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){int tot=0;for(int j=i;j<=n;++j){tot+=(a[j]>a[i])-(a[j]<a[i]);cnt[tot+dx]+=j;}tot=0;for(int j=i;j>=1;--j){tot-=(a[j]>a[i])-(a[j]<a[i]);ans+=j*cnt[tot+dx]*a[i];}tot=0;for(int j=i;j<=n;++j){tot+=(a[j]>a[i])-(a[j]<a[i]);cnt[tot+dx]&=0;}}cout<<ans;
}

B.两棵树

连通块数=剩余的点数−剩余的边数

贡献被拆成四个部分:点×点−边×点−点×边+边×边

  1. 点×点:选择 \(x\in T,u\in U\),当 \(x\neq u\) 均保留概率 \(\frac{1}{4}\),当 \(x=u\) 概率为 \(0\),所以期望为 \(\frac{n(n-1)}{4}\)

  2. 边×点:选择 \((x,t)\in T,u\in U\),当 \(x\neq u,y\neq u\) 均保留概率 \(\frac{1}{8}\),其余情况概率为 \(0\),所以期望为 \(\frac{(n-1)(n-2)}{8}\)

  3. 边×边:选择 \((x,y)\in T,(u,v)\in U\),当 \(x,y,u,v\) 互不相同时,概率为 \(frac{1}{16}\),其余情况概率为 \(0\),可以枚举所有 \((x,y)\),计算符合条件的边 \((u,v)\) 数量:\(n-1-\deg_Ux-\deg_Uy\),如果 \(U\) 存在 \((u,v)=(x,y)\) 则加一

奇怪的是似乎和我推出来不是很一样,为啥我推完之后剩一个 \(\frac{(n-1)^2}{2}\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=998244353;
inline int constexpr power(int a,int t=p-2){int ans=1,base=a;while(t){if(t&1){ans=ans*base%p;}base=base*base%p;t>>=1;}return ans;
}
int n,ans;
vector<int>t[200001],u[200001];
int fa[200001];
void dfs(int now,int last){fa[now]=last;for(int i:u[now]){if(i!=last){dfs(i,now);}}
}
signed main(){ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n-1;++i){int x,y;cin>>x>>y;t[x].push_back(y);t[y].push_back(x);}for(int i=1;i<=n-1;++i){int x,y;cin>>x>>y;u[x].push_back(y);u[y].push_back(x);}ans=(n-1)%p*power(2)%p;dfs(1,0);int res=0;for(int i=1;i<=n;++i){for(int j:t[i]){if(j>i){res=(res+n-1)%p;res=((res-(int)u[i].size()-(int)u[j].size())%p+p)%p;if(fa[i]==j or fa[j]==i) res=(res+1)%p;}}}ans=(ans+res*power(16)%p)%p;cout<<ans;
}

C.函数

好题

首先可以做有无解的判定

零点存在定理,找到所有数中 \(x_i\operatorname{xor}a-b\) 的最大值和最小值,如果这两个值同号则一定不存在解,异或值最大最小可以 01-trie 解决

然后继续零点存在定理,我们可以找到最大和最小的两个位置,现在这两个位置一定不同号,那么可以确定的是中间总存在一个位置合法(两个异号中间总有大于一个异号的连接点)

因此我们只需要维持这种端点异号的关系,每次二分中间点的值,每次用这个点替换同号的端点,最终一定会找到一个断点是合法的

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct trie{signed to[1000001*32][2];signed id[1000001*32];signed cnt=0;inline const string to_string(int x){string ans;while(x){ans.push_back(x%2+'0');x/=2;}while(ans.size()!=31ull) ans.push_back('0');reverse(ans.begin(),ans.end());return ans;}inline void insert(int x,int _id){int pos=0;string y=to_string(x);for(char i:y){if(!to[pos][i-'0']){to[pos][i-'0']=++cnt;}pos=to[pos][i-'0'];}id[pos]=_id;}inline pair<int,int> askmax(int x){int pos=0,ans=0;string y=to_string(x);for(char i:y){ans*=2;if(to[pos][1-(i-'0')]){pos=to[pos][1-(i-'0')];ans++;}else{pos=to[pos][i-'0'];}}return {id[pos],ans};}inline pair<int,int> askmin(int x){int pos=0,ans=0;string y=to_string(x);for(char i:y){ans*=2;if(to[pos][i-'0']){pos=to[pos][i-'0'];}else{pos=to[pos][1-(i-'0')];ans++;}}return {id[pos],ans};}
};
trie t;
int n,q;
int x[1000001];
inline bool check(int i,int a,int b){return ((x[i]^a)-b)*((x[i+1]^a)-b)<=0;
}
inline int f(int x,int a,int b){return (x^a)-b;
}
void bl(){for(int i=1;i<=n;++i){cin>>x[i];}while(q--){int a,b;cin>>a>>b;bool flag=false;for(int i=1;i<n;++i){if(f(x[i],a,b)*f(x[i+1],a,b)<=0){cout<<i<<" ";flag=true;break;}}if(!flag) cout<<-1;cout<<'\n';}
}
signed main(){ios::sync_with_stdio(false);cin>>n>>q;for(int i=1;i<=n;++i){cin>>x[i];t.insert(x[i],i);}while(q--){int a,b;cin>>a>>b;auto tmpa=t.askmax(a),tmpb=t.askmin(a);if(n==1 or f(x[tmpa.first],a,b)*f(x[tmpb.first],a,b)>0){cout<<-1<<'\n';}else{if(tmpa.first>tmpb.first) swap(tmpa,tmpb);int l=tmpa.first,r=tmpb.first;while(l!=r-1){int mid=(l+r)/2;if(f(x[mid],a,b)<=0){if(tmpa.second-b<=0){l=mid;}else{r=mid;}}else{if(tmpa.second-b>0){l=mid;}else{r=mid;}}}cout<<l<<'\n';}}
}

这是什么

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

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

相关文章

基于Java+SpringBoot心理测评心理测试系统功能实现六

三、部分系统功能试卷试题信息业务逻辑层Service、试卷试题题型信息业务逻辑层Service、角色信息业务逻辑层Service、用户信息业务逻辑层Service、前台用户信息业务逻辑层Service一、前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色。随着心…

基于Java+SpringBoot心理测评心理测试系统功能实现五

技术点:SpringBoot+SpringDataJPA+Mysql+HTML+Freemaker+Bootstrap 三、部分系统功能 关于我们信息业务逻辑层Service、封面图信息业务逻辑层Service、留言信息业务逻辑层Service、公告信息业务逻辑层Service、心理测试业务逻辑层Service一、前言介绍: 1.1 项目摘要 心理测评…

鸿蒙开发案例:七巧板

【1】引言(完整代码在最后面) 本文介绍的拖动七巧板游戏是一个简单的益智游戏,用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发,利用其强大的UI构建能力和数据响应机制,实现了流畅的用户体验。 【2】环境准备 电脑系统:windows 1…

windows MacBook 下载视频网站视频

下载yt-dlp github地址:https://github.com/yt-dlp/yt-dlp 下载:https://github.com/yt-dlp/yt-dlp/releases下载ffmpeg 官网:https://ffmpeg.org/解压后,只有bin下的这2个文件放C盘目录下 将下面这3个程序,挪到:C:\Windows\System32下载视频 在任意路径:cmd命令:yt-dl…

聊聊接口测试用例设计规范

1、通过性验证: 先按照接口文档传入所有必填字段并且字段值在正确范围内,预期返回正确结果 2、参数验证(正向/逆向):必填参数:针对每个必填参数,都设计一条参数为空的测试用例,接口错误信息返回正确 非必填参数:设计一条用例所有非必填的参数都传入值,非必填参数(类…

2287: 【例28.3】 数列分段

include <bits/stdc++.h> using namespace std; int n, m, sum, num; int main( ) { cin >> n >> m; for (int i=1;i<=n;i++) { int e; cin >> e; if (num+e>m) { sum++; num=e; } else { num+=e; } } cout << sum+1; return 0; } 反思:这…

CRM系统主要是干什么的?

什么是CRM 系统?CRM系统到底是干什么的?不同的企业人员该如何利用CRM去解决他们的问题等等,问题太多了,我想着就就专门出一期内容,来为大家详细介绍。 干货满满,建议收藏!! 首先第一个问题,什么是CRM系统? CRM是Customer Relationship Management 的缩写,就是客户关…

11月7日 NOIP模拟(难题math、矩阵游戏matrix、括号序列seq、道路road) - 模拟赛记录

Preface T1 试图找规律失败,正经推反而几分钟就出来了。以后应该少想这些歪门邪道(除非实在闲的蛋疼或者没有一点头绪,且必须要打完所有能打的子任务比如暴力或特殊性质;而且必须在用常规方法思考过后,才能够用一些稍微不那么常规的方法) 至于 T2、T3、T4,因为知道 T1 浪…

ESP32学习笔记2(GPIO的数字输入输出功能)

1. 普通5mm直径LED参数测定实验 以上为普通5mm直径LED,手册建议持续工作电流为20mA以内。以下,采用学生电源(带控压限流功能)通过限流电阻170欧给各色LED供电,通过缓慢加压测流和观察LED亮度的方法,确定电流、压降与亮度关系,实测该批次LED颜色与压降大致如下: 颜色 …

2024/11/7日工作总结

学习JS基础知识: 1.事件绑定:点击查看代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><img id="龙泡泡" src="../imgs/年…

实验三 c++

实验任务一 源代码 button.hpp1 #pragma once2 3 #include<iostream>4 #include<string>5 6 using std::string;7 using std::cout;8 9 class Button{ 10 public: 11 Button(const string &text); 12 string get_label()const; 13 void click(); 1…

学习openeuler操作系统的记录本

1.下载以及配置openeuler在官网里面下载openeuler操作系统,在官网的文档里面里面查看相对应的注意事项,(一定要会阅读官方文档),在官网查看下载的对应操作系统需要的最小cpu,以及磁盘大小等分配合适的虚拟硬盘,配置的过程要一步一步来,防止出现分配不合理,而导致的操作…