[CSP-S模拟测试]:序列(二分答案+树状数组)
题目传送门(内部题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++
[CSP-S模拟测试]:序列(二分答案+树状数组)的更多相关文章
- 【序列莫队+二分答案+树状数组】POJ2104-K-th Number
[题目大意] 给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数. [思路] 先离散化然后莫队分块.用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可. 又一次实力 ...
- 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
- AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...
- cf1073D Berland Fair (二分答案+树状数组)
用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...
- 4418: [Shoi2013]扇形面积并|二分答案|树状数组
为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...
- [CSP-S模拟测试]:Equation(数学+树状数组)
题目描述 有一棵$n$个点的以$1$为根的树,以及$n$个整数变量$x_i$.树上$i$的父亲是$f_i$,每条边$(i,f_i)$有一个权值$w_i$,表示一个方程$x_i+x_{f_i}=w_i$ ...
- [CSP-S模拟测试]:异或(树状数组+LCA)
题目传送门(内部题21) 输入格式 第一行一个字符串$str$,表示数据类型.第二行一个正整数$k$,表示集合$K$的大小,保证$k>1$.接下来$k$行每行$k$个数,第$i$行第$j$个数表 ...
- [CSP-S模拟测试]:d(贪心+树状数组)
题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...
- luogu2336 喵星球上的点名 (SA+二分答案+树状数组)
离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...
随机推荐
- QByteArray详解
QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述.本文通过以下几个部分加以介绍: 1. 初始化 2. 访问与赋值 3. 添加.删除.插入与替换操作 4 ...
- JS基础_嵌套的for循环
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- vue-app物理返回键跳到指定页面
例如提交订单成功跳到了订单详情页面,再返回就又到了提交订单支付页面 我们需要返回到其他页面 1.挂载完成后,判断浏览器是否支持popstate mounted(){ if (window.histor ...
- UEFI笔记 --- PeiReadOnlyVariable2->GetVariable()
问:在PEI阶段,PeiReadOnlyVariable2->GetVariable()可以从Pei Hob或NV RAM中获取UEFI变量,例如Setup默认值.若平台首次烧录BIOS并开机, ...
- 非JAVA WEB项目提供Http接口调用实现
package com.monitor.app.utils; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; import ...
- 记一次被自己DDOS攻击
服务器报警初步分析进一步分析最终分析总结 TOC 服务器报警 7月24号下午5点半开始,突然服务器报警,检查监控,发现CPU异常100%. 该服务器正常情况下CPU使用率在40%已经算高了,另外负载经 ...
- 第四篇.python的基础
目录 第四篇.python基础01 1. 变量 2. 常量 3. python变量内存管理 4. 变量的三个特征 5. 花式赋值 6. 注释 7. 数据类型基础 8. 数字类型 9. 字符串类型 10 ...
- MySQL数据库笔记五:多表查询
1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表 create table man( mid int primary key auto_increment, mn ...
- 在Python中,如何用一行代码去判定整数二进制中的连续 1
利用字节位操作如何判断一个整数的二进制是否含有至少两个连续的1 的方法有多种,大家第一反应应该想到的是以下的第一种方法. 方法一:从头到尾遍历一遍每一位即可找出是否有连续的1存在 这个方法是最普遍的. ...
- Python lambda 知识点
作者说学会了lambda后,你会用上瘾的,因为让代码复用和简洁. 初识lamdba不太好理解,尤其是它能当着一个变量传递给函数,不过多学着写几个例子就好了,下面是我的学习笔记. lambda 操作符( ...