2024暑假集训测试1

news/2024/11/19 15:40:14/文章来源:https://www.cnblogs.com/Charlieljk/p/18291024

前言

  • 比赛链接。

image

排名历程:\(3→5→3\),因为 \(T1\)special judge 是后来加上的,导致部分人挂了分,赛后安排了重测,就变成了 \(rank5\),赛后发现 \(T1\) 数据过水,重新更新了数据,卡掉了很多人的假做法,又成了 \(rank3\)

T1

已知合法的分组有 \(\begin{cases}0~0~0\\1~1~1\\2~2~2\\0~1~2\\ \end{cases}\)

  • 唐氏做法:

    统计 \(cnt_0,cnt_1,cnt_2\) ,找规律发现除了其中两个 \(\bmod 3=2\) ,剩下一个 \(\bmod 3<2\) 时,将 \(<2\) 的一组中拆出来两个补给其余两个形成 \(0~1~2\) ,这样 \(ans-1+2\),更优。

    其余情况均为将其各自分组,最后余下的形成 \(0~1~2\) 即可。

    由此 \(if~else\) 大模拟即可。

  • 正解:

    考虑枚举 \(0~1~2\) 的组数即可。

T2

  • 部分分 \(30pts\)\(n\le 1e7\) 的情况,暴力即可。

T3

  • 部分分 \(30pts\):爆搜即可。

  • 部分分 \(40pts\):再处理一下 \(k=1\) 的情况即可。

  • 正解 \(100pts\)

    • 结论:

      忽略字典序,将所有 & 放在前面,所有 | 放在后面一定是最优情况。

      • 证明:

        \(\begin{cases}x|y\ge \max(x,y)\\x\&y\le \min(x,y)\\x\&y\le x|y\\\end{cases}\)

        因此有 \(x\&y|z\ge \max(x\&y,z)\ge \min(x|y,z)\ge x|y\&z\)

        解释一下,若 \(x\&y\ge z\)\(\because x|y\ge x\&y\)\(∴ \max(x\&y,z)=x\&y\ge z=\min(x|y,z)\)

        反之若 \(x\&y<z\)\(\because x|y\ge x\&y\)\(∴ \min(x|y,z)\ge z=\max(x\&y,z)\)

        由此继续推广,得上述结论,证毕。

    因此根据上述结论我们可以先求出最大答案,接下来处理字典序的问题。

    从前往后推,若该位填 |,后面的依然按照结论进行,若答案不变,则本位可以填 |,否则填 &

    由此 \(O(n^2)\) 算法已经可以得到 \(60pts\) 了。

    考虑 \(a_i<2^{60}\) ,可以按位计算,当计算到第 \(i\) 位时,对于区间 \([l,r]\),若填 &,只有 \(a_l\sim a_r\) 本位均为 \(1\) 时答案本位才能为 \(1\),否则为 \(0\);若填 |,只要 \(a_l\sim a_r\) 中有一个本位为 \(1\) 答案本位就可以为 \(1\),否则为 \(0\)

    由此算法优化到 \(O(n\log(n))\),可以通过此题。

    点击查看代码
    #include<bits/stdc++.h>
    #define int long long
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=2e5+10,M=61;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar();for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
    void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
    int n,k,a[N],maxx,m,ans,now,b[M],sum[N][M];
    int check(int l,int now,int k)
    {if(l<=n-k){for(int i=0;i<=m;i++) b[i]=sum[n-k][i]-sum[l-1][i];for(int i=0;i<=m;i++) if(b[i]!=n-k-l+1&&(now>>i)&1)now^=(1ll<<i); }if(n-k+1<=n){for(int i=0;i<=m;i++) b[i]=sum[n][i]-sum[n-k][i];for(int i=0;i<=m;i++)if(b[i]!=0) now|=(1ll<<i);}return now;
    }
    signed main()
    {read(n),read(k);for(int i=1;i<=n;i++) read(a[i]),maxx=max(maxx,a[i]);m=log2(maxx);for(int i=1;i<=n;i++){for(int j=0;j<=m;j++) sum[i][j]=sum[i-1][j];for(int j=0;j<=m;j++) if((a[i]>>j)&1) sum[i][j]++;}ans=check(2,a[1],k);write(ans),puts("");now=a[1];for(int i=2;i<=n;i++)if(k>=1&&check(i+1,now|a[i],k-1)==ans)putchar('|'),now|=a[i],k--;else putchar('&'),now&=a[i];
    }
    

