P5979 [PA2014] Druzyny 题解

news/2024/9/19 23:42:42/文章来源:https://www.cnblogs.com/zifanoi/p/18421588

对于一个固定的右端点 \(r\),左端点 \(l\) 合法当且仅当 \(\max(d_l,d_{l+1},\dots d_r)\le r-l+1 \le\min(c_l,c_{l+1},\dots,c_r)\)

容易得到一个很朴素的 dp:记 \(f_i\) 表示前 \(i\) 个位置可以分成的组的数目的最大值,\(g_i\) 表示有多少种分组方案能达到最大值,直接枚举左端点转移,时间复杂度 \(\mathcal O(n^2)\)。转移点不是连续的,不好直接优化。

考虑对这个 dp 进行一个分治,对于每个分治的区间 \([l,r]\) 处理 \(f_{[l,\text{mid}]},g_{[l,\text{mid}]}\)\(f_{[\text{mid}+1,r]},g_{[\text{mid}+1,r]}\) 的贡献。发现 \(c\) 对每个右端点的限制是只能取某个后缀的左端点,可以直接二分出这个后缀,接下来只要考虑 \(d\) 的限制。

很容易想到倒着枚举 \([l,\text{mid}]\) 中的每个位置,维护 \(d\) 的最大值,可以得到一个右端点的位置 \(\ge \max(d_{[l,\text{mid}]})+l-1\) 的限制。考虑对 \([\text{mid}+1,r]\) 每个位置建一个桶,在这个限制的对应位置处插入这个左端点。接下来正着枚举 \([\text{mid}+1,r]\) 中的每个位置,把桶内的位置插入线段树。对于每个右端点也可以得到一个类似的限制,在线段树上查询即可,最后更新一下就做完了。

时间复杂度 \(\mathcal O(n\log^2n)\),参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 1000003
#define md 1000000007
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
struct node{ll a,c;
}f[mxn],t[mxn<<2];
int n,lg[mxn],ps[mxn],a[mxn],b[20][mxn];
vector<int>s[mxn];
const int INF=1e9;
node operator+(node x,node y){return {max(x.a,y.a),((x.a>=y.a?x.c:0)+(y.a>=x.a?y.c:0))%md};
}
int ask2(int l,int r){int k=lg[r-l+1];return min(b[k][l],b[k][r-(1<<k)+1]);
}
void change(int p,int x,node y,int l,int r){if(l==r){t[p]=y;return;}int mid=(l+r)>>1;if(x<=mid)change(p<<1,x,y,l,mid);else change(p<<1|1,x,y,mid+1,r);t[p]=t[p<<1]+t[p<<1|1];
}
node ask(int p,int l,int r,int L,int R){if(l<=L&&R<=r)return t[p];int mid=(L+R)>>1;if(l<=mid&&r>mid)return ask(p<<1,l,r,L,mid)+ask(p<<1|1,l,r,mid+1,R);if(l<=mid)return ask(p<<1,l,r,L,mid);return ask(p<<1|1,l,r,mid+1,R);
}
void build(int p,int l,int r){t[p]={-INF,0};if(l==r)return;int mid=(l+r)>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);
}
void solve(int l,int r){if(l==r)return;int mid=(l+r)>>1;solve(l,mid);rep(i,mid+1,r)s[i].clear();int mx=0;drep(i,mid,l){if(mx+i<=r)s[max(mx+i,mid+1)].pb(i);mx=max(mx,a[i]);}mx=0;rep(i,mid+1,r){mx=max(mx,a[i]);for(int j:s[i])change(1,j,{f[j].a+1,f[j].c},0,n);int L=max(ps[i]-1,l),R=min(i-mx,mid);if(L<=R)f[i]=f[i]+ask(1,L,R,0,n);}rep(i,l,mid)change(1,i,{-INF,0},0,n);solve(mid+1,r);
}
signed main(){scanf("%d",&n);rep(i,2,n)lg[i]=lg[i>>1]+1;rep(i,1,n)scanf("%d%d",&a[i],&b[0][i]);rept(k,1,20){rep(i,1,n-(1<<k)+1){b[k][i]=min(b[k-1][i],b[k-1][i+(1<<(k-1))]);}}rep(i,1,n){int l=1,r=i;while(l<r){int mid=(l+r)>>1;if(ask2(mid,i)>=i-mid+1)r=mid;else l=mid+1;}ps[i]=l;}f[0].c=1;rep(i,1,n)f[i].a=-INF;build(1,0,n);solve(0,n);if(f[n].a<=0)puts("NIE");else cout<<f[n].a<<" "<<f[n].c;return 0;
}

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

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

