多校A层冲刺NOIP2024模拟赛27终结篇

news/2024/11/28 20:05:11/文章来源:https://www.cnblogs.com/oceansofstars/p/18575072

不知道是不是我打的最后一场模拟赛了,记录一下吧,总体来说还不错,虽然 \(T1\) 方案数求错爆零了,但 \(T3\) 场切了,暴力打满的话有265,希望 \(NOIP\) 时也可以不让自己遗憾吧。

A 【模板】分治FFT

考虑每加进来一个数的贡献 \(x_1*x_2+(x_1+x_2)*x_3+...=x_1*x_2+x_1*x_3+x_2*x_3+...\) 可以发现实际上不管怎么取都是每两个数相乘的和,所以直接一种方案的答案乘方案书即可,每次合并时少一堆,所以方案数是 $\sum \limits_{i=2}^{n} \dbinom{i}{2} $。

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int mod=998244353;
const int maxn=1e5+10;
using namespace std;
int n,a[maxn],sum[maxn],ans,jc[maxn];int qpow(int x,int y)
{int ans=1;while(y){if(y&1) ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;
}int c(int n,int m)
{return jc[n]*qpow(jc[m],mod-2)%mod*qpow(jc[n-m],mod-2)%mod;
}signed main()
{freopen("fft.in","r",stdin);freopen("fft.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;for(int i=1;i<=n;i++) cin>>a[i];for(int i=n;i>=1;i--) sum[i]=(sum[i+1]+a[i])%mod;for(int i=1;i<=n;i++) ans=(ans+a[i]*sum[i+1]%mod)%mod;int temp=c(n,2);for(int i=1;i<=n-2;i++) temp=temp*c(n-i,2)%mod;cout<<ans*temp%mod;;return 0;
}
/*
2
100001 100002
*/

B 【模板】最近公共祖先

构造,但是我没仔细推,我觉得题解说的很好,所以直接放了
image

点击查看代码
#include<bits/stdc++.h>
const int maxn=3e5+10;
using namespace std;
int n,m,cnt,dep[maxn];
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
vector<int> s[maxn],t[maxn];
bool vis[maxn];
struct lsx
{int x,y,z;
}ans[maxn];
void add(int x,int y)
{to[++tot]=y;nxt[tot]=head[x];head[x]=tot;
}
void addm(int x,int y)
{add(x,y),add(y,x);
}void lsx(int x)
{vis[x]=1;for(int i=head[x];i;i=nxt[i]){int y=to[i];if(vis[y]){if(dep[y]<dep[x]) s[x].push_back(y);}else dep[y]=dep[x]+1,lsx(y);}while(t[x].size()>1){int p=t[x].back();t[x].pop_back();ans[++cnt]={p,x,t[x].back()};t[x].pop_back();}while(t[x].size()&&s[x].size()){ans[++cnt]={t[x].back(),x,s[x].back()};s[x].pop_back(),t[x].pop_back();}for(auto i:s[x]) t[i].push_back(x);
}int main()
{freopen("lca.in","r",stdin);freopen("lca.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1,x,y;i<=m;i++)cin>>x>>y,addm(x,y);for(int i=1;i<=n;i++) if(!vis[i]) lsx(i);cout<<cnt<<'\n';for(int i=1;i<=cnt;i++) cout<<ans[i].x<<" "<<ans[i].y<<" "<<ans[i].z<<'\n';return 0;
}
/**/

C 【模板】普通平衡树

关于我题解没看懂这件事,考虑新加进来一个数的贡献,由于保证了互不相同,所以新加进来一个数它要么使序列更长,要么就是替换掉最后一个数使值域差更大,每次更改只和最后两个数的值有关,直接对每个序列维护最后两个数的值和答案即可,暴力是 \(O(nq)\) 的,考虑线段树优化这个过程,两个序列段合并时发现,答案只和两个序列段边界的两个值的关系有关,所以线段树直接维护每个序列段最前面的两个数的值,最后面的两个数的值,序列长度,序列答案即可,合并的时候直接分讨边界四个数的大小关系即可,需要特判序列长度小于等于2时的情况。

点击查看代码
#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
#define mid (l+r>>1)
const int maxn=3e5+10;
using namespace std;
int n,q;
struct lsx
{int fi[3],en[3],size,ans,lazy;
}m[maxn<<2],mm;void add(int id,int x)
{if(!m[id].size){m[id].size++;m[id].fi[1]=m[id].en[1]=x;m[id].ans=1;}else if(m[id].size==1){m[id].size++;m[id].fi[2]=m[id].en[2]=x;m[id].ans=2;}else{if(m[id].en[1]>m[id].en[2]){if(x>m[id].en[2]){m[id].en[1]=m[id].en[2];m[id].en[2]=x;m[id].ans++;}else{if(m[id].size==2)m[id].fi[2]=x;m[id].en[2]=x;}}else{if(x<m[id].en[2]){m[id].en[1]=m[id].en[2];m[id].en[2]=x;m[id].ans++;}else{if(m[id].size==2)m[id].fi[2]=x;m[id].en[2]=x;}}m[id].size++;}
}void solve(int x,int id)
{mm=m[x];if(mm.size==1){add(id,mm.fi[1]);return ;}if(!m[id].size){m[id].size=mm.size;m[id].fi[1]=mm.fi[1];m[id].fi[2]=mm.fi[2];m[id].en[1]=mm.en[1];m[id].en[2]=mm.en[2];m[id].ans=mm.ans;}else if(m[id].size==1){if(mm.fi[1]<mm.fi[2]){if(m[id].fi[1]<mm.fi[1]){mm.fi[1]=m[id].fi[1];m[id].size=mm.size;m[id].fi[1]=mm.fi[1];m[id].fi[2]=mm.fi[2];m[id].en[1]=mm.en[1];m[id].en[2]=mm.en[2];m[id].ans=mm.ans;}else{mm.size++,mm.ans++;mm.fi[2]=mm.fi[1];mm.fi[1]=m[id].fi[1];m[id].size=mm.size;m[id].fi[1]=mm.fi[1];m[id].fi[2]=mm.fi[2];m[id].en[1]=mm.en[1];m[id].en[2]=mm.en[2];m[id].ans=mm.ans;}}else{if(m[id].fi[1]>mm.fi[1]){mm.fi[1]=m[id].fi[1];m[id].size=mm.size;m[id].fi[1]=mm.fi[1];m[id].fi[2]=mm.fi[2];m[id].en[1]=mm.en[1];m[id].en[2]=mm.en[2];m[id].ans=mm.ans;}else{mm.size++,mm.ans++;mm.fi[2]=mm.fi[1];mm.fi[1]=m[id].fi[1];m[id].size=mm.size;m[id].fi[1]=mm.fi[1];m[id].fi[2]=mm.fi[2];m[id].en[1]=mm.en[1];m[id].en[2]=mm.en[2];m[id].ans=mm.ans;}}}else{if(m[id].en[1]>m[id].en[2]){if(mm.fi[1]<mm.fi[2]){if(mm.size==2) mm.en[1]=min(mm.en[1],m[id].en[2]);m[id].size+=mm.size-1;m[id].ans+=mm.ans-1;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}else{if(m[id].en[2]<mm.fi[1]){m[id].size+=mm.size;m[id].ans+=mm.ans;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}else{if(mm.size==2) mm.en[1]=m[id].en[1];m[id].size+=mm.size-2;m[id].ans+=mm.ans-2;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}}}else{if(mm.fi[1]>mm.fi[2]){if(mm.size==2) mm.en[1]=max(mm.en[1],m[id].en[2]);m[id].size+=mm.size-1;m[id].ans+=mm.ans-1;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}else{if(m[id].en[2]>mm.fi[1]){m[id].size+=mm.size;m[id].ans+=mm.ans;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}else{if(mm.size==2) mm.en[1]=m[id].en[1];m[id].size+=mm.size-2;m[id].ans+=mm.ans-2;m[id].en[1]=mm.en[1],m[id].en[2]=mm.en[2];}}}}
}void down(int id)
{if(!m[id].lazy) return ;solve(id,lid);solve(id,rid);m[lid].lazy=m[rid].lazy=1;m[id].lazy=m[id].size=m[id].ans=m[id].fi[1]=m[id].fi[2]=m[id].en[1]=m[id].en[2]=0;
}void update(int id,int l,int r,int s,int t,int x)
{if(l>=s&&r<=t){m[id].lazy=1;add(id,x);return ;}down(id);if(mid>=s) update(lid,l,mid,s,t,x);if(mid<t) update(rid,mid+1,r,s,t,x);
}int query(int id,int l,int r,int x)
{// cout<<l<<" "<<r<<" "<<x<<endl;if(l==r) return m[id].ans;down(id);return x<=mid?query(lid,l,mid,x):query(rid,mid+1,r,x);
}int main()
{freopen("odt.in","r",stdin);freopen("odt.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>q;while(q--){int op,l,r,x;cin>>op;if(op==1){cin>>l>>r>>x;update(1,1,n,l,r,x);}else{cin>>x;cout<<query(1,1,n,x)<<'\n';}}return 0;
}
/*
10 4
1 6 6 697
1 4 8 824
1 6 7 455
2 7*/

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

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

相关文章

elasticseach-head插件

git地址 https://github.com/mobz/elasticsearch-head 安装方式 浏览器插件 docker本地安装

支持超线程的numa架构

支持超线程的numa架构 物理硬件视角,将多个CPU封装在一起,这个封装被称为插槽Socket; Core是socket上独立的硬件单元; 通过intel的超线程HT技术进一步提升CPU的处理能力,OS看到的逻辑上的核Processor的数量。每个硬件线程都可以按逻辑cpu寻址,因此这个处理器看上去有八块…

schoolcms代码审计

sql注入 注入点:burp的数据包: POST /index.php?m=Admin&c=Article&a=Delete HTTP/1.1 Host: schoolcms Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.112 Safa…

Burp抓模拟器App HttpHttps数据包

Burp抓模拟器App Http/Https数据包Next抓模拟器中App Https数据包,本文模拟器环境为最新版本雷电模拟器9。首先仍需在模拟器内安装证书,Burp导出证书,导出步骤同上。雷电模拟器安装证书可能需要设置PIN码,依据提示设置安装即可。模拟器设置手动代理,将流量转发至自己PC。新…

Burp抓Web端应用HttpHttps数据包

Burp抓Web端应用Http/Https数据包抓Web端Https数据包,需提前在本机安装证书。打开Burp证书安装完成后,本机或浏览器代理插件设置代理,并将流量转发至Burp,尝试抓包。Web端Http/Https数据包抓包成功!

【论文精读】Lora

【论文精读】 Lora:Low-rank adaptation of large language models论文地址:Lora:Low-rank adaptation of large language models 年份:2021 引用量:8000+ 关键词:LLM的高效微调目录【论文精读】Lora:Low-rank adaptation of large language models1. 背景2. Lora方法3. 实…

2024-0xGame-WEB方向全题解

0xGame Round1 ez_rce 源码: from flask import Flask, request import subprocessapp = Flask(__name__)@app.route("/") def index():return open(__file__).read()@app.route("/calc", methods=[POST]) def calculator():expression = request.form.ge…

【开发】计算机延迟指标全解析:深入理解系统性能瓶颈

在计算机的世界里,“速度”一直是我们不懈追求的目标。从早期的计算机到如今的高性能设备,每一次技术进步都伴随着对速度的极致渴望。无论是处理器的运算速度,还是数据的传输与存储速度,都直接影响着我们使用计算机的体验。那你是否曾好奇,计算机中的“快”究竟是如何衡量…

SKILL脚本的加密与解密及使用

SKILL脚本一般是用.il 和 .ile 结尾的文件,一般设置为 .ile 结尾的文件是加密的,调用的时候需要密码。 SKILL脚本的加密: 用encrypt函数加密脚本,格式如下: encrypt("/apps/SC/skill-script/migrateDesign/MigrateDesign.il" "/apps/SC/skill-script/migr…

家具组装的智慧引导:智能工具与产品说明书的高效协作

在家具市场中,消费者在购买家具后往往需要自行组装。然而,传统的产品说明书往往存在信息表述不清、步骤繁琐等问题,给消费者的组装过程带来诸多不便。为了帮助消费者更轻松地完成家具组装,将HelpLook与家具产品的产品说明书相结合,成为了一个切实可行的解决方案。一、家具…

为何不呢?

你很强吗? 你很菜吗? 你紧张吗? 你会输吗? 你能别挂分吗? 你可以别焦虑吗? 你能对得起父母吗? 你能对得起自己吗? 你对自己有自信吗? 你能保持头脑清醒吗? 你能做到不留遗憾吗? 你能把该拿的分都拿到吗? 你能真正的投入到比赛中吗? 你能把自己的水平发挥出来吗? …