CSP-S模拟392025多校冲刺CSP模拟赛8

news/2025/10/26 22:07:38/文章来源:https://www.cnblogs.com/countryhuman/p/19167491

前言:

嘻嘻,虽迟但到(其实没啥意义)的改题

T1:最小生成树(tree)

据说养鸡大户蛙蛙说原始数据暴力可过

请看显然不是我的码风的code
#include<bits/stdc++.h>//骇死我力假了inf版线段树!!! 
using namespace std;
#define lson (root << 1)
#define rson (root << 1 | 1)
const int _ = 100010;
long long ans, as[_];
int n, m, x, y;
bool v[_];
struct hhh{long long l, r;long long z;
}a[_];
struct rain{int l, r;long long mn, lazy;
}tree[_ << 3];
inline bool bbb(hhh x, hhh y){if(x. l != y. l){return x. l < y. l;}return x. r < y. r;
}
inline bool ltong(){int r = 1;for(int i = 1; i <= m; i ++){while(a[i]. r <= r && i <= m){i ++;}if(i == m + 1){break;}if(a[i]. l > r){return 0;}r = a[i]. r;}if(r < n){return 0;}return 1;
}
int main(){scanf("%d%d", & n, & m);for(int i = 1; i <= m; i ++){scanf("%lld%lld%lld", & a[i]. l, & a[i]. r, & a[i]. z);}sort(a + 1, a + m + 1, bbb);if(! ltong()){printf("-1");return 0;}memset(as, 0x3f, sizeof(as));for(int i = 1; i <= m; i ++){for(int j = a[i]. l; j < a[i]. r; j ++){as[j] = min(as[j], a[i]. z);}}for(int i = 1; i < n ;i ++){ans += as[i];}printf("%lld", ans);return 0;return 0;
}//🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢🤢

我们可以使用瞪眼 + 手模的方法从题中得出一个结论:没有一种方案比相邻两个点相连,最后形成的链更优

那我们需要维护的就是每段区间的最小值,并查集和线段树均可。(这里是线段树)

代码:

$code$
#include<iostream>
#include<algorithm>
#define int long long
#define lid id<<1
#define rid id<<1|1
using namespace std;
const int N=1e5+5;
int m,n,l,r,w,ans;
struct css{int l,r,val;bool operator<(const css &fxt)const{if(l!=fxt.l) return l<fxt.l;else return r<fxt.r;}
}a[N];
struct flower{int l,r,minn,lazy;
}tr[N<<3];
inline void pushup(int id){tr[id].minn=(tr[lid].minn+tr[rid].minn);
}
inline void pushdown(int id){tr[lid].minn=min(tr[lid].minn,tr[id].lazy*(tr[lid].r-tr[lid].l+1));tr[rid].minn=min(tr[rid].minn,tr[id].lazy*(tr[rid].r-tr[rid].l+1));tr[lid].lazy=min(tr[lid].lazy,tr[id].lazy);tr[rid].lazy=min(tr[rid].lazy,tr[id].lazy);tr[id].lazy=1e18;
}
inline void build(int id,int l,int r){tr[id].l=l;tr[id].r=r;tr[id].lazy=tr[id].minn=1e18;if(l==r) return ;int mid=(l+r)>>1;build(lid,l,mid);build(rid,mid+1,r);pushup(id);
}
inline void update(int id,int l,int r,int val){if(l<=tr[id].l&&tr[id].r<=r){tr[id].minn=min(tr[id].minn,val*(tr[id].r-tr[id].l+1));tr[id].lazy=min(tr[id].lazy,val);return ;}pushdown(id);int mid=(tr[id].l+tr[id].r)>>1;if(l<=mid) update(lid,l,r,val);if(r>mid) update(rid,l,r,val);pushup(id);
}
inline int query(int id,int l,int r){if(tr[id].l==tr[id].r) return tr[id].minn;pushdown(id);int res=0,mid=(tr[id].l+tr[id].r)>>1;if(l<=mid) res=(res+query(lid,l,r));if(r>mid) res=(res+query(rid,l,r));return res;
}
signed main(){freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>m;build(1,1,n);for(int i=1;i<=m;i++) cin>>a[i].l>>a[i].r>>a[i].val;sort(a+1,a+1+m);for(int i=1;i<=m;i++) update(1,a[i].l,a[i].r-1,a[i].val);int ans=query(1,1,n-1);if(ans>=1e18) cout<<-1<<'\n';else cout<<ans<<'\n';return 0;
}

