【MX-S7】梦熊 NOIP 2024 模拟赛 3 SMOI Round 2

news/2025/2/24 10:28:22/文章来源:https://www.cnblogs.com/hzoi-Cu/p/18565892

俩签到俩不可做是吧。

Rank

image

【MX-S7-T1】「SMOI-R2」Happy Card

签到题一号,以为撑死评个黄但没想到那么多人不会打扑克。

考虑炸弹也是三带一,出三带一肯定更优秀。

考虑将所有牌变为若干个三张和剩余的,那么三张先带单张,再将对子拆开带。那么现在就有以下几种情况:

  1. 单张太多,那么就是将所有三带用完然后出对子和单张。
  2. 三张有剩余,再根据对子的数量分情况:
    1. 对子将三张耗完了,那么剩下的就当对子出,注意特判是否剩一张凑不成对子。
    2. 三张有剩余,考虑三张之间自行消耗,具体的,将一个三张分成三个单张,然后带走其他三个三张即可。考虑剩余:如果剩余一个三张,那么将这个分成一个对子和一张单牌;余两个,那么将这个分成一个三带一和一个对子;余三个,分成两个三带一和一张单牌。
      依照上文模拟即可,时间复杂度\(O(n)\)
点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("file/in.in","r",stdin),*OutFile = freopen("file/out.out","w",stdout);
#elseFILE *InFile = stdin,*OutFile = stdout;// FILE *InFile = freopen("card.in","r",stdin),*OutFile = freopen("card.out","w",stdout);
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#define int long long
const int N = 3e5 + 10;
int n,a[N],ct[3];
inline void solve(){cin>>n;rep(i,1,n,1) cin>>a[i];ll ans = 0,ct3 = 0;memset(ct,0,sizeof ct);rep(i,1,n,1) ct3 += a[i]/3,ct[a[i]%3]++;int res = min(ct3,ct[1]);ans += res,ct3 -= res;ct[1] -= res;if(!ct3) cout<<ans + ct[2] + ct[1]<<'\n';else{if(ct[2]*2 >= ct3){ans += ct3;if(ct3&1){ans += (2*ct[2]-ct3)/2+1;}else ans += (2*ct[2] - ct3)/2;}else{ans += ct[2]*2;ct3 -= ct[2]*2;ans += ct3/4*3;ct3 %= 4;if(ct3 == 1) ans += 2;if(ct3 == 2) ans += 2;if(ct3 == 3) ans += 3;}cout<<ans<<'\n';}
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int T;cin>>T;while(T--) solve();
}

【MX-S7-T2】「SMOI-R2」Speaker

半个签,但是不懂为啥只评了个绿。

\(f_x\) 表示 \(x\) 子树内所有的点到 \(x\) 的最大贡献(贡献定义为 \(c_i-\text{路径长度}\),下同)。显然有 \(f_x=\max\limits_{y\in son_x}f_y-2\times dist(x,y)\)

\(g_x\) 表示 \(x\) 子树外所有的点到 \(x\) 的最大贡献,显然有 \(g_x=\max\{f_{fa_x},g_{fa_x}\}-2\times dist(fa_x,x)\)

然后额外的贡献就是 \(x\to y\) 路径上 \(f\) 的最大值和 \(g_{LCA(x,y)}\)\(\max\)

