[39] (多校联训) A层冲刺NOIP2024模拟赛01

news/2024/12/22 9:05:46/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18445748

你们不感觉最近机房网越来越慢了吗,现在下个 10M 的东西要用三分钟,而且期间访问不了网站

整个机房分 1000Mbps 的带宽为啥只能分这么一点, huge 拿我电脑挖矿了?

本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考

huge: 参加的都是咱们北方这几个强校

你说得对,但是广东为啥是北方

A.构造字符串

维护并查集,同一个连通块内的数字应该相同

对于一个要求 \((x_i,y_i,z_i)\),应该让 \(\forall j\in[0,z_i-1]\),连接 \(x_i+j,y_i+j\),这样才能保证在规定范围内的数字都相等

其次来看不合法的,不合法的就是一定不能相等的,显然应该是每组询问中的 \(x_i+z_i\)\(y_i+z_i\),因为如果他俩相等的话,答案就不是 \(z_i\) 了,而是 \(z_i+1\)

那么我们可以贪心地做这道题,每次遇到没填的数就考虑填入最小的数,然后把相同连通块内的数都填成一样的数

需要注意你填的时候需要保证能够满足所有的限制条件,比如现在有三个数,\(1\)\(3\) 相同,\(2\)\(3\) 不同,那么你给 \(1,3\) 填了 \(0\),给 \(2\) 填的时候需要注意一下满足所有的限制条件,赛时没判断后方的限制条件,所以这里填的是 \(0\),再往后挪一位就错了

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+5;
int n,m,a[N];
int x,y,z,k,t,q;
int tot,fa[N];
struct sb{int x,y,z;
}e[N];
bool cmp(sb a,sb b){if(a.x!=b.x)return a.x<b.x;if(a.y!=b.y)return a.y<b.y;return a.z<b.z;
}
int find(int x){return x==fa[x]?x:x=find(fa[x]);
}
bool butong[N][N],tong[N][N],vis[N],v[N];
signed main(){freopen("str.in","r",stdin);freopen("str.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=m;i++){cin>>x>>y>>z;if(x>y)swap(x,y);e[i]={x,y,z};}sort(e+1,e+1+m,cmp);for(int i=1;i<=m;i++){if(e[i].y+e[i].z>1+n){cout<<-1;return 0;}if(tong[e[i].x+e[i].z][e[i].z+e[i].y]){cout<<-1;return 0;}butong[e[i].x+e[i].z][e[i].z+e[i].y]=butong[e[i].z+e[i].y][e[i].x+e[i].z]=1;for(int j=e[i].x,k=e[i].y;j<e[i].x+e[i].z;j++,k++){if(butong[j][k]){cout<<-1;return 0;}tong[j][k]=tong[k][j]=1;}}for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=n;i++){for(int j=1;j<i;j++){if(tong[i][j]){int ii=find(i),jj=find(j);if(ii<jj)fa[jj]=ii;else fa[ii]=jj;}}}for(int i=1;i<=n;i++){for(int j=1;j<i;j++){if(butong[i][j]){// cout<<find(i)<<' '<<find(j)<<endl;butong[find(i)][find(j)]=butong[find(j)][find(i)]=1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(butong[i][j]&&tong[i][j]){cout<<-1;return 0;}}}// for(int i=1;i<=n;i++){// 	cout<<fa[i]<<" ";// }cout<<endl;for(int i=1;i<=n;i++){int op=find(i);if(!vis[op]){memset(v,0,sizeof v);for(int j=1;j<=n;j++){int nn=find(j);if(nn<op){if(butong[op][nn]){// if(i==2)cout<<i<<' '<<op<<' '<<j<<' '<<nn<<endl;v[a[nn]]=1;}}}for(int j=0;j<=n;j++){if(v[j]==0){tot=max(tot,j);a[op]=j;break;}}vis[op]=1;}cout<<a[op]<<' ';}return 0;
}

B.寻宝

本场最送

连通性问题,注意到 \(k\) 很小,显然可以缩点,把所有联通的节点都连在一起(忽略传送门)

然后处理传送门,相当于在连通块之间联有向边

判断联通的时候直接跑 DFS 即可,由于边很少,单次查询最高只有 \(O(k)\)

发现只给了 \(n\times m\) 的范围,静态数组开不下,所以题解说用 bitset 存,啥年代了还在用 bitset,vector 扩容不是更好

#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;
vector<vector<int>>mp;
struct door{int x1,x2,y1,y2;
}de[101];
int cnt=0;
struct node{int x,y;
};
queue<node>p;
bool vis[50001];
void bfs(int x,int y,int loc){while(!p.empty()) p.pop();p.push({x,y});while(!p.empty()){node u=p.front();p.pop();if(mp[u.x][u.y]!=0) continue;mp[u.x][u.y]=loc;if(u.x<n) p.push({u.x+1,u.y});if(u.x>1) p.push({u.x-1,u.y});if(u.y<m) p.push({u.x,u.y+1});if(u.y>1) p.push({u.x,u.y-1});}
}
vector<int>e[50001];
bool judge(int x,int tar){if(x==tar) return true;vis[x]=true;for(int i:e[x]){if(!vis[i] and judge(i,tar)) return true;}return false;
}
int main(){
//	freopen("treasure/treasure4.in","r",stdin);
//	freopen("out.out","w",stdout);freopen("treasure.in","r",stdin);freopen("treasure.out","w",stdout);scanf("%d %d %d %d",&n,&m,&k,&q);mp.resize(n+1);for(int i=1;i<=n;++i){mp[i].resize(m+1);}for(int i=1;i<=n;++i){string s;cin>>s;for(int j=0;j<=m-1;++j){mp[i][j+1]=(s[j]=='.'?0:-1);}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(mp[i][j]==0){bfs(i,j,++cnt);}}}
//	for(int i=1;i<=n;++i){
//		for(int j=1;j<=m;++j){
//			cout<<mp[i][j]<<" ";
//		}
//		cout<<endl;
//	}for(int i=1;i<=k;++i){scanf("%d %d %d %d",&de[i].x1,&de[i].y1,&de[i].x2,&de[i].y2);if(mp[de[i].x1][de[i].y1]!=mp[de[i].x2][de[i].y2]){e[mp[de[i].x1][de[i].y1]].push_back(mp[de[i].x2][de[i].y2]);}}while(q--){int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);for(int i=1;i<=cnt;++i) vis[i]&=0;putchar(judge(mp[a][b],mp[c][d])+'0');putchar('\n');}
}
/*
4 4 2 1
.#..
##..
#...
...#
1 1 1 3
4 1 4 2
4 1 3 2
*/

C.序列

\(n^2\)

设计 \(f_i\) 表示从 \(i\) 开始的子序列最大值

对每次询问转移,转移方程

\[f_i=\begin{cases}\max(a-kb,f_{i+1}+a-kb)\qquad i\ge p_i\\f_{i+1}+a-kb\qquad \text{otherwise}\end{cases} \]

从后向前转移,统计答案从 \([1,p_i]\) 取最大值

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
struct yuanshen{int a,b;
}y[1000001];
int f[1000002];
signed main(){
//	freopen("seq/seq3.in","r",stdin);
//	freopen("out.out","w",stdout);freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);scanf("%lld %lld",&n,&m);for(int i=1;i<=n;++i){scanf("%lld %lld",&y[i].a,&y[i].b);}while(m--){int p,k;scanf("%lld %lld",&p,&k);for(int i=1;i<=n;++i) f[i]&=0;for(int i=n;i>=p;--i){f[i]=max({y[i].a-k*y[i].b,f[i+1]+y[i].a-k*y[i].b});}int ans=f[p];for(int i=p-1;i>=1;--i){f[i]=f[i+1]+y[i].a-k*y[i].b;ans=max(f[i],ans);}cout<<ans<<'\n';}
}

E.我要挂一道题

挂一道题

做之前:若智,这有啥意义

做之后:若智


若智,谁放的
我最爱去的唱片店    //在看到这句话之前 我一直以为是 我最爱吃的炒面片
昨天是她的最后一天
曾经让我陶醉的碎片
全都散落在街边
我最爱去的书店    //我最爱吃的薯片
她也没撑过这个夏天   //码的还以为这是啥美食歌
回忆文字流淌着怀念
可是已没什么好怀念
可是你曾经的那些梦
都已变得模糊看不见
那些为了理想的战斗
也不过为了钱
可是我最恨的那个人
他始终没死在我面前   //迷惑句子
还没年轻就变得苍老
这一生无解
没有我的空间
没有我的空间
没有我的空间
没有我的空间
你曾热爱的那个人
这一生也不会再见面
你等在这文化的废墟上
已没人觉得你狂野
那些让人敬仰的神殿
只在无知的人心中灵验
我住在属于我的猪圈
这一夜无眠
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
他不伤心
我最爱去的唱片店
昨天是她的最后一天
曾经让我陶醉的碎片
全都散落在街边
我最爱去的书店
她也没撑过这个夏天
回忆文字流淌着怀念
已不能怀念
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
他不伤心
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
我不要在失败孤独中死去
我不要一直活在地下里
物质的骗局
匆匆的蚂蚁
没有文化的人不伤心
他不会伤心
他也会伤心
伤心

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

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

相关文章

事故分享——关于Conda激活环境失败并报gbk相关错误

事情是今天打开了pwsh,突然发现conda的环境没了,启动时提示:UnicodeEncodeError: gbk codec cant encode character \xe5 in position 884: illegal multibyte sequence在网上搜索了许多相关的资料,一度怀疑是代理等问题。 进行过的尝试:清理conda缓存,更新conda版本,删…

【闲话】高一上运动会

“加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!心跳节拍弥梦离 “加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!活力四射超神龙女 代表…

信息学奥赛复赛复习10-CSP-J2020-03表达式求值-栈、后缀表达式、isdigit函数、c_str函数、atoi函数、链式前向星、数据结构、深度优先搜索

PDF文档公众号回复关键字:202410031 P7073 [CSP-J2020] 表达式 [题目描述] 小 C 热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为 0 或 1,运算从左往右进行。如果表达式中有括号,则先计算括号内的子…

群晖docker实现稍后阅读wallabag

开篇 本文基于 docker 和 github 开源项目 wallabag 关于群晖安装, 在项目的说明文档里面显示他们在群晖社区里面提供了一个套件, 但我在添加社区以后并没有找到, 所以采用了 docker 方式 拉取镜像Ssh 链接群晖, sudo -i 进入 root 权限 使用命令 docker run -v /opt/wallabag/…

bing chat 该服务在你所在的地区不可用。

一是:在浏览器搜索结果页-更多中,将国家或地区更改为非中国大陆。 二是:在浏览器设置-语言中,将语言更改为非中文简体的语言,这里语言是可以更改回来。 三是:重新注册一个新的Microsoft 账号,推荐谷歌邮箱进行注册。编程是个人爱好

[错误代码]SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES)

