当前位置: 首页 > news >正文

HDU5358 First One(尺取法+数学)

题目链接
在这里插入图片描述
1.题目大意:给出一个式子,求所有子序列代入此式的和

2.第一眼可能会想到O(n2)暴力枚举子序列,但是很明显1e5的范围O(n2)过不了。不难发现由于向下取整,那么log2S(i,j)一定是整数,那么也就是S(i,j)如果在[2p,2p+1)区间内答案都是p。我们先来测试一下,数据的极限——1e5个1e5数,最多达到233,因为后面还加1,因此前式一共有[0-34],35种结果,那么问题可以变为我们对这35种结果分别计算后面的区间和即可,因此输入我们要计算前缀和
在这里插入图片描述

3.但是怎么求每个k后面的区间和呢,很容易想到的思路是暴力查找符合S(i,j)范围的子区间,但是这样时间复杂度又到O(n2)了,这时尺取的作用就出现了。我们首先枚举每个起点i,对于该起点找到一段区间[L,R],使得S(i,L)和S(i,R)都满足上面的不等式范围。那么下面肯定要枚举起点i+1了,不难证明
当起点后移之后,因为单调性,那么后面的区间肯定不小于之前的L,还考虑到当前起点可能大于之前的L,因此取二者中较大的那个。至于R就是取当前L和之前R较大者。最后就是合并区间了,假设最后区间为[L,R],那么区间和为(i+L)+(i+L+1)+…+(i+R)=(2*i+L+R)*(R-L+1)/2

4.不知道为什么C++会TLE,G++就可以过了

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll sum[maxn];
int n;
ll ans;

int test(){
    ll x=1;
    int cnt=0;
    while(x*2<1e10){
        cnt++;
        x*=2;
    }
    return cnt;
}

void solve(int k){
    ll L=1LL<<k-1,R=(1LL<<k)-1;
    if(!k) k=1;         //k=0时要特判,此时区间[0,0]正确,但是最后能乘以0
    int l=1,r=0;
    for(int i=1;i<=n;i++){
        l=max(l,i);
        while(l<=n && sum[l]-sum[i-1]<L) l++;
        r=max(l,r);
        while(r<=n && sum[r]-sum[i-1]<=R && sum[r]-sum[i-1]>=L) r++; //r是闭区间r的下一个,因此后面求区间长度时没有减一
        if(l>r) continue;
        ans+=((2LL*i+l+r-1)*(r-l)/2)*k;  //左闭右开的区间[l,r)
    }
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;
    ll x;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&x);
            sum[i]=sum[i-1]+x;
        }
        ans=0;
        for(int i=0;i<=34;i++){
            solve(i);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

相关文章:

  • Code Jam 2020 Qualification Round
  • Android开发指南-用户界面-通用布局对象
  • UVa1471 Defense Lines(LIS变形)
  • 计蒜客43467 Canyon Crossing(二分答案+多队列bfs)
  • 三句代码调整进程优先级
  • UVa714 Copying Books(二分答案+贪心)
  • 《程序员羊皮卷》成为电子工业出版社本周重点推荐图书
  • UVa12627 Erratic Expansion(递归/找规律)
  • 《金牌网管师》——10年的沉淀,18年的积累
  • 2020 CodeJam Round 1A
  • 如何更换Android模拟器界面
  • 2019 ICPC Latin American Regional Contests 计蒜客重现
  • youtube weburl后缀
  • UVa12174 Shuffle(滑动窗口)
  • Android开发指南-工具-画九宫格
  • 分享的文章《人生如棋》
  • angular2开源库收集
  • Java超时控制的实现
  • JS专题之继承
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python学习笔记 字符串拼接
  • react-native 安卓真机环境搭建
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • vagrant 添加本地 box 安装 laravel homestead
  • 动态规划入门(以爬楼梯为例)
  • 计算机常识 - 收藏集 - 掘金
  • 解决iview多表头动态更改列元素发生的错误
  • 近期前端发展计划
  • 类orAPI - 收藏集 - 掘金
  • 聊聊flink的TableFactory
  • 一个SAP顾问在美国的这些年
  • 用mpvue开发微信小程序
  • 【干货分享】dos命令大全
  • #include
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)树状数组
  • (转)一些感悟
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net 8.0 新的变化
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 设置默认首页
  • .net 生成二级域名
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NetCore项目nginx发布
  • .net对接阿里云CSB服务
  • .NET构架之我见
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET学习全景图
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)