多校A层冲刺NOIP2024模拟赛08

news/2024/10/19 4:34:43

多校A层冲刺NOIP2024模拟赛08

\(T1\) A. 传送 (teleport) \(0pts\)

  • 弱化版: [ABC065D] Built? | luogu P8074 [COCI2009-2010#7] SVEMIR | “迎新春,过大年”多校程序设计竞赛 H 二次元世界之寻找珂朵莉

  • 先不管后面加入的 \(m\) 条边。

  • 对于两点间的路径 \(i \to j\) ,经过中转点 \(k\) 更优当且仅当 \(i \to k\)\(k \to j\) 的路径不同向(不同时是 \(x\) 轴路线且不同时是 \(y\) 轴路线)。

  • 为处理同向间的不必要路径,不妨让所有点先后以横纵坐标排序,相邻两点之间连一条边即可。此时所连的边只有 \(2(n-1)\) 条,加上后面加入的 \(m\) 条边后跑 \(Dijsktra\) 即可。

    点击查看代码
    vector<pair<ll,ll> >e[200010];
    ll p[200010],x[200010],y[200010],vis[200010],dis[200010];
    void add(ll u,ll v,ll w)
    {e[u].push_back(make_pair(v,w));
    }
    bool cmp_x(ll a,ll b)
    {return x[a]<x[b];
    }
    bool cmp_y(ll a,ll b)
    {return y[a]<y[b];
    }
    void dijsktra(ll s)
    {memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));priority_queue<pair<ll,ll> >q;dis[s]=0;q.push(make_pair(-dis[s],s));while(q.empty()==0){ll x=q.top().second;q.pop();if(vis[x]==0){vis[x]=1;for(ll i=0;i<e[x].size();i++){if(dis[e[x][i].first]>dis[x]+e[x][i].second){dis[e[x][i].first]=dis[x]+e[x][i].second;q.push(make_pair(-dis[e[x][i].first],e[x][i].first));}}}}
    }
    int main()
    {freopen("teleport.in","r",stdin);freopen("teleport.out","w",stdout);ll n,m,u,v,w,i;cin>>n>>m;for(i=1;i<=n;i++){cin>>x[i]>>y[i];p[i]=i;}for(i=1;i<=m;i++){cin>>u>>v>>w;add(u,v,w);add(v,u,w);}sort(p+1,p+1+n,cmp_x);for(i=2;i<=n;i++){add(p[i],p[i-1],x[p[i]]-x[p[i-1]]);add(p[i-1],p[i],x[p[i]]-x[p[i-1]]);}for(i=1;i<=n;i++){p[i]=i;}sort(p+1,p+1+n,cmp_y);for(i=2;i<=n;i++){add(p[i],p[i-1],y[p[i]]-y[p[i-1]]);add(p[i-1],p[i],y[p[i]]-y[p[i-1]]);}dijsktra(1);for(i=2;i<=n;i++){cout<<dis[i]<<" ";}fclose(stdin);fclose(stdout);return 0;
    }
    

\(T2\) B. 排列 (permutation) \(20pts\)

  • 部分分
    • 子任务 \(1\) :爆搜。
    • 子任务 \(3\) :至多有一个数为 \(k\) 的倍数,故 \(n!\) 即为所求。
  • 正解
    • \(1 \sim n\) 中是 \(k\) 的倍数的数看做断点。

    • 观察到 \(\frac{n}{k} \le 10\) ,枚举全排列后对相邻两数 \(\gcd=1\) 的进行插板法,最后再乘以 \((n-\left\lfloor \frac{n}{k} \right\rfloor)!\) 即可。

      点击查看代码
      const ll p=998244353;
      ll a[3010],inv[3010],jc[3010],jc_inv[3010];
      ll qpow(ll a,ll b,ll p)
      {ll ans=1;while(b){if(b&1){ans=ans*a%p;}b>>=1;a=a*a%p;}return ans;
      }
      ll gcd(ll a,ll b)
      {return b?gcd(b,a%b):a;
      }
      ll C(ll n,ll m,ll p)
      {return (n>=m&&n>=0&&m>=0)?(jc[n]*jc_inv[n-m])%p*jc_inv[m]%p:0;
      }
      ll A(ll n,ll m,ll p)
      {return (n>=m&&n>=0&&m>=0)?(jc[n]*jc_inv[n-m])%p:0;
      }
      int main()
      {freopen("permutation.in","r",stdin);freopen("permutation.out","w",stdout);ll n,k,m,ans=0,sum=0,i;cin>>n>>k;m=n/k;for(i=1;i<=m;i++){a[i]=i;}jc[0]=jc_inv[0]=1;for(i=1;i<=n;i++){inv[i]=qpow(i,p-2,p);jc[i]=jc[i-1]*i%p;jc_inv[i]=jc_inv[i-1]*inv[i]%p;}do{sum=0;for(i=2;i<=m;i++){sum+=(gcd(a[i],a[i-1])==1);}ans=(ans+C(n-m-sum+m+1-1,m+1-1,p))%p;}while(next_permutation(a+1,a+1+m));cout<<ans*A(n-m,n-m,p)%p<<endl;fclose(stdin);fclose(stdout);return 0;
      }
      

