\(\color{white}{\mathbb{缀以无尽之群星点点,饰以常青之巨木郁郁,可细斟木纹叶脉,独无可极苍穹之览,名之以:密林}}\)


看完题后感觉整套题都没什么思路,而且基本上整场考试确实是这样

倒序开题,发现 \(t3\) 的做法没有优化空间了,\(t2\) 发现了一些规律,但是卡在求拓扑序上,最后乱搞 \(t1\),本来复杂度及其不正确,但是测的在随机数据下还是很可观的

事实上最后分数比预期高多了


A. 毛一琛

考完 cyh 说才发现是曾经随机跳题跳到的USACO的题,但不幸的是当时直接跳了……

如果直接枚举的话有三种状态:分到第一组,分到第二组,不要,这样是 \(3^n\)

对于这种范围刚刚超的,而且还是枚举集合的题,常常可以使用折半搜索

对于前半段共 \(\frac{n}{2}\) 个元素暴搜一下,消耗 \(3^{\frac{n}{2}}\),并且把每种状态记录在其和的 \(vector\) 里面

右边再重复上述操作,设求出的和为 \(sum\),那么在左边寻找 \(-sum\) 的集合,并且更新和起来的答案即可

代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=55,maxm=1e6+1e5+5;
int n,a[maxn],half,tot,ans;
bool vis[maxm];
map<int,int>mp;
vector<pair<int,int> >num[maxm];
void dfs1(int pos,int sum,int S1,int S2){
if(pos==half+1){
if(mp.find(sum)==mp.end())mp[sum]=++tot;
num[mp[sum]].push_back(make_pair(S1,S2));
return ;
}
dfs1(pos+1,sum,S1<<1,S2<<1);
dfs1(pos+1,sum+a[pos],S1<<1|1,S2<<1);
dfs1(pos+1,sum-a[pos],S1<<1,S2<<1|1);
return ;
}
void dfs2(int pos,int sum,int S1,int S2){
if(pos==n+1){
if(mp.find(-sum)==mp.end())return ;
int id=mp[-sum];
for(int i=0;i<num[id].size();i++){
// cout<<"hhh";
vis[S1|S2|((num[id][i].first|num[id][i].second)<<(n-half))]=true;
}
return ;
}
dfs2(pos+1,sum,S1<<1,S2<<1);
dfs2(pos+1,sum+a[pos],S1<<1|1,S2<<1);
dfs2(pos+1,sum-a[pos],S1<<1,S2<<1|1);
return ;
}
int main(){
cin>>n;
half=n/2;
// if(n>=10)half+=3;
for(int i=1;i<=n;i++)cin>>a[i];
dfs1(1,0,0,0);
dfs2(half+1,0,0,0);
for(int i=1;i<=(1<<n)-1;i++)if(vis[i])ans++;
cout<<ans;
return 0;
}

B. 毛二琛

考场上想到可以根据先后顺序建边,相当于求有向图的拓扑序个数

然后想到以前有到叫 \(SAO\) 的题,然而当时咕咕咕了……

正解是用 \(dp\) 来做

设 \(f[i][j]\) 表示第 \(i\) 个数在前 \(i\) 个数形成的图中拓扑序为 \(j\) 的方案数

考虑从 \(f[i-1][k]\) 转移

如果 \(i-1\) 向 \(i\) 连边,相当于如果 \(i\) 的拓扑序为 \(j\),那么 \(k\) 的范围为 \([1,j-1]\)

如果 \(i\) 向 \(i-1\) 连边,\(k\) 的范围为 \([j,i]\) (可以取到 \(j\) 是因为加入 \(i\) 这个数相当于把值域往后平移一位,那么原来的 \(j\) 现在相当于 \(j+1\),是满足条件的)

然后发现 \(k\) 的值域是连续的,可以前缀和优化一下

代码实现
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
const int maxn=5005;
const int mod=1e9+7;
int n,a[maxn],f[2][maxn],g[2][maxn],ans;
bool le[maxn];//rk[i]<rk[i+1]
int main(){
n=read();
for(int i=0;i<n;i++)a[i]=read();
for(int i=0;i<n;i++){
if(a[i]<i){//往左走
for(int j=a[i];j<=i-2;j++)le[j]=true;
}
else{
if(i>0)le[i-1]=true;
le[a[i]-1]=true;
}
}
f[0][1]=g[0][1]=1;
for(int i=1;i<=n-2;i++){
for(int j=1;j<=i+1;j++){
if(le[i-1])f[i&1][j]=(g[(i-1)&1][i]-g[(i-1)&1][j-1]+mod)%mod;
else f[i&1][j]=g[(i-1)&1][j-1];
}
for(int j=1;j<=i+1;j++){
g[i&1][j]=(g[i&1][j-1]+f[i&1][j])%mod;
}
}
for(int i=1;i<=n;i++)ans=(ans+f[(n-2)&1][i])%mod;
cout<<ans;
return 0;
}

B. 毛三琛

玄学题

首先应该乖乖地按照题目上说的确定 \(x\)(考场上因为加了个小优化所以不得不先二分再定 \(x\))

