『模拟赛』CSP-S模拟2

Rank

非常好数据,使我成为 Rank1(雾

image

数据换源后的

image

狂流——齐秦

北风在吹着清冷的街道
街灯在拉开长长的影子
走过的路 想过的事
仿佛越来越远越来越长
越来越多越难以抛开
多少平淡日子以来的夜晚
你曾是我渴望拥有的企盼
太多分手的记忆
仿佛越来越远越来越长
越来越多越难以抛开
没有人能挽回时间的狂流
没有人能誓言相许永不分离
是我的错
是你错过 喔...
没有人能挽回时间的狂流
没有人能了解聚散之间的定义
太多遗憾 太多伤感
留在心中 像一道狂流
没有人能挽回时间的狂流
没有人能誓言相许永不分离
是我的错
是你错过 喔...
没有人能挽回时间的狂流
没有人能了解聚散之间的定义
太多遗憾 太多伤感
留在心中 像一道狂流
多少平淡日子以来的夜晚
你曾是我渴望拥有的企盼
太多分手的记忆
仿佛越来越远越来越长
越难以抛开
没有人
没有人
没人了解
没人了解
没有人
没有人
没有人
没有人
北风在吹着冰冷的街道


A. 不相邻集合

签。

用 set 维护的,不仅跑得慢讲的时候还被 hack 了。

考虑正解,并查集维护,我们将当前状态下的序列中连续的数合并在一起,设全部集合为 \(T\),大小分别为 \(s_i\),则显然有 \(ans=\sum_{i\in T} \lceil {\frac{s_i}{2}} \rceil\)。从 \(1\)\(n\) 遍历时遇到已经有过的元素直接跳过,否则标记并判断相邻元素是否出现过,是则合并二者。合并操作只要更新 \(fa\) 数组,然后先减去二者的贡献再加上合并后的贡献即可。

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=3e5+5;
const int mod=1e9+7;
const int inf=1e9;
int n,maxn,ans;
int a[N],fx[N<<1],siz[N<<1];
bool yz[N<<1];
namespace Wisadel
{int Wfind(int x){if(x==fx[x]) return x;return fx[x]=Wfind(fx[x]);}short main(){// freopen(".in","r",stdin),freopen(".out","w",stdout);n=qr;fo(i,1,n) a[i]=qr;fo(i,1,500000) fx[i]=i,siz[i]=1;fo(i,1,n){if(!yz[a[i]]){yz[a[i]]=1;ans++;if(yz[a[i]-1]){int _=Wfind(a[i]),__=Wfind(a[i]-1);if(_!=__){fx[_]=__;ans-=(siz[__]+1)/2+(siz[_]+1)/2;siz[__]+=siz[_];ans+=(siz[__]+1)/2;}}if(yz[a[i]+1]){int _=Wfind(a[i]),__=Wfind(a[i]+1);if(_!=__){fx[_]=__;ans-=(siz[__]+1)/2+(siz[_]+1)/2;siz[__]+=siz[_];ans+=(siz[__]+1)/2;}}}printf("%d ",ans);}return Ratio;}
}
int main(){return Wisadel::main();}

B. 线段树

算是签,赛时思路跟正解压根不沾边,只有 20pts。

正解是记搜。一个显然的结论:长度相同的区间的子树标号和是有共性的,即若当前区间的编号为 \(x\),则子树编号和都能写作 \(kx+b\) 的形式。那么就能得出做法:正常区间求和,到目标区间返回该区间对应的 \(kx+b\) 值,若未求过该长度的 \(k\)\(b\) 就记搜搜一下就行。

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=3e5+5;
const int mod=1e9+7;
const int inf=1e9;
ll n,x,y;
unordered_map<ll,ll>k,b;
namespace Wisadel
{#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((l+r)>>1)ll Wqk(ll len){if(k.find(len)!=k.end()) return k[len];int mi=(len+1)>>1;return k[len]=(2*Wqk(mi)+2*Wqk(len-mi)+1)%mod;}ll Wqb(ll len){if(b.find(len)!=b.end()) return b[len];int mi=(len+1)>>1;return b[len]=(Wqb(mi)+Wqb(len-mi)+Wqk(len-mi))%mod;}ll Wq(ll rt,ll l,ll r,ll x,ll y){if(x<=l&&r<=y) return (rt%mod*Wqk(r-l+1)%mod+Wqb(r-l+1))%mod;ll res=0;if(x<=mid) res=Wq(ls,l,mid,x,y);if(y>mid) res=(res+Wq(rs,mid+1,r,x,y))%mod;return res;}short main(){// freopen(".in","r",stdin),freopen(".out","w",stdout);int T=qr;k[1]=1,b[1]=0;while(T--){n=qr,x=qr,y=qr;printf("%lld\n",Wq(1,1,n,x,y));}return Ratio;}
}
int main(){return Wisadel::main();}

C. 魔法师

神秘题,数据更神秘。

由于赛时被 T2 卡了太久,一眼看出这题不太可做,于是打了 \(n^2\) 的 30pts 暴力和 20pts 无删的部分分,然后翻了翻大样例,一看全是 \(0\),也没咋细研究,就把剩下不会的部分全输出 \(0\),然后喜提 25pts,由于数据出锅打的暴力分只有 15pts,结合一下就成为初代数据最高分。

然后改来改去最后也就拿了该有的暴力分,正解仙姑。

D. 园艺

一眼可做,再一眼不可做,再再一眼可做。

根据样例得出一个假结论:最优解在整个过程非边界处最多拐一次。然后 5min 写出了式子,10min 打出代码。过一会发现暴力 \(d_i=1\) 和上面结论对不上,在大样例的信心加持下选择了相信假结论,然后就过了。

\(dis_i\)\(i\) 距起点的距离,\(sum_i\) 为起点到 \(i\) 的路径上的点的距离和。

\(t\) 为枚举的拐点,以 \(t\lt k\) 举例,则答案为:

\[sum_t+sum_n+2dis_t\left(n-k\right)+sum_1-sum_t+2\left(dis_t+dis_n\right)\left(t-1\right) \]

\(t\gt k\) 同理,换一下位置就行。

过了之后尝试证明了一下结论,发现如果存在:

\[2dis_{t_1}\left(n-k\right)>2dis_{t_2}\left(k-t_1\right)+\left(3dis_{t_2}+2dis_{t_1}\right)\left(n-t_2\right)+\left(dis_{t_1}+2dis_{t_2}\right)\left(t_1-1\right) \]

那么会出现拐两次比拐一次优的情况。但是一眼左边一小点右边一大坨,本能告诉我结论是正确的的,然后水水的数据也是这样的,于是过了。

下午 int_R 送来一组 hack 数据:

5 3
100000 10 100 1000000

又研究了一下,发现如果满足:

\[dis_{t_1}\left(2t_2-2k-t_1+1\right)>dis_{t_2}\left(2k+3n-3t_2-2\right) \]

即可卡掉,看着很复杂,其实手造还是很容易卡掉的。

错误的满分代码(真的很短)
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=2e6+5;
const int mod=1e9+7;
const int inf=1e9;
int n,k;
ll d[N];
ll ans9223372036854775807,dis[N],sum[N];
namespace Wisadel
{short main(){// freopen("cut2.in","r",stdin),freopen(".out","w",stdout);n=qr,k=qr;fo(i,1,n-1) d[i]=qr;fu(i,k-1,1) dis[i]=dis[i+1]+d[i],sum[i]=sum[i+1]+dis[i];fo(i,k+1,n) dis[i]=dis[i-1]+d[i-1],sum[i]=sum[i-1]+dis[i];fu(i,k-1,1) ans=min(ans,sum[i]+sum[n]+(n-k)*2*dis[i]+sum[1]-sum[i]+2*(dis[i]+dis[n])*(i-1));fo(i,k+1,n) ans=min(ans,sum[i]+sum[1]+(k-1)*2*dis[i]+sum[n]-sum[i]+2*(dis[i]+dis[1])*(n-i));printf("%lld\n",ans);return Ratio;}
}
int main(){return Wisadel::main();}

Rank 1拿得挺意外的。本来卡 T2 1.5h 觉得自己跟昨天一样又寄寄了,结果神秘数据直接给我错解全放过了,挺牛的。

那么也反映一个问题,数据强的话又能打多少分呢?所以能过的题不抓住还是挺伤的,比如 T2。

T4 说实话开始猜结论时预期就拿个 50pts 左右,过了大样例给我震惊了,一时间以为把正解按出来了,最后倒计时结束时看到两个绿勾还是很高兴的。

就把这次当做一次激励吧,激励我继续冲击 Rank1 的助推剂,也希望能在这最后纯粹的 OI 时光里留下点什么拼搏的回忆。

Upd on 数据换源后:T3 起码该拿的拿到了,虽然是 Rank2,但起码知道了自己没挂分不是吗?

还有 %%% GGrun。


完结撒花~

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

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

相关文章

(更新至 8/25) 不是暑假的暑假的不是游记的游记

持续更新中 Day1 - 8/23 因为在学校里待不下去了,所以订的十一点多的火车,打算八点钟就出门 结果教练在家长群里发我们十二点放假,所以我爸怕我赶不上就帮忙改签到一点半了 你说的对,但是为什么改成卧铺了??? 因此因为xfg的莫名其妙原因,还是决定十点钟出来 那么十点钟…

在 Alt + Tab 列表中隐藏指定窗口

安装并启动 AlexanderPro/SmartContextMenu,然后在指定窗口上Ctrl + rightClick,在出现的菜单中勾选在 Alt + Tab 列表中隐藏即可。这个程序还提供了置顶、调整透明度等功能,挺实用。

4-网络安全体系与网络安全模型

4.1 网络安全体系概述 1)概念 一般而言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。 网络安全体系包括法律法规政策文件、安全策略、组织管理、技术措施、标准规范、安全建设与运营、人员队伍、教…

2024软件工程课程第一次个人作业

这个作业属于哪个课程 福州大学-软件工程2024这个作业要求在哪里 202409软件工程课程第一次个人作业这个作业的目标 初步使用博客园和GitHub,增强在博客园学习的意识和提升软件开发实践技能的意识,让老师和助教了解各个同学的水平学号 0723052261. 个人logo文生图任务个人风格…

【Hashcat工具】工具使用

数字破解 a、7位数字破解 hashcat64.exe -a 3 -m 0 --force 25c3e88f81b4853f2a8faacad4c871b6 ?d?d?d?d?d?d?db、7位小写字母破解 hashcat64.exe -a 3 -m 0 --force 7a47c6db227df60a6d67245d7d8063f3 ?l?l?l?l?l?l?lc、1-8位数字破解 hashcat64.exe -a 3 -m 0 …

洛谷 P4829 kry loves 2048——题解

洛谷P4829题解传送锚点摸鱼环节 kry loves 2048 题目背景 kls是一个人赢。 题目描述 kls最近在玩一款类似2048的游戏,规则是这样的: 一开始,有\(n\)个方块,每个方块上有一个\(1\)到\(m\)的整数。 kls可以进行两种操作:选择两个数字相同的方块(不一定要相邻),将它们合并…

代码整洁之道--读书笔记(4)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

Javaweb-DQL-分页查询

1. select * from stu limit 0,3; 2. select * from stu limit 0,3; 3. select * from stu limit 3,3; 4. select * from stu limit 6,3;

有哪些让你「 爽到爆炸 」的 Windows 软件?

前言 本文源于知乎的一个提问,如标题所示:有哪些让你「 爽到爆炸 」的 Windows 软件?今天大姚给大家分享6款C#/.NET开源且免费的Windows软件,希望可以帮助大家提高学习、开发、办公效率。 Microsoft PowerToys项目简介: Microsoft PowerToys 是使用 C++ 和 C# 编程语言开发…

LeetCode刷题 堆

不会做简单题目的小菜菜!一:堆 1、一种二叉树的结构(完全二叉树) 2、完全二叉树:从上到下;从左到右;填满 3、最大堆:根节点的权值大于孩子节点 4、最小堆:根节点的权值依次小于孩子节点 5、常用操作 #创建堆(最大堆,最小堆) #添加元素 #获取堆顶元素 #删除堆顶元素…

单双链表

AcWing 826. 单链表 模板题: 实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数; 删除第 k 个插入的数后面的一个数; 在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并…

20221413杜佳妍《密码系统设计》第一周

第一周预习报告 学习内容《Windows C/C++加密解密实战》第 1,2 章第一章概念复习第二章主要在 Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上)AI 对学习内容的总结(1分) 要求让AI阅读学习内容并进行总结总结第一章概念复习 1. 基本概念密码学:一门研究信息系…