GJOI 模拟赛6、7部分题解

news/2025/9/28 16:15:32/文章来源:https://www.cnblogs.com/lc1230/p/19117010

M6 T2

maze
根据题意,我们其实相当于从根节点向下走一颗满二叉树,每次有花费改变方向,然后操作的\(01\)序列不能超过限制。
首先可以将题目差分求解,就变成只有一个限制。
发现一个第 \(n\) 层的点最多遍历一次,那么可以数位 dp
\(f_{i,j,0/1,0/1}\) 考虑到第 \(i\) 层,还有 \(j\) 次更改机会,是否抵达上界,左右是否与现实相同,记录此时的可抵达节点编号和。
由于我们要求点的编号和,而当走向右儿子的时候有一个 \(1\) 的贡献,所以我们还要同时记录可抵达的节点数量。
注意一开始左右是否与现实相同都要算

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pa pair<int,int>
#define fi first
#define se second
#define mk make_pair
const int N=1e3+10,mod=1e9+7;
int n,k;
string t,s1,s2;
int pw2[N],op[N],lim[N];
pa f[N][N][2][2];
pa dfs(int i,int j,bool limit,bool is){if(i==n+1)return mk((j==0),0); if(f[i][j][limit][is].fi!=-1)return f[i][j][limit][is];int up=(limit?lim[i]:1),ans1=0,ans2=0;for(int u=0;u<=up;u++){int is_ch=(is?(op[i]!=u):(op[i]==u));if(is_ch&&j==0)continue;pa now=dfs(i+1,j-is_ch,limit&(u==up),(is^is_ch));ans1=(ans1+now.fi)%mod;ans2=(ans2+now.se)%mod;if(u==1)ans2=(ans2+now.fi*pw2[n-i]%mod)%mod;}return f[i][j][limit][is]=mk(ans1,ans2);
}
int solve(string st){for(int i=1;i<=n;i++)lim[i]=(st[i]=='1');memset(f,-1,sizeof f);pa ans1=dfs(2,k,1,0),ans2=dfs(2,k,1,1);return (ans1.se+ans2.se+(ans1.fi+ans2.fi)%mod*pw2[n-1]%mod)%mod;
}
signed main(){cin>>n>>k;pw2[0]=1;for(int i=1;i<=n;i++)pw2[i]=pw2[i-1]*2ll%mod;cin>>t>>s1>>s2;t='*'+t,s1='*'+s1,s2='*'+s2;for(int i=1;i<n;i++)op[i+1]=(t[i]=='R');for(int i=n;i>=1;i--){if(s1[i]=='1'){s1[i]='0';for(int j=i+1;j<=n;j++)s1[j]='1';break;}}if(s1[1]=='0'){cout<<solve(s2);}else cout<<(solve(s2)-solve(s1)+mod)%mod;return 0;
}

M7 T1

virus 2
先想到暴力:遍历每一天,对于已被感染的所有点做多源最短路,感染所有能被感染的点。
时间是 \(nlogn*d\)
考虑只维护上一次被感染的点和未被感染点之间的边,用一个堆 \(q\),按边权排序。
每一天处理边权小于 \(x_i\) 的边,进行多源最短路拓展。
具体的,我有条边 \(e_i={(val,u)}\) 表示到了 \(u\) 后我还能走 \(val\) 这么远,查询所有 \(u\) 的连边,如果未被感染且 \(w\le val\) 就继续拓展,否则加入 \(q\)


#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,m,head[N],idx;
struct edge{int v,next,w;
}e[N<<1];
void con(int u,int v,int w){idx++;e[idx].v=v;e[idx].w=w;e[idx].next=head[u];head[u]=idx;
}
int ans[N];
#define pa pair<int,int>
#define fi first
#define mk make_pair
#define se second
priority_queue<pa >q,p;
int k,d,a[N],x[N];
signed main(){cin>>n>>m>>k>>d;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;con(u,v,w),con(v,u,w);}memset(ans,-1,sizeof ans);for(int i=1;i<=k;i++){cin>>a[i];ans[a[i]]=0;for(int j=head[a[i]];j;j=e[j].next){int v=e[j].v,w=e[j].w;q.push(mk(-w,v));}}for(int i=1;i<=d;i++)cin>>x[i];for(int day=1;day<=d;day++){int noww=x[day];while((!q.empty())&&-q.top().fi<=noww){int pos=q.top().se,val=noww+q.top().fi;q.pop();if(ans[pos]!=-1)continue;p.push(mk(val,pos));}while(!p.empty()){int u=p.top().se,val=p.top().fi;p.pop();if(ans[u]!=-1)continue;ans[u]=day;for(int i=head[u];i;i=e[i].next){int v=e[i].v,w=e[i].w;if(w>val)q.push(mk(-w,v));else p.push(mk(val-w,v));}}}for(int i=1;i<=n;i++)cout<<ans[i]<<" ";return 0;
}

M7 T2

P12426
首先 \(B\) 是全局绝对众数。
为了排除左右两边多余 \(OI\) 的干扰,容易找到最左最右的 \(B\)
像这样

r=n,l=1;
while(m[1][n]==m[1][r-1])r--;
while(m[l+1][n]==m[1][n])l++;