T2:最短路(roads)

思路:

原始数据暴力也都过了,不过赛后重测全卡了

其实正解是拆点。

把一个点拆为这个点度数+1个点,然后从下往上依次从大到小连入边,然后再从下向上找第一个大于这个点入边的出边然后连上,。并且在一个点拆出的多个点之间连上权值为 \(0\) 的边。最后跑 \(dij\) 就好了。

代码:

$code$
#include<iostream>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
const int N=7e5+5;
int n,m,x,y,a,b,cnt,tot,val[N],dfn[N],head[N],dis[N];
struct flower{int to,a,b;bool operator<(const flower &css)const{return a>css.a;}
};vector<flower> v[N];
struct wutong{int to,nxt,val;
}e[N];
inline void add(int x,int y,int z){e[++tot].to=y;e[tot].val=z;e[tot].nxt=head[x];head[x]=tot;
}
signed main(){freopen("roads.in","r",stdin);freopen("roads.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>m;for(int i=1;i<=m;i++){cin>>x>>y>>a>>b;v[x].push_back((flower){y,a,b});}for(int i=1;i<=n;i++){dfn[i]=++cnt;val[cnt]=1e18;sort(v[i].begin(),v[i].end());for(auto j:v[i]) val[++cnt]=j.a;}dfn[n+1]=++cnt;for(int i=1;i<=n;i++){int l=v[i].size();for(int j=0;j<l;j++){int to=lower_bound(val+dfn[v[i][j].to],val+dfn[v[i][j].to+1],v[i][j].a,greater<int>())-val-1;add(dfn[i],to,v[i][j].a);add(dfn[i]+j+1,to,v[i][j].a-v[i][j].b);add(dfn[i]+j+1,dfn[i]+j,0);}}priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> q;for(int i=1;i<=cnt;i++) dis[i]=1e18;dis[1]=0;q.push({0,1});while(!q.empty()){auto t=q.top();q.pop();int x=t.second;for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(dis[y]>dis[x]+e[i].val){dis[y]=dis[x]+e[i].val;q.push({dis[y],y});}}}for(int i=1;i<=n;i++){int ans=dis[dfn[i]];if(ans>=1e18) cout<<-1<<' ';else cout<<ans<<' ';}return 0;
}

T3:计算任务(mission)

较为简单的折半警报器。不会的可以 \(bdfs\) 一下,也可以去做一下鬼街,也可以微微看一下 this

给每个任务的警报器分摊下来,即给每一个电脑安装一个小警报器。不难发现只有至少一个电脑完成了分摊任务,即到达该小警报器的阈值,这个任务才有可能被完成。

所以操作一就是给电脑安装小警报器,操作二就是查找有没有小警报器“响”了的。有的话就查看大警报器,如果大警报器“响”了的话就代表该任务已经完成,我们就可以记录答案准备输出了。如果大报警器没“响”的话,我们就更新一下“响”了的小报警器的阈值,继续操作就好了。

代码:

$code$
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int N=2e5+5;
struct flower{int lim,id;bool operator<(const flower &css)const{return lim>css.lim;}
};priority_queue<flower> q[N];
int m,n,op,last,y,k,p,x,cnt,a[N],lim[N];
bool st[N];
vector<int> pos[N],ans;
inline int calc(int x){int res=0;for(auto y:pos[x]) res+=a[y];return res;
}
inline void insert(int x){int t=(lim[x]-calc(x)+pos[x].size()-1)/pos[x].size();for(auto y:pos[x]) q[y].push((flower){a[y]+t,x});
}
signed main(){freopen("mission.in","r",stdin);freopen("mission.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>m;while(m--){cin>>op;if(op==1){cin>>y>>k;y^=last;++cnt;while(k--){cin>>p;p^=last;pos[cnt].push_back(p);}lim[cnt]=calc(cnt)+y;insert(cnt);}else{cin>>x>>y;x^=last;y^=last;a[x]+=y;while(!q[x].empty()){auto t=q[x].top();if(t.lim>a[x]) break;q[x].pop();int w=t.id;if(st[w]) continue;if(calc(w)>=lim[w]){st[w]=true;ans.push_back(w);continue;}insert(w);}sort(ans.begin(),ans.end());last=ans.size();cout<<last<<' ';for(int i=0;i<last;i++) cout<<ans[i]<<' ';cout<<'\n';ans.clear();}}return 0;
}

T4:树上纯树(ture)

对不起,大佬讲过的原没做出来

image

正题开始。

我们显然可以得出 \(dp\) 式子:

\[dp_x=min_{y \in subtree} ( dp_y + a_x * b_y ) \]

然后用李超线段树一维护就好了。

代码:

$code$
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+5,inf=1e18;
int n,u,v,a[N],b[N],cnt,tot,head[N],rt[N];
struct flower{int k,b;
}line[N];
struct css{int l,r,x;
}tr[N<<3];
struct miss{int to,nxt;
}e[N<<1];
inline void add(int x,int y){e[++tot].to=y;e[tot].nxt=head[x];head[x]=tot;e[++tot].to=x;e[tot].nxt=head[y];head[y]=tot;
}
inline int calc(int id,int x){return line[id].k*x+line[id].b;
}
inline bool cmp(int i,int j,int x){if(calc(i,x)>calc(j,x)) return true;else return false;
}
inline void insert(int &rt,int l,int r,int id){if(!rt) rt=++cnt;if(!tr[rt].x){tr[rt].x=id;return ;}int mid=(l+r)>>1;if(calc(id,mid)<calc(tr[rt].x,mid)) swap(id,tr[rt].x);if(calc(id,l)<calc(tr[rt].x,l)) insert(tr[rt].l,l,mid,id);if(calc(id,r)<calc(tr[rt].x,r)) insert(tr[rt].r,mid+1,r,id);
}
inline int query(int rt,int l,int r,int x){if(!rt) return inf;int ans=calc(tr[rt].x,x);if(l==r) return ans;int mid=(l+r)>>1;if(x<=mid) ans=min(ans,query(tr[rt].l,l,mid,x));else ans=min(ans,query(tr[rt].r,mid+1,r,x));return ans;
}
inline int merge(int x,int y,int l,int r){if(!x||!y) return x+y;if(l==r){if(calc(tr[x].x,l)>calc(tr[y].x,l)) return y;return x;}int mid=(l+r)>>1;tr[x].l=merge(tr[x].l,tr[y].l,l,mid);tr[x].r=merge(tr[x].r,tr[y].r,mid+1,r);insert(x,l,r,tr[y].x);return x;
}
inline void dfs(int x,int fa){int f=0;for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;f++;dfs(y,x);rt[x]=merge(rt[x],rt[y],-N,N);}line[x].k=b[x];if(f) line[x].b=query(rt[x],-N,N,a[x]);else line[x].b=0;insert(rt[x],-N,N,x);
}
signed main(){freopen("ture.in","r",stdin);freopen("ture.out","w",stdout);ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];for(int i=1;i<n;i++){cin>>u>>v;add(u,v);}dfs(1,0);for(int i=1;i<=n;i++) cout<<line[i].b<<' ';return 0;
}