\(T3\) C. 战场模拟器 (simulator) \(9pts\)

  • 弱化版: 北京建筑大学2024年程序设计竞赛(同步赛) A 寿命修改

  • 部分分

    • 子任务 \(1\) :模拟。

    • 子任务 \(2\) :线段树维护。

    • 子任务 \(3\)

  • 正解

    • 因为每个英雄只会死一次,且只有 \(O(q)\) 个护盾,势能线段树即可。
    • 特别地,需要维护最小非负生命值出现次数来计算濒死数量。
    点击查看代码
    ll a[200010];
    struct SMT
    {struct SegmentTree{ll sum,minn,cnt,died,lazy;}tree[800010];ll lson(ll x){return x*2;}ll rson(ll x){return x*2+1;}void pushup(ll rt){tree[rt].sum=tree[lson(rt)].sum+tree[rson(rt)].sum;tree[rt].minn=min(tree[lson(rt)].minn,tree[rson(rt)].minn);tree[rt].cnt=(tree[lson(rt)].minn==tree[rt].minn)*tree[lson(rt)].cnt+(tree[rson(rt)].minn==tree[rt].minn)*tree[rson(rt)].cnt;tree[rt].died=tree[lson(rt)].died+tree[rson(rt)].died;}void build(ll rt,ll l,ll r){if(l==r){tree[rt].minn=a[l];tree[rt].cnt=1;return;}ll mid=(l+r)/2;build(lson(rt),l,mid);build(rson(rt),mid+1,r);pushup(rt);}void pushdown(ll rt){if(tree[rt].lazy!=0){tree[lson(rt)].lazy+=tree[rt].lazy;tree[lson(rt)].minn+=tree[rt].lazy;tree[rson(rt)].lazy+=tree[rt].lazy;tree[rson(rt)].minn+=tree[rt].lazy;tree[rt].lazy=0;}}void update1(ll rt,ll l,ll r,ll x,ll y,ll val){if(tree[rt].died==r-l+1){return;}if(l==r){if(tree[rt].sum==0){tree[rt].minn-=val;if(tree[rt].minn<0){tree[rt].minn=0x7f7f7f7f;tree[rt].died=1;}}else{tree[rt].sum--;}return;}if(x<=l&&r<=y){if(tree[rt].sum==0&&tree[rt].minn-val>=0){tree[rt].minn-=val;tree[rt].lazy-=val;return;}}pushdown(rt);ll mid=(l+r)/2;if(x<=mid){update1(lson(rt),l,mid,x,y,val);}if(y>mid){update1(rson(rt),mid+1,r,x,y,val);}pushup(rt);}void update2(ll rt,ll l,ll r,ll x,ll y,ll val){if(tree[rt].died==r-l+1){return;}if(x<=l&&r<=y){tree[rt].minn+=val;tree[rt].lazy+=val;return;}pushdown(rt);ll mid=(l+r)/2;if(x<=mid){update2(lson(rt),l,mid,x,y,val);}if(y>mid){update2(rson(rt),mid+1,r,x,y,val);}pushup(rt);}void update3(ll rt,ll l,ll r,ll pos){if(tree[rt].died==r-l+1){return;}if(l==r){tree[rt].sum++;return;}pushdown(rt);ll mid=(l+r)/2;if(pos<=mid){update3(lson(rt),l,mid,pos);}else{update3(rson(rt),mid+1,r,pos);}pushup(rt);}ll query1(ll rt,ll l,ll r,ll x,ll y){if(x<=l&&r<=y){return tree[rt].died;}pushdown(rt);ll mid=(l+r)/2,ans=0;if(x<=mid){ans+=query1(lson(rt),l,mid,x,y);}if(y>mid){ans+=query1(rson(rt),mid+1,r,x,y);}return ans;}ll query2(ll rt,ll l,ll r,ll x,ll y){if(x<=l&&r<=y){return (tree[rt].minn==0)*tree[rt].cnt;}pushdown(rt);ll mid=(l+r)/2,ans=0;if(x<=mid){ans+=query2(lson(rt),l,mid,x,y);}if(y>mid){ans+=query2(rson(rt),mid+1,r,x,y);}return ans;}
    }T;
    int main()
    {freopen("simulator.in","r",stdin);freopen("simulator.out","w",stdout);ll n,q,pd,l,r,x,i;cin>>n;for(i=1;i<=n;i++){cin>>a[i];}T.build(1,1,n);cin>>q;for(i=1;i<=q;i++){cin>>pd;if(pd==1){cin>>l>>r>>x;T.update1(1,1,n,l,r,x);}if(pd==2){cin>>l>>r>>x;T.update2(1,1,n,l,r,x);}if(pd==3){cin>>x;T.update3(1,1,n,x);}if(pd==4){cin>>l>>r;cout<<T.query1(1,1,n,l,r)<<endl;}if(pd==5){cin>>l>>r;cout<<T.query2(1,1,n,l,r)<<endl;}}fclose(stdin);fclose(stdout);return 0;
    }
    