当 \(x\) 随机打乱后,最优解的更新序列长度期望是 \(logP\) 的

那么只需要每次开始二分前,\(O(n)\) 判断一下当前 \(x\) 是否比当前答案优即可

代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,p,k,a[maxn],ans,b[maxn],x;
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
bool check(int limit,int x){
int cnt=1,sum=0;
for(int i=1;i<=n;i++){
int val=(a[i]+x)%p;
if(val>limit) return false;
if(sum+val<=limit)sum+=val;
else sum=val,cnt++;
if(cnt>k)break;
}
if(cnt<=k)return true;
return false;
}
int main(){
srand(time(0));
n=read();
p=read();
k=read();
for(int i=1;i<=n;i++)a[i]=read(),ans+=a[i];
for(int i=0;i<p;i++)b[i]=i;
random_shuffle(b,b+p);
for(int i=0;i<p;i++){
x=b[i];
if(check(ans,x)){
int l=0,r=ans+1;
while(l<r){
int mid=l+r>>1;
if(check(mid,x))r=mid;
else l=mid+1;
}
ans=l;
}
}
cout<<ans;
return 0;
}

\(\color{white}{\mathbb{溯洄从之,道阻且长}}\)

noip模拟30的更多相关文章

  1. noip模拟30[毛毛毛探探探]

    \(noip模拟30\;solutions\) 所以说,这次被初中的大神给爆了????? 其实真的不甘心,这次考场上的遗憾太多,浪费的时间过多,心情非常不好 用这篇题解来结束这场让人伤心的考试吧 \( ...

  2. Noip模拟30 2021.8.4

    T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...

  3. 2021.8.4考试总结[NOIP模拟30]

    T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...

  4. NOIP模拟 30

    补坑,很多都忘了. T1 树 像我这种人都能考场A掉当然是道水题辣 求出每条有向边的期望就好了 T2 回文串 当时毫无思路,暴力写挂. 首先把B转过来,那么都变成后缀的前缀拼起来 对于每一个LCP,他 ...

  5. NOIP 模拟 $30\; \rm 毛三琛$

    题解 \(by\;zj\varphi\) 二分答案,考虑二分背包中的最大值是多少. 枚举 \(p\) 的值,在当前最优答案不优时,直接跳掉. 随机化一下 \(p\),这样复杂度会有保证. Code # ...

  6. NOIP 模拟 $30\; \rm 毛二琛$

    题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...

  7. NOIP 模拟 $30\; \rm 毛一琛$

    题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. noip模拟33

    \(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...

随机推荐

  1. OpenFaaS实战之五:大话watchdog

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. 分布式ID(CosId)之号段链模式性能(1.2亿/s)解析

    分布式ID(CosId)之号段链模式性能(1.2亿/s)解析 上一篇文章<分布式ID生成器(CosId)设计与实现>我们已经简单讨论过CosId的设计与实现全貌. 但是有很多同学有一些疑问 ...

  3. 栅栏密码(The Rail-Fence Cipher)详解

    最近训练CTF的时候,发现密码学这块的知识不太系统,所以自己接下来会陆陆续续整理出来 今天学习了栅栏密码,BugkuCTF里面的一道叫做"聪明的小羊"的题就与栅栏密码相关 特点 栅 ...

  4. WinUI 3学习笔记(2)—— 用ListView来展示集合

    在WPF的时代,我们多是使用ListBox和ListView来展示,纵向滚动条显示的集合数据.这两个控件的默认样式,以及对触控的支持,已完全落后于时代.他们两个分别长这样,和Win10及Win11的风 ...

  5. badboy如何录制jmetet脚本

    网盘下载: https://pan.baidu.com/s/1mTOEeE47tmk29_wndID3iw 傻瓜式安装即可, 内附教程 1. 打开Badboy, 新建一个文件 2.  输入要录制的网址 ...

  6. 我们是Android开发,我们都有着光明的未来

    作为一名程序员经常会逛v2ex论坛,前几天逛着玩的时候忽然发现一篇文章,标题非常吸引眼球名字叫中年危机的终极解法,作为一个步入而立之年的老人,心里非常激动,到底是啥解决法呢,于是迅速点进去查看. 进去 ...

  7. Cloud-init的安装和使用 --以ubuntu-server-14.04-amd64为例

    by hyc 1.Cloud-init安装 已有了一个安装好系统的镜像. 镜像名:ubuntu-test-14.04-server-amd64.img 用户名:user 密码:1 主机名:ubuntu ...

  8. 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)

    算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...

  9. Linux 学习Shell一部分指令

    接下来就是shell命令的一些演示了 set (超级多的变量和系统默认值) echo $?查看上一条指令是否执行成功 返回0意味着成功,返回1意味着失败 echo 是个 env 设置变量 解释一下上面 ...

  10. 常见的六种容错机制:Fail-Over、Fail-Fast、Fail-Back、Fail-Safe,Forking 和 Broadcast

    目录 1.Fail-Over:故障转移 2.Fail-Fast:快速失败 3.Fail-Back:失效自动恢复 4.Fail-Safe:失效安全 5.Forking:并行调用多个服务 6.Broadc ...