后言

🌸表白小狗

众所周知,一个回文串是一个好串

而 $ dog $ 与 $ god $ 拼一起显然是回文的

所以......

小狗是这个世界的真神

ta是这个世界上最美好、最忠诚的呀~~

最爱我的小狗啦~~

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

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

相关文章

关于莫队算法

莫队算法,优雅的暴力~ 先来一道例题 P3901 数列找不同引入:如何解决?\(O\)(\(n^2\)) 每次读入询问区间\(l至r\)暴力判定!如何优化? 已经知道区间l至r,可以\(O(1)\)扩展至区间l+1至r~询问无序,如何解决步子过大,…

Serilog 日志库的简介

本文主要介绍了 Serilog 的几个核心特点,并简单列了下适用场景,供参考。〇、前言 相较于 log4net,Serilog 则是新项目的首选,现代化、高性能、易用,是 .NET 日志的未来方向。如需了解 log4net 详见往期博文:http…

2025东莞环评公司/环评手续/环评报告/环评验收推荐:广东三洁环保,专业高效,合规保障

2025东莞环评公司/环评手续/环评报告/环评验收推荐:专业高效,合规保障 当前东莞环评领域的技术挑战与数据现状 随着东莞市制造业的持续发展和环保政策的日益严格,环评行业面临着前所未有的技术挑战。根据相关统计数…

word文档使用技巧----一键插入题注

这个学期某课程word文档报告需要图片有题注才给较高的分数,一张张图片打题注非常麻烦,网上搜到用脚本插入题注的方法,修改了一下,方便下次直接复制。 在word的开发工具选择Visual Basic-->插入-->模块-->…

再见 懦弱者的泪滴 善恶判断舍弃 永别 那廉价的正义