然后现在我们从 \(l\)\(r\) 考虑每个 \(i\) 是不是 \(B\)
分成两个区间 \([l,i-1],[i,r]\)
我们已知总共有多少个 \(B\) ,遍历过程算出已经找到多少个 \(B\) 记为 \(cnt\)

分类讨论:

我们可以以此处理出这两个区间的绝对众数是不是 \(B\)

注意绝对众数需要两个判断
比如如果 \(m[l][i-1]==cnt\ and \ m[l+1][i-1]==cnt-1\) \([l,i-1]\) 就是绝对众数
假设其中某个区间的绝对众数是 \(B\) 那么如果加上 \(i\) 和不加上的众数个数差为 \(1\)\(i\) 就填 \(B\)

如果两个的绝对众数都不是 \(B\) 那么众数可能是 \(BOI\) 但不会同时是 \(O\) 或者 \(I\)

那么此时我们分别移除左右区间中的 \(l,r\) 这两个确定是 \(B\) 的,那么两个区间的绝对众数就是 \(OI\) 各一个。我们用相似的方法判断 i 是不是 \(O\)\(I\) 即可

#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int n,m[N][N],l,r;
signed main(){cin>>n;if(n==1){cout<<n;return 0;}for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)cin>>m[i][j];r=n,l=1;while(m[1][n]==m[1][r-1])r--;while(m[l+1][n]==m[1][n])l++;cout<<l<<" ";int cnt=1,sum=m[1][n];for(int i=l+1;i<r;i++){if(m[l][i-1]==cnt&&m[l+1][i-1]==cnt-1){if(m[l][i]==m[l][i-1]+1)cnt++,cout<<i<<" ";}else if(m[i][r]==sum-cnt&&m[i][r-1]==sum-cnt-1){if(m[i+1][r]==sum-cnt-1)cnt++,cout<<i<<" ";}else if((m[l+1][i-1]==m[l+1][i]&&m[i+1][r-1]==m[i][r-1])){cnt++;cout<<i<<" ";}}cout<<r;return 0;
}

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

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

相关文章

【C++list】底层结构、迭代器核心原理与常用接口完成全解析

【C++list】底层结构、迭代器核心原理与常用接口完成全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

完整教程:Flink Watermark机制解析

完整教程:Flink Watermark机制解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

2025 年北京湖南菜餐厅推荐:小湖南岸以湖湘本味与匠心服务,成京城湘菜口碑之选

2025 年的北京餐饮市场呈现 “冰火两重天” 的格局:一边是同质化竞争加剧、成本高企导致部分品牌陷入经营困境,另一边是坚守品质与特色的餐饮品牌凭借精准定位实现逆势增长。作为全国美食汇聚地,北京的湘菜赛道尤为…

完整教程:龙芯在启动参数里添加串口信息

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ABC425题解

A. Sigma Cubescode #include<bits/stdc++.h> using namespace std; int n; int main(){cin >> n;int ans = 0;for(int i = 1; i <= n; ++i){ans += ((i&1)?-1:1) * (i * i * i); }cout << …

技术分享 | Dify智能体案例分享:智能导诊助手 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

STM32中的Flash、ROM与RAM全解析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Functions

FunctionsVector std:ranges::sort() -std=c++20 是一个C++20引入的排序函数,收录于#include<algorithm> ()里的内容通常是 vector 和 array(满足随机访问迭代器要求),也可以是其它符合范围 概念 的序列。 使…

科技网站推荐台州找人做网站

1、FACTORY—追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西&#xff0c;虽然口味有所不同&#xff0c;但不管你带MM去麦当劳或肯德基&#xff0c;只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory (下载源码就到源码网:…

QOJ #5421. Factories Once More 题解

Description 有一个王国,共有 \(n\) 座城市,这些城市编号为 \(1\) 到 \(n\)(包含两端)。 王国中有 \(n-1\) 条双向道路将这些城市相连,并且保证任意两座城市之间都可以通过这些道路到达。 女王最近决定新建 \(k\)…

IDEA JAVA项目gitignore文件模板

target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache### IntelliJ IDEA ##…

自动生成验证码

include int main() { srand(static_cast(time(NULL))); string s = "0123456789zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP"; cout << "请输入验证码长度:"; int length; cin…

商城网站带宽控制美肤宝网站建设

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…

365 赚钱宝小程序系统:多元化变现与趣味运营一体的小程序解决方案

在数字化营销与流量变现需求增长的当下,365 赚钱宝作为微信小程序运营工具,凭借 “趣味养成 + 广告盈利 + 裂变引流” 模式,为个人与企业提供低门槛、高潜力的流量变现路径,降低技术与维护成本。 一、概述总结 365…

9.22 总结

T1 这题就是一个二分答案,因为 x 特别小所以可以直接跑背包。然后可以 \(O(1)\) check,所以复杂度是一个 \(\log\)。 T2 这题比较难,当时只写了部分分。 T3 这题也只写了部分分。 T4 就是这题的复杂度是 \(O(n^2)\)…

保亭县住房城市建设局网站域名可以绑定几个网站

Q:给你一个有序数组nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 第一种解决方法&a…

iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程

iOS 26 系统流畅度深度评测 Liquid Glass 动画滑动卡顿、响应延迟、机型差异与 uni-app 优化策略 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

邯郸做网站熊掌号WordPress获取标签名字

文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…