写个树剖+ST表或者倍增写一下即可,时间复杂度 \(O(n+q\log n)\)\(O(n\log n+q\log n)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("file/in.in","r",stdin),*OutFile = freopen("file/out.out","w",stdout);
#elseFILE *InFile = stdin,*OutFile = stdout;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#define int long long
#define eb emplace_back
const int N = 2e5 + 10;
struct node{int to,w;node(int T,int W):to(T),w(W){};};vector<node>e[N];
int n,q;
int top[N],siz[N],son[N],dfn[N],rdfn[N],tim,fa[N],dep[N],f[N],a[N],g[N],dist[N];
int st[19][N],lg[N];
inline void pre(){rep(i,2,n,1) lg[i] = lg[i >> 1] + 1;rep(i,1,n,1) st[0][i] = f[rdfn[i]];int t = lg[n];rep(j,1,t,1) rep(i,1,n-(1<<j)+1,1) st[j][i] = max(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
inline int qry(int l,int r){int k = lg[r-l+1];return max(st[k][l],st[k][r-(1<<k)+1]);}
void dfsf(int x,int fa){f[x] = a[x];for(auto [y,w]:e[x]){if(y == fa) continue;dfsf(y,x);f[x] = max(f[x],f[y] - 2*w);}
}
void dfsg(int x,int fa){for(auto [y,w]:e[x]){if(y == fa) continue;g[y] = max(g[x],f[x]) - 2*w;dfsg(y,x);}
}
void dfs1(int x){siz[x] = 1;dep[x] = dep[fa[x]] + 1;for(auto [y,w]:e[x]){if(y == fa[x]) continue;fa[y] = x;dist[y] = dist[x] + w;dfs1(y);siz[x] += siz[y];if(siz[son[x]] < siz[y]) son[x] = y;}
}
void dfs2(int x,int t){top[x] = t;rdfn[dfn[x] = ++tim] = x;if(son[x]) dfs2(son[x],t);else return;for(auto [y,w]:e[x]){if(y == fa[x] || y == son[x]) continue;dfs2(y,y);}
}
inline int query(int x,int y){int res = a[x] + a[y] - dist[x] - dist[y],fx = top[x],fy = top[y],add = max(f[x],f[y]);while(fx ^ fy){if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);add = max(add,qry(dfn[fx],dfn[x]));x = fa[fx],fx = top[x];}if(dep[x] > dep[y]) swap(x,y);add = max(add,qry(dfn[x],dfn[y]));add = max(g[x],add);res += dist[x]*2;return res + add;
}
inline void solve(){cin>>n>>q;rep(i,1,n,1) cin>>a[i];rep(i,2,n,1){int u,v,w;cin>>u>>v>>w;e[u].eb(v,w);e[v].eb(u,w);}memset(f,-0x3f,sizeof f);memset(g,-0x3f,sizeof g);dfsf(1,0);dfsg(1,0);dfs1(1);dfs2(1,1);pre();rep(test,1,q,1){int x,y;cin>>x>>y;cout<<query(x,y)<<'\n';}
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);solve();
}

【MX-S7-T3】「SMOI-R2」Monotonic Queue

没看懂题,就会依照题意模拟了。

\(a_{n+1}=inf\),记\(R_i\)\(a\)\(i\)右边第一个大于\(a_i\)的数的位置。如果一个数\(c_i\)有贡献,当且仅当存在一个\(j\)满足\(l_j\le R_i\And R_i\le r_{i+1}\),这个可以通过手膜出来。发现如果存在\(i\)满足\(l_i=l_{i+1}\),那么区间\([l_{i+1},r_{i+1}]\)是无用的,因为有贡献的还是有贡献,没贡献的还是没贡献。所以就钦定\(l_i=i\)即可。

那么此时\(c_i\)有贡献的条件变成了\(R_i\le r_{j+1}\),假设\(r^\prime_i=r_{i+1}\),那么\(r^\prime_i\)可以取到时当且仅当\(i+1\le r^\prime_i\le n,r^\prime_i\le r^\prime_{i+1}\)

\(f_{i,j}\)表示考虑了\(r^\prime_{1\cdots i}\)的取值,且\(r^\prime_i=j\)时的最优答案,那么\(f_{i,j}=[j\le R_i]\max\limits_{k=i}^jf_{i-1,k}\)。答案为\(\max\limits_{i=1}^{n-1}f_{i,i+1}\)

考虑这个东西就是求前缀\(\max\)和区间加法,考虑线段树维护,每次更新相当于\([R_i,n]\)\(c_i\),但是如果\(c_i<0\),那么就要重新维护一下单调性,具体的,线段树上二分求出第一个\(\ge f_{i,R_i-1}\)的位置\(p\),将\([R_i,p]\)区间覆盖成\(f_{i,R_i-1}\),时间复杂度\(O(n\log n)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("file/in.in","r",stdin),*OutFile = freopen("file/out.out","w",stdout);
#elseFILE *InFile = stdin,*OutFile = stdout;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#define int long long
const int N = 5e5 + 10;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n,a[N],c[N],r[N];stack<int> sta;
struct Segment_Tree{struct segment_tree{int l,r;ll val,lz,cover;#define l(x) tree[x].l#define r(x) tree[x].r#define val(x) tree[x].val#define lz(x) tree[x].lz#define cover(x) tree[x].cover}tree[N<<2];inline void P(int k){val(k) = max(val(k<<1),val(k<<1|1));}inline void D(int k){int ls = k<<1,rs = k<<1|1;if(cover(k) != inf){val(ls) = cover(k);val(rs) = cover(k);lz(ls) = lz(rs) = 0;cover(ls) = cover(rs) = cover(k);cover(k) = inf;}if(lz(k)){val(ls) += lz(k);val(rs) += lz(k);lz(ls) += lz(k);lz(rs) += lz(k);lz(k) = 0;}}void B(int k = 1,int l = 1,int r = n){l(k) = l,r(k) = r,lz(k) = 0,cover(k) = inf;if(l == r) return val(k) = 0,void();int mid = (l + r) >> 1;B(k<<1,l,mid);B(k<<1|1,mid+1,r);P(k);}void U1(int k,int l,int r,int val){if(l <= l(k) && r(k) <= r) return val(k) += val,lz(k) += val,void();D(k);int mid = (l(k) + r(k)) >> 1;if(l <= mid) U1(k<<1,l,r,val);if(r > mid) U1(k<<1|1,l,r,val);P(k);}void U2(int k,int l,int r,int val){if(l <= l(k) && r(k) <= r) return val(k) = val,lz(k) = 0,cover(k) = val,void();D(k);int mid = (l(k) + r(k)) >> 1;if(l <= mid) U2(k<<1,l,r,val);if(r > mid) U2(k<<1|1,l,r,val);P(k);}int qry1(int k,int p){if(l(k) == r(k)) return val(k);D(k);return (p <= ((l(k) + r(k))>>1))?qry1(k<<1,p):qry1(k<<1|1,p);}int qry2(int k,int l,int r,int p){if(val(k) < p) return -1;if(l(k) == r(k)) return l(k);D(k);int mid = (l(k) + r(k)) >> 1;if(r <= mid) return qry2(k<<1,l,r,p);if(l > mid) return qry2(k<<1|1,l,r,p);int res = qry2(k<<1,l,r,p);if(res == -1) return qry2(k<<1|1,l,r,p);return res;}#undef l#undef r#undef val#undef lz#undef cover
}T;
inline void solve(){cin>>n;rep(i,1,n,1) cin>>c[i];rep(i,1,n,1) cin>>a[i];a[n + 1] = 1e9+10;rep(i,1,n + 1,1){while(sta.size() && a[sta.top()] < a[i]) r[sta.top()] = i,sta.pop();sta.emplace(i);}T.B();ll ans = 0;rep(i,1,n-1,1){T.U2(1,i,i,-inf);if(r[i] > n) continue;T.U1(1,r[i],n,c[i]);if(c[i] < 0){int lst = T.qry1(1,r[i]-1),pos = T.qry2(1,r[i],n,lst);if(pos == -1) T.U2(1,r[i],n,lst);else if(pos - 1 >= r[i]) T.U2(1,r[i],pos-1,lst);}ans = max(ans,T.qry1(1,i+1));} cout<<ans<<'\n';
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);solve();
}

MX-S7-T4】「SMOI-R2」XA-Game

不会

p

image

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

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

相关文章

我勒湘军杯

今天以体验队参加了湘军杯,感觉和ctf差别挺大 使用sql注入、xss等方式对靶场漏洞进行挖掘,漏洞挖掘感觉需要把知识系统的利用起来, 虽然也是ctf的知识,但是感觉ctf的目标很明确,获取flag就结束,而且可以在网上搜索到类似的步骤解题

Springboot如何利用模板,快速生成word文档?

前言 大家好,我是小徐啊。我们在使用SpringBoot开发的时候,有时候会遇到需要生成word文档的情况。一般情况下,就是将一些数据填充到word文档里面。其实Java是有开源的第三方jar包的。今天,小徐就来介绍下如何在SpringBoot里面生成word文档。 如何设置 首先,我们需要在pom.…

HCIA-03 常用协议 ARP TCP UDP ICMP

主要介绍了常用协议和IP协议的基础知识, 包括TCP/UDP协议的工作原理、ARP地址解析协议的作用、ICMP协议用于网络控制和查询的信息传递等。 重点讲述了TCP协议的三次握手建立连接、数据传输与四次挥手断开连接的过程 以及IP协议在网络层实现跨广播域通信的基本原理。 此外,还提…

DDD之理解复杂度、尊重复杂度、掌控复杂度

本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。 背景 关于“复杂度”我在系列…

树的遍历顺序及其应用

树的遍历顺序及其应用 一、DFS 序 DFS 序就是以 DFS 的方式,记录每一个节点第一次被访问的顺序,这种顺序形成一个形成一个长度为 \(n\) 的序列。主要被用来维护子树信息。有以下特点:对于任意一个点来说,其子树里所有点的 DFS 序是连续的,具体来讲, \(x\) 的子树的所有结…

视野修炼-技术周刊第111期 | 读文件 API 性能对比

① Node.js 与 Bun 读取文件速度对比 ② 2024 HTML现状调研 ③ Viselect - 直观的 DOM 选择 ④ fraction.js - 精确的十进制运算库 ⑤ npmpackage.info - 在线查看 npm 包相关概览信息 ⑥ dive - 展示 docker 镜像里层的内容 ⑦ lcl.host - 一键本地生SSL证书 ⑧ 12 个现代CSS技…

[CPP]继承

继承友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。什么是继承 继承是面向对象编程(OOP)中的一个重要概念,它是一种创建新类(称为派…

MIT 操作系统6.S081第一章

1.1进程和内存 fork 父进程中 fork 返回 子进程的PID 子进程中 fork 返回 0 exit exit会让当前进程停止执行并释放资源(包括内存和打开的文件) 通常: 0 表示 成功 1 表示 失败 wait wait 系统调用并返回当前进程已退出或杀死的进程PID,并将子进程的状态复制到wait的地址 另…

TIA 做交通信号灯控制练习1

练习一下交通信号灯程序,从简单的功能做起。红绿黄等交替亮起。使用TIA编程,做成FB。新建一个TIA项目,选择一个1200CPU. 1. 新建一个FB,在新建的FB,先配置输入输出变量。 2. 在FB写下面的程序3. 在WINCC上建立1200?1500的变量连接,连接博图模拟器,建立变量。4.WINCC画…

Nuxt.js 应用中的 webpack:change 事件钩子

title: Nuxt.js 应用中的 webpack:change 事件钩子 date: 2024/11/24 updated: 2024/11/24 author: cmdragon excerpt: 通过webpack:change钩子,开发者可以知道哪些文件被修改,并可以进行适当的处理,比如重新加载相关模块,或更新用户界面等。 categories:前端开发tags:N…

HCIA-04 IP层及IP地址规划

详细介绍了IP地址规划的相关知识,包括IP地址的基本概念、格式、版本、头部字段、服务类型、分片机制、生存时间(TTL)以及IP地址分类等。特别强调了子网划分的重要性及其应用场景,通过实例演示了如何进行子网划分计算,包括子网数量、IP地址数量及每个子网的地址范围等。此外…

【MX-S7】梦熊 NOIP 2024 模拟赛 3 SMOI Round 2(同步赛)

【MX-S7】梦熊 NOIP 2024 模拟赛 3 & SMOI Round 2(同步赛)\(T1\) luogu P11323 【MX-S7-T1】「SMOI-R2」Happy Card \(20pts\)发现可以把「炸弹」也看做「三带一」。先使用「三带一」带走原用于出「单牌」的牌,若「三带一」还有剩余则尝试带走原用于出「对子」的牌,否…