相关文章

关于零值和nil

1. 零值 零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。 对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。 对于引用类型: 均为 n…

利用AutoGpt将任何模型支持o1模型的推理实现

利用AutoGpt将任何模型支持o1模型的推理实现 相信大家都对于OpenAI最新出的o1模型都非常关注,它已经能通过推理让回复的效果更加理想, 但是目前o1的限制太大,而且使用o1至少也是需要购买OpenAI官方的会员价格也在20美刀(好贵!!),于是乎社区出现非常多相似的实现,通过更…

C语言类型与强制类型转换

目录类型关键字sizeof如何理解强制类型转化不同类型的0null字符设备(补充) char有有符号和无符号两种类型,字符是无符号类型.(补充) getchar的返回值为什么是int键盘输入的内容,以及往显示器中打印的内容,都是字符 --> 键盘/显示器称为字符设备 类型C语言为何有类型? 让我们…

如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute

ActionFilterAttribute 是一种作用于控制器 Action 方法的特性(Attribute),通过它,你可以在操作执行前后、异常处理时等不同的阶段插入自定义逻辑。 比如在执行操作方法之前修改请求参数、记录日志、进行权限验证等操作,在执行操作方法之后发送邮件、同步数据等等。 本文主…

访问Github卡顿甚至进不去的解决办法(适用于Windows)

本文使用Watt Tookit(原Steam++)解决了Github在国内访问速度卡顿甚至无反应的问题,通过NDM和镜像网站实现Github大文件高速下载。本文首发自个人博客:点我查看 一、前言 Github 是全球知名的开源宝库,但是对国内用户并不友好。当我们在浏览器中输入www.github.com时,如果…

看看mysql干的恶心事

如图: 本文来自博客园,作者:河北大学-徐小波,转载请注明原文链接:https://www.cnblogs.com/xuxiaobo/p/18421514

LoRaWAN网关价格干穿地板了

曾经LoRaWAN网关要上万块钱一台,后来卷到千把块钱,现在可以卷到500以内,还支持4G/ETH/WIFI,应该也是没谁了。 先上图片1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9~28V,工业级稳定性 ◆ 群脉冲:电源2kV,通讯线4kV ◆ 湿度范围…

认知神经科学分析指标——图论指标之全局集群系数

图论指标在认知神经科学或脑科学的研究中,通常作为研究脑网络表现的描述性指标之一,而图论指标从全局性来分可以分为:节点指标和全局指标,而根据描述脑网络整合性表现又可分为:整合指标和分离指标。 该随笔主要涉及图论指标中全局指标及整合指标的全局集群系数,英文全称为…

day4[大模型全链路开源开放体系学习小结]

书生浦语大模型全链路开源开放体系涵盖数据收集、标注、训练、微调、评测、部署等全链路,学习了解其技术发展、性能提升、模型架构、开源生态等。 书生浦语大模型(英文名IN Turn LLM)多次开源,性能不断提升,达到国际先进水平,在推理能力、上下文记忆、自主规划等方面表现…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元…

成都仪器定制-二进制补码及与原码的互相转换方法

大沙把一些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。 先说原码,原码‌是一种计算机中对数字的二进制定点表示方法。在原码表示法中,数值前面增加了一位符号位,最高位为符号位,0表示正数,1表示负数。其余位表示数值的大小。二进制补码‌是一种用于表示有符…

函数进阶应用3

认识OFFSET函数函数格式 参数说明 作用OFFSET(参数1,参数2,参数3,参数4,参数5) 参数1:以谁为标准参数2:下一多少行参数3:右移多少列参数4:取几行参数5:取几列 动态获取数据应用:使用offset函数获取表格最后五行数据,并计算平均值 在空白单元格输入“=offset()”,然…