这个错误提示 SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES) 表示 MySQL 认证失败,通常是由于用户名或密码不正确导致的。 解决方法检查用户名和密码 确认使用的用户名和密码是否正确。重置密码 如果忘记密码,可以重置密码。检查…

国庆快乐!附ssh实战

小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐!今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几个玩法。 1、Windows直接连接虚拟机启动的Linux。 ssh user@IPV42、从…

当前页面出现致命错误,详细报错请切换至开发模式调试

切换到开发模式:获取详细的错误信息。 检查列定义:确认 Color 列的定义是否合理。 修改列定义:如果需要,增加列的长度。 重新导入数据:确保数据符合新的列定义。希望这些步骤能帮助你解决问题。如果有更多详细的信息,请随时提供。扫码添加技术【解决问题】专注中小企业网…

【软考】2 码制 / 机器数

概念 机器数只能以二进制方式表示,大类分为【无符号数】和【有符号数】 【无符号数】在机器数中没有符号,表示正数 【有符号数】在机器数中有符号,包含正数的其他数值,存在四种操作:【原码】【反码】【补码】【移码】 一、原码 最高位作为符号位进行正数和负数表示 剩余低…

基于selenium的爬取dblp论文的python爬虫

出于阅读文献的需要,导师让我写一个能够爬取dblp上文献资料的爬虫,话不多说,开学。 学习路径总结前端基本知识 request库与bs库 目标特征,规划爬取步骤 动态加载的应对方法-selenium前端基本知识 前端开发是指创建Web页面或应用程序用户可以与之交互的部分。前端开发主要涉…

探索 java 中的各种锁

Java 8+ -序章 一直听说 java 的各种锁、(线程)同步机制,一直没有深入探索。 最近多看了几篇博文,算是理解的比较深入一些了,特写本文做个记录。ben发布于博客园锁是什么? 一种用于 多个线程运行时协调的机制。 作用如下:ben发布于博客园 1、用于多线程之间同步,比如,…

#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs

这个问题表示在MySQL中,表的一行数据大小超过了最大限制65535字节。这通常是因为表中的某些字段过长导致的。下面是一些解决方法:调整字段类型:将一些较大的字段改为TEXT或BLOB类型。这些类型的存储方式不同于普通字段,可以避免占用过多的行内空间。拆分字段:如果某个字段…