NOIP2024 前集训:多校A层冲刺NOIP2024模拟赛24

news/2024/11/20 8:48:45/文章来源:https://www.cnblogs.com/Charlieljk/p/18556007

前言

music
《春雪》白是无尽的迷途白是归零的法术洗净 染渍 反复练就成我温暖天赋 也不免再惹一身寒毒冰是雪送的礼物却不敌春来时的温度融化 难以 碰触沿着心底返流灌注 到面孔化作几滴泪珠我想在冬夜雪地与你追逐你却落在早春中的一棵树一次错过不算错误错在来不及看清楚你的面目我就交出全部雪花开在冬夜深处蔓延蔓延到一个危险的春天春天蚕食消融目空一切一切啊那曾是我的世界雪花开在冬夜深处蔓延蔓延到一个危险的春天我在原地守护我的体面春天再见 春天再见我还在冬夜雪地里等日出你落满早春枝叶宣判我输趁这错过还没结束再请你跳一支舞画下曼妙脚步作为庆祝趁这错过还没结束再送你一句祝福落下枝叶时有人来接住

洛谷勾线出来了,我是压线大师,因为 T2 挂了所以是 \(160\) 分,\(6\) 级勾线是 \(165\),如果 \(T2\) 没挂就是 \(220\) 分,\(7\) 级勾线是 \(225\),去死吧 ̄へ ̄。

这是昨天的模拟赛,今天终于没有模拟赛了,O(∩_∩)O~~,赶紧补一补题,前天的还没改完(⊙o⊙)…

晚上一机房的人在那儿看国足赛况,field 进来 D 忘了谁在那儿大叫,然后说国足是 \(1:2\) 了吗你这么兴奋,然后我的电脑闪了一下,真成 \(1:2\) 了!?!见证国足 \(5\) 年来第一次进日本球。

T1 和 T3 是赛时切的,然后一下午加一晚上才把 T2 题解看懂,无语了,计数题是赛时推不出来但赛后能看懂题解,博弈论是连题解都看不懂,问题转化到最后感觉和题面都没啥关系。

赛时看到 T1 有模数直接不想看了(以为是计数),先去看 T3,发现是数据结构唉,有点思路但不多,再回去看 T1 发现 kmp 写脸上了,于是做掉 T1 回去看 T3;发现那个思路一点问题没有,于是打了 T3,T3 打到一半发现 T1 好像复杂度打错了成 \(O(n^2)\) 了(这样还有 \(95\)),但是错的不多,改一小下就成 \(O(n)\) 了;想打一打 T4 的 \(30\) 分,发现不会,就写了个 \(10\) 分;写 T2?我去博弈论真是我赛时能做的?爆搜一分没有?肯定是要观察一些性质的吧,去他丫的结论题,于是继续写 T4,最后 T2 写了个 puts("0") 上去了有 \(10\) 分。

T3 赛时犯唐求前缀第一个大于 \(a_i\) 的数用的 ST 表加二分,OJ 能过但是 accoders 上直接被卡常了,huge 把时限改成了 \(1.5s\) 就过了,赛后发现直接单调栈就行了,改了之后是最优解。

T1 选取字符串

