[CSP-S模拟测试]:序列(二分答案+树状数组)
2024-09-02 11:51:17
题目传送门(内部题98)
输入格式
第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$。
输出格式
一行一个整数表示$\max(r-l+1)$。保证至少有一个区间满足条件。
样例
样例输入:
5
2 -4 1 2 -2
-2 3 1 -3 1
样例输出:
1
数据范围与提示
对于$20\%$的数据,$n\leqslant 5,000$。
对于$60\%$的数据,$n\leqslant 10^5$。
对于$100\%$的数据,$1\leqslant n\leqslant 5\times 10^5,|ai|,|bi|\leqslant 10^9$。
数据有一定梯度。
题解
又没有打正解。
先来看一个性质,设$s$为一个序列的前缀和,那么如果$i<j$且$s[j]\geqslant s[i]$,那么这一段的加和大于$0$。
于是我们可以二分枚举长度,然后用$b$的前缀和数组为下标构建树状数组维护$a$的前缀和数组的最小值即可。
时间复杂度:$\Theta(n\log^2 n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
unordered_map<long long,int>mp;
int n;
int a[500001],b[500001],tr[1000001],cnt;
long long sa[500001],sb[500001],sta[1000001];
int ans;
int lowbit(int x){return x&-x;}
void add(int x,int w){for(int i=x;i<=sta[0];i+=lowbit(i))tr[i]=min(tr[i],w);}
int ask(int x){int res=0x3f3f3f3f;for(int i=x;i;i-=lowbit(i))res=min(res,tr[i]);return res;}
bool judge(int x)
{
memset(tr,0x3f,sizeof(tr));
for(int i=x;i<=n;i++)
{
add(sb[i-x],sa[i-x]);
if(ask(sb[i])<=sa[i])return 1;
}
return 0;
}
int main()
{
scanf("%d",&n);sta[++sta[0]]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sa[i]=sa[i-1]+a[i];
sta[++sta[0]]=sa[i];
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sb[i]=sb[i-1]+b[i];
sta[++sta[0]]=sb[i];
}
sort(sta+1,sta+sta[0]+1);
for(int i=1;i<=sta[0];i++)if(sta[i]!=sta[i-1])mp[sta[i]]=++cnt;
for(int i=0;i<=n;i++){sa[i]=mp[sa[i]];sb[i]=mp[sb[i]];}
int lft=1,rht=n,res=1;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(judge(mid)){res=mid;lft=mid+1;}
else rht=mid-1;
}
printf("%d",res);
return 0;
}
rp++
最新文章
- 在发送ajax请求时加时间戳或者随机数去除js缓存
- Mockito Hello World
- 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、
- Windows Phone 8 下载文件进度
- java执行顺序
- Spring AOP报错处理 Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
- dns服务
- 利用二维矩阵求spanning tree
- virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法
- MyEclipse高效开发之必备快捷键技能
- html meta标签用法详细介绍
- php in_array比较原理和类型比较问题
- Codeforces 478D Red-Green Towers
- HDU 2671 Can&#39;t be easier
- Loj #3096. 「SNOI2019」数论
- 初学Java的那段日子
- windows上安装gcc/g++环境(MinGW,msys64等)
- Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week2, Assignment(Optimization Methods)
- android studio 自定义控件
- 基于androidstudio3.0的build文件配置问题