[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>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...
随机推荐
- 《深入实践C++模板编程》之五——容器与迭代器
1.容器的定义 容器:专门用于某种形式组织及存储数据的类称为“容器”. 2.容器与迭代器 迭代器:封装了对容器虚拟数据序列的操作并按约定提供统一界面以遍历容器内容的代理类即为迭代器. 举例理解 ...
- Winform自定义键盘控件开发及使用
最近有学员提出项目中要使用键盘控件,系统自带的osk.exe不好用,于是就有了下面的内容: 首先是进行自定义键盘控件的开发,其实核心大家都知道,就是利用SendKeys.Send发送相应 的字符,但是 ...
- C#选择文件保存路劲
private void button8_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrow ...
- 【原创】数据库基础之Sqlite
官方:https://www.sqlite.org/index.html 简介 SQLite is a C-language library that implements a small, fast ...
- O052、Create Volume 操作 (Part III)
参考https://www.cnblogs.com/CloudMan6/p/5617980.html Jun 20 17:15:56 DevStack-Rocky-Compute-22 c ...
- npm安装淘宝镜像cnpm
在cmd中执行 npm install -g cnpm --registry=https://registry.npm.taobao.org
- Windows 10 安装FileZilla Server
在windows 10本机安装了FileZilla Server 本机用FilleZilla Client连接localhost或者192.168.0.197 port 21 都可以连通,但是在同 ...
- ES6 class 继承 与面向对象封装开发简单实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Swift 函数式数据结构 - 链表
本文将使用Swift实现一个标准链表,在实现的过程中,遵守函数式编程的规则,无副作用,可以看到和C语言的实现还是有较大的差异. 预备知识 enum 的各种用法 swift的基本的模式匹配( patte ...
- linux网络协议栈(四)链路层 vlan处理
转:http://blog.csdn.net/u010246947/article/details/18224517 4.6.VLAN处理: 4.6.1.vlan原理 对于带vlan的以太网报文,其以 ...