border 这种东西直接把 kmp 写脸上了,求出来 \(next\) 数组,考虑可以建树,\(fa_i=next_i\),之后就可以树上,对于每个节点统计他的子树,但是发现满足 \(fa_i<i\),所以完全不用把树建出来,直接倒着递推一遍即可,因为是递推所以是最优解。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=1e6+10,P=998244353;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char c=getchar_unlocked();for(;!isdigit(c);c=getchar_unlocked()) if(c=='-') z=0;for(;isdigit(c);c=getchar_unlocked()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,ans,jc[N],inv[N],nxt[N],sum[N],cnt[N]; char s[N];
inline int mod(int x,int y) {return (x+=y)>=P?x-P:x;}
inline int qpow(ll a,int b)
{ll res=1; for(;b;(a*=a)%=P,b>>=1) (b&1)&&((res*=a)%=P); return res;}
inline ll C(int n,int m) {return n<m?0:1ll*jc[n]*inv[n-m]%P*inv[m]%P;}
signed main()
{freopen("string.in","r",stdin),freopen("string.out","w",stdout);read(m),scanf("%s",s+1),n=strlen(s+1),jc[0]=jc[1]=1;for(int i=2,j=0;i<=n;i++){while(j&&s[j+1]!=s[i]) j=nxt[j];nxt[i]=(j+=(s[j+1]==s[i])),jc[i]=1ll*jc[i-1]*i%P;}for(int i=1;i<=n;i++) cnt[i]=cnt[nxt[i]]+1;for(int i=0;i<=n;i++) cnt[i]<<=1,cnt[i]++;inv[n+1]=qpow(jc[n+1]=1ll*jc[n]*(n+1)%P,P-2),fill(sum,sum+1+n,1);for(int i=n;~i;i--) inv[i]=1ll*inv[i+1]*(i+1)%P;for(int i=n;~i;i--) ans=mod(ans,C(sum[i],m)*cnt[i]%P),sum[nxt[i]]+=sum[i];write(ans);
}

T2 取石子

发现若 \(\sum\limits_{i=1}^{n}a_i\) 为奇数,则 Alice 直接拿 \(1\) 就赢了,考虑如果是偶数怎么办。

发现两人此时一定只拿偶数,不然把奇数给对面对面就赢了,所以问题可以转换为 \(K\to \lfloor\dfrac{K}{2}\rfloor,a_i\to \lfloor\dfrac{a_i}{2}\rfloor\) 的形式,就这样不停地转化直到 \(\sum\limits_{i=1}^{n}a_i\) 为奇数时 Alice 就赢了。

所以若存在一个 \(t\le \log_2K\) 满足 \(\sum\limits_{i=1}^{n}\lfloor\dfrac{a_i}{2^t}\rfloor\) 为奇数时 Alice 必胜,可以转化为 \(\text{lowbit}(\oplus_{i=1}^{n}a_i)\le K\),这里钦定 \(\text{lowbit}(0)=\infty\)

接下来考虑 Alice 第一步怎么拿,设 \(sum=\oplus_{i=1}^{n}a_i\)Alice 第一步拿的是 \((i,x)\),那么一定是要让 \(\text{lowbit}(sum\oplus a_i\oplus (a_i-x))>x\),所以一定是拿 \(sum\) 在二进制中是 \(1\) 的位置,且若高位拿了低位一定要跟着拿,所以直接枚举 \(i\) 和二进制位即可,复杂度 \(O(n\log v)\)

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define lowbit(x) (x&-x)
using namespace std;
const int N=5e4+10;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,sum,a[N];
inline bool check(int x,int y) {return x&&lowbit(x)<=y;}
signed main()
{freopen("nim.in","r",stdin),freopen("nim.out","w",stdout);read(n,m); for(int i=1;i<=n;i++) read(a[i]),sum^=a[i];if(!check(sum,m)) return puts("0"),0; puts("1");for(int i=1,p,vl;i<=n;i++){p=0,vl=sum; for(int j=0;j<=30;j++) if((vl>>j)&1){vl^=(a[i]-p),p|=1<<j; if(p>m||p>a[i]) break;vl^=(a[i]-p); if(!check(vl,p)) write(i,p),puts("");}}
}

T3 均衡区间

发现一个区间 \([l,r]\) 合法的充要条件是 \(\exists i,j,k,h\in (l,r),a_i>a_l\wedge a_j<a_l\wedge a_k>a_r\wedge a_h<a_r\)

那么对于一个 \(r\),找到它前面第一个 \(i\) 满足 \(a_i>a_r\) 和第一个 \(j\) 满足 \(a_j<a_r\),那么对于一个 \(l\) 能和 \(r\) 配对的必要条件是 \(l<\min(i,j)\)

同理对于一个 \(l\),找到它后面第一个 \(i\) 满足 \(a_i>a_l\) 和第一个 \(j\) 满足 \(a_j<a_l\),那么对于一个 \(r\) 能和 \(l\) 配对的必要条件是 \(r>\max(i,j)\)

那么对于区间 \([l,r]\) 合法的充要条件就是 \(l<\min(i_r,j_r)\wedge r>\max(i_l,j_l)\),发现原问题转换为了一个二位数点问题。

单调栈求出对应条件,排完序后直接扫描线即可,复杂度 \(O(n\log n)\)

  • 数据范围是 \(10^6\) 且只开了 \(1s\) 应该想到什么:排除树状数组以外的所有数据结构。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define lowbit(x) (x&-x)
using namespace std;
const int N=1e6+10;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,_,a[N],ansl[N],ansr[N],sta1[N],sta2[N]; struct aa {int x,id;}pre[N],suf[N];
inline void add1(int x) {for(;x;x-=lowbit(x)) a[x]++;}
inline int ask1(int x) {int res=0; for(;x<=n;x+=lowbit(x)) res+=a[x]; return res;}
inline void add2(int x) {for(;x<=n;x+=lowbit(x)) a[x]++;}
inline int ask2(int x) {int res=0; for(;x;x-=lowbit(x)) res+=a[x]; return res;}
signed main()
{freopen("interval.in","r",stdin),freopen("interval.out","w",stdout);read(n,_); for(int i=1;i<=n;i++) read(a[i]);sta1[0]=sta2[0]=1; for(int i=1,top1=0,top2=0;i<=n;i++){while(top1&&a[i]>=a[sta1[top1]]) top1--;while(top2&&a[i]<=a[sta2[top2]]) top2--;pre[i]={min(sta1[top1],sta2[top2]),sta1[++top1]=sta2[++top2]=i};}sta1[0]=sta2[0]=n; for(int i=n,top1=0,top2=0;i;i--){while(top1&&a[i]>=a[sta1[top1]]) top1--;while(top2&&a[i]<=a[sta2[top2]]) top2--;suf[i]={max(sta1[top1],sta2[top2]),sta1[++top1]=sta2[++top2]=i};}memset(a,0,4*(n+1)),sort(suf+1,suf+1+n,[](aa a,aa b){return a.x>b.x;});sort(pre+1,pre+1+n,[](aa a,aa b){return a.id>b.id;});for(int i=1,j=1;i<=n;ansl[suf[i].id]=ask1(suf[i].id),i++)while(j<=n&&pre[j].id>suf[i].x) add1(pre[j++].x-1);memset(a,0,4*(n+1)),sort(pre+1,pre+1+n,[](aa a,aa b){return a.x<b.x;});sort(suf+1,suf+1+n,[](aa a,aa b){return a.id<b.id;});for(int i=1,j=1;i<=n;ansr[pre[i].id]=ask2(pre[i].id),i++)while(j<=n&&suf[j].id<pre[i].x) add2(suf[j++].x+1);for(int i=1;i<=n;i++) write(ansl[i]),putchar_unlocked(' '); puts("");for(int i=1;i<=n;i++) write(ansr[i]),putchar_unlocked(' '); puts("");
}

T4 禁止套娃

我甚至都没有改到这道题,好像几乎也没人改,那就不改了,感觉可以写一下 \(30\) 的部分分。

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

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

相关文章

画图-利用画图工具修改聊天记录时间

1、用Windows自带的画图工具 打开要修改的图片 选择“矩形”用矩形选中要修改的时间即可对其进行 移动 或者覆盖的操作

Redis中常见的数据类型及其应用场景

五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String、List等类型进行存储。各数据类型介绍:Redis数据类型对应的底层数据结构String 类型的应用场景 常用命令存放键值:set key value [EX seconds] …

dotnet 9 WPF 项目禁用 IncludePackageReferencesDuringMarkupCompilation 导致源代码包 XAML 构建失败

本文记录在 dotnet 6 时通过禁用 IncludePackageReferencesDuringMarkupCompilation 解决源代码冲突问题时,在 dotnet 9 将因此导致 XAML 构建生成的 g.cs 文件包含的 XAML 只记录相对文件路径,从而导致构建不通过在 WPF 修复 dotnet 6 与源代码包冲突 这篇博客里面和大家介绍…

WPF 被 灵格斯翻译官 取词带崩

本文记录 灵格斯翻译官 翻译软件带崩 WPF 程序问题灵格斯翻译官 : http://www.lingoes.cn/ 只要有 WPF 的 ToolTip 或者其他小窗口,执行鼠标拖动过程中,就可能被带崩 我这次没有捞 dump 文件,就只记录此问题 退出 灵格斯翻译官 进程则没有此问题 我从事件管理器也看到 WPS …

读数据质量管理:数据可靠性与数据质量问题解决之道09数据可靠性

数据可靠性1. 数据可靠性 1.1. 数据可靠性指的是一个组织在整个数据生命周期中提供高数据可用性和健康状况的能力1.1.1. 是高数据质量带来的结果1.1.1.1. 高质量的大数据是这个大规模转型平台的核心1.1.2. 随着公司接收到比以往更…

sql-labs靶场通关

Basic challeges基础 sql 注入,没有任何的过滤,转义,WAFless-1 -- (单引号)这里虽然是数值型注入,但是,php 中为 id 参数套了个单引号,所以这里按字符型注入方式通过,可以看到,这里输出的还是 id=1 的值,以此判断为数值型,发生了 int 隐式转换payload: 0 union selec…

年底了,你的项目该复盘了

了解复盘? 什么是复盘? 复盘,围棋术语,也称“复局”,指对局完毕后,复演该盘棋的记录,以检查对局中招法的优劣和得失关键。复盘就是每次博弈结束以后,双方棋手把刚才的对局再重复一遍,这样可以有效地加深对这盘对弈的印象,也可以找出双方攻守的漏洞,是提高自己水平的…

强化学习--策略迭代如何解决01背包问题?内附代码

背景 看Sutton的Reinforcement learning: An introduction,里面将策略迭代作为一种基于动态规划的方法。 书中举了个grid world的例子,非常符合书中的数学原理,有状态转移概率,每个时间步就是每个state等..... 动态规划作为一个常见的面试八股,经常出现于笔试题中,一般都…

Redis 学习笔记(一)-Redis 安装

一、Redis简介 (1)什么是Redis ​ Redis 是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。在企业开发中, 主要用于做数据库、缓…

交互式备忘单: 汇集了各种有用的安全工具

这份工具包是一个交互式备忘单,汇集了各种有用的安全工具,主要用于渗透测试或红队练习。这些工具来自于Github仓库和其他公开来源。以下是工具列表及其分类: AD:用于Active Directory安全的工具。 BinaryExp:用于二进制漏洞利用/入侵的工具。 Blue:用于蓝队操作和防御的工…

29. 使用MySQL之数据库维护

1. 备份数据 像所有数据一样,MySQL的数据也必须经常备份。由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据。但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效。 下面列出这个问题的可能解决方案。使用命令行实用程序…

QT实现组合键监测

QT实现快捷键监测,完成某些组合键功能参考于:Qt 获取组合键 键盘按住某键 鼠标组合实现 - Andy5020 - 博客园MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QWidget::installEventFilter(this); }bool MainW…