『模拟赛』暑假集训CSP提高模拟25

Rank

学新东西,不算挂分(确信。

image

A. 可持久化线段树

原板子[SP11470] TTM - To the moon

主席树,不过区间修改。

赛时想到标记永久化了,不过打 pushdown 的时候没新开点,于是 -100pts。

还挺简单的,建树和更改动态开点,按线段树来,加个 lazy,其他的就是普通线段树的操作。

板子
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=3e5+5;
const int mod=998244353;
int n,m,cnt;
int a[N],rot[N];
int son[N*32][2];
ll v[N*32],lazy[N*32];
namespace Wisadel
{#define ls (son[rt][0])#define rs (son[rt][1])#define mid ((l+r)>>1)int Wclone(int rt){son[++cnt][0]=son[rt][0];son[cnt][1]=son[rt][1];v[cnt]=v[rt];lazy[cnt]=lazy[rt];return cnt;}void Wpushup(int rt){v[rt]=(v[ls]+v[rs])%mod;}void Wpushdown(int rt,int l,int r){ls=Wclone(ls),rs=Wclone(rs);lazy[ls]=(lazy[ls]+lazy[rt])%mod;lazy[rs]=(lazy[rs]+lazy[rt])%mod;v[ls]=(v[ls]+lazy[rt]*(((l+r)>>1)-l+1)%mod+mod)%mod;v[rs]=(v[rs]+lazy[rt]*(r-((l+r)>>1))%mod+mod)%mod;lazy[rt]=0;}int Wbuild(int rt,int l,int r){rt=++cnt;if(l==r){v[rt]=a[l];return rt;}ls=Wbuild(ls,l,mid),rs=Wbuild(rs,mid+1,r);Wpushup(rt);return rt;}int Wupd(int rt,int l,int r,int x,int y,int va){rt=Wclone(rt);if(x<=l&&r<=y){lazy[rt]=(lazy[rt]+va)%mod;v[rt]=(v[rt]+1ll*(r-l+1)*va%mod+mod)%mod;return rt;}if(lazy[rt]) Wpushdown(rt,l,r);if(x<=mid) ls=Wupd(ls,l,mid,x,y,va);if(y>mid) rs=Wupd(rs,mid+1,r,x,y,va);Wpushup(rt);return rt;}int Wq(int rt,int l,int r,int x,int y){if(x<=l&&r<=y) return v[rt];if(lazy[rt]) Wpushdown(rt,l,r);ll res=0;if(x<=mid) res+=Wq(ls,l,mid,x,y);if(y>mid) res=(res+Wq(rs,mid+1,r,x,y))%mod;return res%mod;}short main(){// freopen(".in","r",stdin),freopen(".out","w",stdout);n=qr,m=qr;fo(i,1,n) a[i]=qr;rot[0]=Wbuild(1,1,n);int tim=0;fo(i,1,m){int op=qr,x=qr,y,va;if(op==1) y=qr,va=qr,rot[++tim]=Wupd(rot[tim],1,n,x,y,va);else if(op==2) y=qr,printf("%d\n",Wq(rot[tim],1,n,x,y));else tim-=x;}return Ratio;}
}
int main(){return Wisadel::main();}

B. Little Busters !

签,不过 Tarjan。跟 Tarjan 真心不熟

赛时暴力寄寄,拿了特殊性质 40pts。

考虑正解,记下每种边,开局只连 lun 边,跑 Tarjan 找边双,边的两端点在同一边双就计入答案,然后考虑 qie 边,两端点不在同一边双就计入答案并将两边双合并,最后判断边双数量是否为 1,输出答案即可。

加练 Tarjan!

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=2e5+5;
const int mod=998244353;
int n,m;
int hh[N],to[N<<1],ne[N<<1],cnt;
int dfn[N],low[N],tot,sccnt,ins[N],bl[N],fx[N];
vector<pair<int,int> >ans,lun,qie;
stack<int>s;
namespace Wisadel
{inline int Wfind(int x){return fx[x]==x?x:fx[x]=Wfind(fx[x]);}void Wadd(int u,int v){to[++cnt]=v;ne[cnt]=hh[u];hh[u]=cnt;}void Wtarjan(int u,int fa){dfn[u]=low[u]=++tot;ins[u]=1;s.push(u);for(int i=hh[u];i!=-1;i=ne[i]){int v=to[i];if(v==fa) continue;if(!dfn[v])Wtarjan(v,u),low[u]=min(low[u],low[v]);else if(ins[v]==1) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){int k=0;sccnt++;while(u!=k){k=s.top();s.pop();ins[k]=0;bl[k]=sccnt;}}}void Wmerge(int x,int y,int id){x=Wfind(x),y=Wfind(y);if(x!=y){ans.push_back(qie[id]);fx[y]=x;sccnt--;}}short main(){n=qr,m=qr;memset(hh,-1,sizeof hh);fo(i,1,m){int a=qr,b=qr;string s;cin>>s;if(s=="Lun") Wadd(a,b),Wadd(b,a),lun.push_back(make_pair(a,b));if(s=="Qie") qie.push_back(make_pair(a,b));}fo(i,1,n){if(!dfn[i]) Wtarjan(i,0);fx[i]=i;}fo(i,0,(int)lun.size()-1)if(bl[lun[i].fi]==bl[lun[i].se]) ans.push_back(lun[i]);fo(i,0,(int)qie.size()-1)if(bl[qie[i].fi]!=bl[qie[i].se]) Wmerge(bl[qie[i].fi],bl[qie[i].se],i);if(sccnt!=1) printf("NO\n");else{printf("YES\n%d\n",ans.size());fo(i,0,ans.size()-1)printf("%d %d\n",ans[i].fi,ans[i].se);}return Ratio;}
}
int main(){return Wisadel::main();}

C. 魔卡少女樱

[ABC276G] Count Sequences

计数题。

赛时打表拿了 45pts,感觉还行。

考虑正解。由于相邻两数模 3 意义下不同余,所以考虑差分,记下相邻两数差模 3 的值,显然不能为 0,因此只有 1 和 2 两种可能。当然可以在查分数组中插入 3,仍能保证合法。我们枚举这里面 2 的个数,再根据差分的性质:和为序列最后的数,即和 \(\le m\),可以求得最多插入 3 的个数,进而总和成答案。

具体见下(有点漏洞,比如这里没有算上开始枚举的 \(a_1\) 即差分数组中第一个数的值):

image

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=2e7+5;
const int mod=998244353;
int n,m;
ll jc[N],ny[N],sum[N],ans;
namespace Wisadel
{ll Wqp(ll x,int y){ll res=1;while(y){if(y&1) res=res*x%mod; x=x*x%mod; y>>=1;}return res;}ll C(int n,int m){if(n>m) return 0;if(!n) return 1;return jc[m]*ny[m-n]%mod*ny[n]%mod;}short main(){n=qr,m=qr;jc[0]=sum[0]=ny[0]=1;fo(i,1,N-3) jc[i]=jc[i-1]*i%mod;ny[N-3]=Wqp(jc[N-3],mod-2);fu(i,N-4,1) ny[i]=ny[i+1]*(i+1)%mod;fo(i,1,m-1) sum[i]=(sum[i-1]+C(n-1,n+i-1))%mod;fo(i,0,2)for(int j=0;j<n&&j+n-1+i<=m;j++)ans=(ans+C(j,n-1)*sum[(m-j-n+1-i)/3]%mod+mod)%mod;printf("%lld\n",ans);return Ratio;}
}
int main(){return Wisadel::main();}

D. 声之形

挺牛的题,甚至因为题面的细节饭堂了

image

这怎么看也很难想到 \(x\) 可以不是序列里的元素啊啊啊,挂 10pts。

最后几场了,想好好打打,不过时间提早半个小时有种刚从被窝钻出来就上战场的感觉。

算上 T1 能到前十,差不多稳定吧。

还有就是迷之主席树开 64 倍空间仍然过不去,对拍还拍不出来,最后还是 5k 来了发现了问题,sto%%% 5k %%%orz!得出的结论是区间修改主席树应该放肆开空间,只要不 MLE 往大了开就行,大概 \(10^7\) 左右吧,直接被控一下午。


完结撒花~

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

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

相关文章

2024暑假集训测试29

前言比赛链接。今上午在家打的,下午回的学校,话说啥时候改成 \(7\) 点开始了? T1 是板子但是没打过标记永久化,想了一段时间想起树状数组维护区间求和操作于是用主席树实现了这个,赛时 T1 不给大样例所以调了挺长时间才放心;T2 想了一会儿没想出来就先打 T3 了,T3 想了一…

hdu2604

用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1); 如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是 mmf的话那么前n…