T4

  • 赛时部分分都没打出来,直接看正解吧。

  • 正解:

    预处理一个布尔数组 \(ok_{l,r}\),表示区间 \([l,r]\) 能否全部删掉。

    区间 \(DP\) 处理,有:

    \[ok_{l,r}|=(ok_{l,k-1}\&ok_{k+1,r})\&(\gcd(a_{l-1},a_k)|\gcd(a_k,a_{r+1})),k∈[l,r] \]

    初始值: \(\begin{cases}ok_{l,r}=1&l>r\\ok_{i,i}=1&\gcd(a_{i-1},a_i)>1 || \gcd(a_i,a_{i+1})>1\\\end{cases}\)

    此时需要假设 \(a_{l-1},a_{r+1}\) 没有被删掉,貌似假了,但是看到下面的 \(DP\) 式子就知道其是正确的了。

    \(f_i\) 表示若 \(a_i\) 不删,前 \(i\) 个元素中最多能删多少个,有:

    \[f_i=\max_{j=0}^{i-1}\{f_j+ok_{j+1,i-1}\times (i-j-1)\} \]

    答案为 \(f_{n+1}\)

    预处理 \(\gcd\),复杂度为 \(O(n^3)\)

    点击查看代码
    #include<bits/stdc++.h>
    #define int long long
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=510;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar();for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
    void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
    int n,a[N],gcd[N][N],f[N];
    bool ok[N][N];
    int Gcd(int a,int b) {return b==0?a:Gcd(b,a%b);}
    signed main()
    {read(n);for(int i=1;i<=n;i++) read(a[i]);for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)gcd[j][i]=gcd[i][j]=Gcd(a[i],a[j]);for(int i=1;i<=n;i++)for(int j=1;j<i;j++)ok[i][j]=1;for(int i=1;i<=n;i++)if(gcd[i][i+1]>1||gcd[i-1][i]>1) ok[i][i]=1;for(int i=1;i<=n;i++)for(int l=1;l+i-1<=n;l++){int r=l+i-1;for(int k=l;k<=r;k++){ok[l][r]|=(ok[l][k-1]&ok[k+1][r])&(gcd[k][l-1]>1|gcd[k][r+1]>1);if(ok[l][r]==1) break;}}for(int i=1;i<=n+1;i++)for(int j=0;j<=i-1;j++)f[i]=max(f[i],f[j]+(i-j-1)*ok[j+1][i-1]);write(f[n+1]);
    }
    

T5

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

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

相关文章

SpringBoot彩蛋之定制启动画面

写在前面 在日常开发中,我们经常会看到各种各样的启动画面。例如以下几种 ① spring项目启动画面② mybatisplus启动画面③若依项目启动画面还有很多各式各样好看的启动画面,那么怎么定制这些启动画面呢? 一、小试牛刀 ① 新建一个SpringBoot项目②在项目的resources目录下新…

dBFS详解

什么是dBFS? dBFS(decibels relative to full scale)是描述音频信号在数字系统中的幅度的单位。它表示信号电平相对于数字系统的满刻度(Full Scale)的分贝值。dBFS的满刻度通常被认为是数字音频系统中所能处理的最大电平。 dBFS的计算 在数字音频系统中,dBFS的计算公式如…

DL/T645 调试工具,工程师必备

分享一个好用的 DL/T645 调试工具,官网下载地址 目录DL/T645 调试工具,工程师必备主要功能软件截图 DL/T645 调试工具,工程师必备 DL/T645 是中国电力行业的一个通信协议标准,专门用于电力数据采集和传输系统。这个协议由中国电力企业联合会(CEC)发布,主要用于智能电表及…

2024.7.9 鲜花

题图 from 匿名頭ン痛 - feat. 重音テト 我没找到 QaQprufer 序列,简单来说就是 \(n\) 个节点的树双射一个长度 \(n-2\) 值域 \([1,n]\) 的序列。 构造过程就是每次删一个编号最小叶子,记录其父节点。 本图来自baoziwu2,侵删显然堆 \(n\log n\) 可做,也可以扫一遍所有标号,…

读人工智能全传07智能体

读人工智能全传07智能体1. 布鲁克斯革命 1.1. 随着科学认知的发展,有时候旧有科学体系会面临全盘崩溃的危机,新的科学体系诞生,取代传统的、既定的科学体系,这就意味着科学的范式将发生变化 1.2. 澳大利亚机器人学家罗德尼布鲁克斯(Rodney Brooks),是彼时对人工智能范式批…

修改hosts文件不生效原因

hosts文件目录C:\Windows\System32\drivers\etc解决方法 重启浏览器。 其它参考:https://blog.csdn.net/zx1323/article/details/127461529本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18290996

跨境电商业务流程

相较于普通的电商流程,跨境电商业务流程多了与备案、报关等环节相关的内容,一起来看看作者的分享吧。跨境电商业务主要是围绕海关来进行的,除了在项目上的体现上还有很多项目之外的工作,如备案、报关。报关可以由程序完成,也可人工完成。 整体流程:各角色海关备案-> 商…

计一次Win32 api程序显示混乱问题的调试经历

背景:短学期任务,做一个his系统,老师是没有要求gui的,我闲的没事干就打算写一个gui,但是mfc、qt、unity每一个熟悉的,所以就直接用了win32 api手写gui~~(我太难了,我发誓以后再也不手写gui了)~~。然后我就想到了子窗口切换的方式来显示不同的界面(好处在于,每个子界…

05.Map 案例 滑动区间算法

下面是 Go 语言实现寻找最长不含有重复字符的子串的代码:滑动区间算法??package mainimport "fmt"func longestSubstringWithoutRepeating(s string) string {m := make(map[byte]int)start, maxLength, maxStart := 0, 0, 0for end := 0; end < len(s); end++…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

本节课,我们主要讲解了在Python类的继承中子类如何进行初始化、调用父类的属性和方法,同时讲解了模拟串口传感器和主机类的具体实现,并使用xcom串口助手与两个类进行串口通信使用。全网最适合入门的面向对象编程教程:11 类和对象的 Python 实现-子类调用父类方法-模拟串口传…

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短视频等模块。支持electron多开窗口管理、壁纸皮肤、自定义最大…