\(T4\) D. 点亮 (light) \(0pts\)

总结

  • \(T1\) 输出成了 \(1\)\(1 \sim n\) 的最短路,而且 \(Dijsktra\) 加入队列时把边权当做点的标号加进去了,挂了 \(40pts\)
  • \(T2\) 误认为只要是 \(k\) 的倍数,相邻两数的 \(\gcd\) 就等于 \(k\) ,得到的 \(O(\frac{n^{2}}{k})\) 做法假了。
  • \(T3\) 直接去写势能线段树正解了的,但最后正解没调出来,部分分一点没打。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

KubeSphere v4 安装指南

日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考。 关于 KubeSphere v4 的介绍,请阅读本文:KubeSphere v4 开源并发布全新可插拔架构 LuBan。…

Graphic Raycaster

参数解释Graphic Raycaster —— 射线检测Ignore Reversed Graphics 是否忽略反方向图形,勾选此选项时反转180的图形将不接受射线检测,否则正反面都接受 Blocking Objects 屏蔽指定对象类型,None 都不屏蔽 Two D 屏蔽具有2D碰撞体的2D物理对象,Three D 屏蔽具有3D碰撞体的3…

SAP ABAP ME23N打印预览允许打印

简介: 用户希望PO创建成功时邮件发送打印模板,平时可以通过ME23N打印预览进行打印 实现:ME23N标准打印使用的是Scriptform函数ME_PRINT_PO调用子例程prepare_formular打开FORM,所以在这个子例程OPEN_FORM前的增强点做增强增强内容:IF p_screen NE space .xdialog = X.xde…

Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?

先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。 package com.br.itwzhangzx02.learn; import org.junit.Test; import java.util.ArrayList; import java.util.List; import com.br.itwzhangzx02.learn.POJO.Use…

无刷直流电机

无刷直流电机 无刷直流电机(Brushless Direct Current Motor,简称BLDC)是一种没有电刷和换向器的电机,它使用电子方式切换电流方向来控制电机的旋转。与传统的有刷直流电机相比,无刷直流电机具有许多优点,包括高效率、低噪音、长寿命和高可靠性。 一、直流无刷电机的组成…

Megacli查看Dell服务器Raid状态

通常我们使用的DELL/HP/IBM三家的机架式PC级服务器阵列卡是从LSI的卡OEM出来的,DELL和IBM两家的阵列卡原生程度较高,没有做太多封装,可以用原厂提供的阵列卡管理工具进行监控;而HP的阵列卡一般都做过封装了,因此需要使用自身特有的管理工具来监控。 MegaCli是一款管理维护…

基于BP神经网络的CoSaMP信道估计算法matlab性能仿真,对比LS,OMP,MOMP,CoSaMP

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要LS估计法实现方式较为简单,其估计过程没有考虑实际信道的噪声因素。因此,特别当毫米波MIMO信道干扰较大时,其估计性能较差,只适用于对信道…

中兴光猫F7615TV3 改散热

中兴光猫F7615TV3 改散热之前有剩余的散热片, 各种贴! 温控开关是 50 度的常开, (达到 50 度 开始闭合 接通电路) 风扇开转 电话插口有点影响焊接, 自己又用不到, 直接拆掉! 温控开关这边是接到负极这边 在 dc 取电的时候不太好焊 用打磨笔将金属片 打磨打磨, 就比较好焊接…