半导体器件设计概述

功率半导体体器件简要概述功率半导体的内涵 功率半导体是一类能够在高电压、高电流条件下工作的半导体器件,主要用于开关、控制和转换电能,功率半导体的基本原理可归纳为以下三个方面:截至特性:当功率半导体截至时,其内部的电阻变得很大,从而阻止电流通过,起到开关的作用…

2、coredump文件的配置

1、开启core文件的生成 使用ulimit -a命令查看是否打开core文件,如果大小为0,则表明没有打开,如果非0,则表明打开,本人虚拟机上已经设置为unlimited,所以已经打开(1)临时打开 使用ulimit -c命令打开,如设置为无限制,则使用ulimit -c unlimited (2)永久打开 sudo vi…

feehicms 文件上传

如果文件上传中出现了奇奇怪怪的参数可以试着查看其来源和作用侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认为…

如何用纯CSS绘制三角形

要用纯CSS绘制三角形,可以通过利用CSS中的border属性来实现。具体来说,核心原理是通过设置不同方向的边框颜色和宽度来形成三角形效果。以下是写技术博客时可以介绍的几个要点: 1. 三角形的基本原理 CSS三角形的关键在于设置一个元素的宽高为0,同时通过边框来创建三角形。例…

QTabWidget自定义样式(仿DotNetBar)

