传送门 :
3992. 树上有猴
t
a
g
:
tag :
tag: 合法问题
有效区间
数学分析
题意 : 给定一个
a
[
]
a[]
a[],对于
a
[
i
]
a[i]
a[i]表示使得当前的
c
n
t
+
a
[
i
]
cnt+a[i]
cnt+a[i],询问有多少个合法的
c
n
t
cnt
cnt 其中各个期间的
c
n
t
cnt
cnt需要满足
m
≥
c
n
t
≥
0
m \ge cnt \ge 0
m≥cnt≥0
思路 : 首先因为每个状态都是独立的,因此我们可用对 a [ i ] a[i] a[i]求前缀和 s [ i ] s[i] s[i],表示当前这个时间段和初始相差的数量
则我们可用设一开始的数量为 x x x
0 ≤ x ≤ w 0 ≤ x + s 1 ≤ w 0 ≤ x + s 2 ≤ w . . . . . \begin{aligned} & 0 \le x \le w\\ & 0 \le x+s_1 \le w\\ & 0 \le x+s_2 \le w\\ &..... \end{aligned} 0≤x≤w0≤x+s1≤w0≤x+s2≤w.....
化简式子我们我们可用得
0 ≤ x ≤ w − s 1 ≤ x ≤ w − s 2 ≤ x + ≤ w . . . . . \begin{aligned} & 0 \le x \le w\\ & -s_1 \le x \le w\\ & -s_2 \le x+ \le w\\ &..... \end{aligned} 0≤x≤w−s1≤x≤w−s2≤x+≤w.....
因此我们只需要找到所有区间的交集即可,即使得左边最大右边最小
Code :
int a[N],sum[N];
int n,m;
void solve(){
cin>>n>>m;
for(int i=1;i>a[i],sum[i] = sum[i-1] + a[i];
int maxn = m ;
int minn = 0;
for(int i=1;in>>m;
int minn = INF , maxn = 0 ;
for(int i=1;i>x;sum[x]++;
//对区间按高度进行分类
minn = min(minn,x);
maxn = max(maxn,x);
}
for(int i=1;i minn;){
int j = i , total = 0 ;
/**
下面即为关键
**/
while(j > minn && total + sum[maxn] - sum[j-1]
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?