test28 我用什么才能留住你liuzhuni 我当然知道正解符合人类直觉,但是任意错解难道不符合很多人的直觉吗,没有大样例好难啊好难啊。注意到最优解一定可以是某种田忌赛马,不妨枚举赢的断点,来做一个暴力的对拍。 首…

2025年东莞环评公司权威推荐榜:环评手续/环评报告/环评验收一站式服务,专业高效合规首选厂家

2025年东莞环评公司权威推荐榜:环评手续/环评报告/环评验收一站式服务,专业高效合规首选厂家 行业背景分析 随着国家环保政策的持续收紧和企业环保意识的提升,环评服务市场正迎来前所未有的发展机遇。在制造业重镇东…

【CI130x-离在线】FreeRTOS的信号量

CI130x ALG SDK库中的audio_play_os_state_t audio_play_semaphore_give(audio_play_os_sem_t xSemaphore)函数是对 FreeRTOS 内置函数 xSemaphoreGive()的简单封装/*** @brief 发送信号量** @param xSemaphore 信号量…

践行 “学思行”,解锁学习新境界

践行 “学思行”,解锁学习新境界—— 读三篇学习类文章有感 在阅读了《大学生上课为什么一定要认真听讲?》《“做中学(Learning By Doing)” 之乒乓球刻意训练一年总结》《优秀的教学方法 --- 做教练与做中学》这三…

Windows Archive

MSDN and TechNetMSDN and TechNet LibrariesWe started the migration of MSDN Library and TechNet Library to docs.microsoft.com in late 2017, and completed the migration this year.MSDN and TechNet ForumsW…

变盲从为探索:专注听课

在阅读《大学生为何必须重视课堂专注?》及后续两篇关于“学用结合”的分享后,我如醍醐灌顶,深刻领悟到真正的成长,绝非被动地接受知识灌输,而是一场需要主动发力的修行——既需要高效的课堂输入,也需要扎实的实践…

以听为基,以做为翼

以听为基,以做为翼,共赴学习成长之途 阅读了三篇关于学习方法的文章后,我对大学阶段的学习有了更深刻的认知,它们从不同维度为我指明了学习的方向,让我获益匪浅。 在《大学生上课为什么一定要认真听讲?》一文中,…

[java 虚拟线程 ]

package com.hugh.java17.v19;import java.time.Duration; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.IntStream;import org.slf4j.Logger; imp…

【ArcMap】按属性表复制字段并上移一段距离

将属性表中 LXMC 为 名称2 的字段复制并上移20米,在py编辑器中插入以下代码:# -*- coding: utf-8 -*- import arcpy import os import sys# 重新加载sys并设置默认编码 reload(sys) sys.setdefaultencoding(utf-8)# …

WPF 关闭程序 Aforge摄像头关闭不了 问题

public static Bitmap StaticBitmap = new Bitmap(100,100); public void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs){lock (StaticHelper.StaticBitmap){using (Bitmap b = (Bitmap)eventArgs.Frame)…

CF1060

题目 C(Hard Version) 因为制造两个2的倍数只需至多两次操作,因此按价格排序后,选择方案只有\(1+i\),\(i\) 和 \(1\) 三种,直接判断即可。\(\Omicron(n\ln{n})\) D 按树的深度进行奇偶分类,从叶节点开始删除,设当前奇…

以专注筑基,以实践致远

以专注筑基,以实践致远——三篇文章带给我的学习启示 细读三篇关于学习与成长的文章,仿佛为我混乱的大学学习状态点亮了一盏明灯。从Scalers强调的课堂专注,到娄老师践行的刻意训练与“做中学”,字里行间的真知灼见…

2025.10.24 测试

2025.10.24 测试提高组模拟赛, shanganze 2h AK me 只会两道,被踩爆了 把简单题想复杂了,写太慢了 1. 谔谔,不知道为什么浪费好长时间 就做个前缀和 然后想用 set 但求不了 个数 然后写了个线段树 2. 一眼 每一列答…

102302139 尚子骐 数据采集与融合作业1

作业一: 1. 完整代码以及运行结果点击查看代码 import requests from bs4 import BeautifulSoup import timedef get_university_ranking(url):try:headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64…

CF1152F2 Neko Rules the Catniverse (Large Version) 题解

\(\text{CF1152F2 Neko Rules the Catniverse (Large Version) 题解}\) 这个题有点意思啊。 我们大胆猜想这个题的 dp 是从每个星球一个一个线性转移的。得到这个结论有两种方式: 法一:发现按照 Neko 飞行的轨迹直接…