QSS如下,若需要tab栏背景色需要添加ui->tabWidget->setAttribute(Qt::WA_StyledBackground); 语句使background-color生效,这个时候qtdesigner中仍然看不到背景色,但是不要担心它是生效的,只需在属性中勾上autofillbackground即可在designer中预览(该属性在QWidget属…

如何用纯CSS绘制三角形--02

通过结合@keyframes动画,让三角形实现旋转、移动等动态效果代码如下:<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.…

Kettle 9 加密与解密

使用kettle 加密和解密 ,测试环境: win10 + PDI 9.0 (Pentaho Data integation 9.0.0.0-423 ) 1、进入KETTLE的安装目录 如:cd /d E:\DATA-INTERGRATION 命令行执行: encr.bat -kettle 123 可生成 Encrypted 2be98afc86aa7f2e4cb79ce10bec3fd89 ,即为123对应KETTLE生成…

解密财务报表中的关键指标,带你深入理解企业财务状况

一、概述 财务报表中蕴含了丰富的信息,如果我们在解读时没有清晰的思路,忽略重点,就很容易被庞杂的数据搞得晕头转向。本文将从几个关键指标出发,包括资产负债率的分析、净资产收益率的解读,以及如何计算销售复合增长率,帮助大家更有针对性地理解财务报表。 二、财务报表…

Qwen2-Math,新一代数学模型

原文链接:https://qwenlm.github.io/zh/blog/qwen2-math/友情链接 Github:https://github.com/QwenLM/Qwen2-Math Hugging Face:https://huggingface.co/Qwen ModelScope:https://modelscope.cn/organization/qwen Discord:https://discord.gg/yPEP2vHTu4🚨此模型目前主…

【待做】【安全框架】【日志管理平台】

为了更好的了解各业务系统的运行状态,企业通常需要搭建统一的日志中心,并将各业务系统的系统日志、应用程序日志和安全日志传送到日志平台。 系统管理员和业务负责人通过日志,可以详细了解服务器软硬件信息、系统运行状况以及风险,从而及时采取对应的应对措施。一、对比传统…