题目链接:https://ac.nowcoder.com/acm/contest/883/G

题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有石堆的石子数均为\(0\)时获胜。问有多少个区间\([l,r]\)可以保证获胜(若区间内石子数总和为奇数则会选一堆石子数最小的石堆取走一个石头)。

题解:显然,对其中的一个区间,如果区间内的最大值\(mx\)不超过其总和\(sum\)的一半,则能保证获胜。于是可以考虑每一个\(a_i\)作为最大值的区间\([l_i,r_i]\),在答案中减去其中不满足要求的区间即可,注意这个区间一定要包含\(i\)。

   每次枚举\(i\)时,先二分出最左边的\(l\)使得区间\([l,i]\)恰好不满足条件,然后再二分出最左边的\(r\)使得\([l,r]\)恰好不满足条件,每次将\(l\)加一直至达到当前的\(i\)即可

   时间复杂度为O(能过),求大佬帮忙分析复杂度orz

#include<bits/stdc++.h>
using namespace std;
#define N 300001
#define LL long long
LL T,n,a[N],l[N],r[N],s[N],f[N],ans;
void rua(LL cur,LL L,LL R)
{
LL l,r;
l=upper_bound(s+L-,s+cur+,s[cur-]-a[cur])-s;l++;
r=cur;
while(l<=cur)
{
r=min(R,(LL)(lower_bound(s+r+,s+R+,2ll*a[cur]+s[l-])-s-));
ans-=r-max(cur,max(f[l]+,l))+;
f[l]=max(f[l],r);
l++;
}
}
void init()
{
scanf("%lld",&n);
for(LL i=;i<=n;i++)
scanf("%lld",&a[i]),s[i]=s[i-]+a[i],f[i]=i;
l[]=,r[n]=n;
for(LL i=;i<=n;i++)
{
LL _=i;
while(_> && a[i]>=a[_-])
_=l[_-];
l[i]=_;
}
for(LL i=n-;i>=;i--)
{
LL _=i;
while(_<n && a[i]>a[_+])
_=r[_+];
r[i]=_;
}
ans=n*(n-)/;
for(LL i=;i<=n;i++)
rua(i,l[i],r[i]);
printf("%lld\n",ans);
}
int main()
{
//freopen("test.in","r",stdin);
scanf("%lld",&T);
while(T--)init();
return ;
}

[2019牛客多校第三场][G. Removing Stones]的更多相关文章

  1. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  2. 启发式分治:2019牛客多校第三场 G题 Removing Stones

    问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...

  3. Removing Stones(2019年牛客多校第三场G+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时有\(n\)堆石子,每堆石子的石子个数为\(a_i\),然后进行游戏. 游戏规则为你可以选择任意两堆石子,然后从这两堆中移除一个石子,最 ...

  4. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  5. 2019牛客多校第三场D BigInteger——基础数论

    题意: 用  $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mo ...

  6. [题解]Magic Line-计算几何(2019牛客多校第三场H题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...

  7. [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...

  8. 2019牛客多校第三场A Graph Games 分块思想

    题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...

  9. 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)

    Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...

随机推荐

  1. yum 安装 epel-release 后出现yum doesn’t have enough cached data to continue错误的解决方案

    工作中需要部署docker,由于是内网环境,无法直接访问外网,于是考虑在内网搭建yum私有源进行安装,内网服务器操作系统为centos 7.4.根据docker的官方安装方式进行安装时,要求安装 ep ...

  2. JSON文件转为Excel

    前言 今天在帮老师做年终党统的时候,发现管理平台上没有将正在发展的同志的信息导出功能,只能一个一个点击进去查看,操作起来步骤很多很麻烦,所以我就想到了"扒"一下这个网页,扒下来发现 ...

  3. C++Primer 5th Chap5 Statements

    else语句对应的始终是最近的那条if语句,除非有{}强行控制,如: if(A){ if(B){/*.............*/} }else{/*.......*/}//这里else和if(A)对 ...

  4. PAT(B) 1005 继续(3n+1)猜想(Java)

    题目链接:1005 继续(3n+1)猜想 分析  找出所有的被"覆盖"的数,然后再将输入的数中不在被"覆盖"的数中的数添加到"关健数"中.输 ...

  5. 【闭包】Pants On Fire

    Pants On Fire 题目描述 Donald and Mike are the leaders of the free world and haven’t yet (after half a y ...

  6. Ubuntu部署ftp服务器

    Ubuntu 16.04 FTP服务器安装及配置     FTP File Transfer Protocol文件传输协议,两台计算机传送文件的协议,客户端可以通过FTP命令从服务器下载,上传文件,修 ...

  7. hdu 4857 反向拓扑问题

    尤其要注意拓扑的分层问题 不难理解 就是不怎么好想到 拓扑的思路这里就不累述了 #include <iostream> #include <cstdio> #include & ...

  8. sql 时间获取

    现在时间:GETDATE() 昨天时间:CONVERT(VARCHAR(16),DATEADD(d,-1,GETDATE()),120)

  9. Docker启动Elasticsearch报错java.nio.file.AccessDeniedException

    报错信息 Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 问题分析 表面上是说容 ...

  10. 基于【 centos7】三 || 分布式文件系统FastDFS+Nginx环境搭建

    1. FastDFS介绍 1.1 FastDFS定义 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用 ...