题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P9

涨姿势之区间刷新

TimeLimit:2000MS  MemoryLimit:128MB
64-bit integer IO format:%I64d
Problem Description

Value_Dragon是一个有钱人。快过年了,所以他准备发红包。但是他发红包的方式很奇葩。他让n个人排成一排。每次选择1-n中的一段区间[l,r]发,给区间中的每一个人一块钱。就这样发了m次红包。发完后他想知道在[1,n]的子区间中有多少个区间满足以下要求

  1. 这个区间得到钱的总数不少于s

  2. 这个区间可以被分成两个不相交的子区间且每个子区间得到的钱的总数不小于w

(注:一个区间的子区间包括自己本身)

防坑提醒,长度为1的区间比如[1,1],是不能被拆成两个子区间的

Input

第一行是一个整数T代表数据的组数。
接下来有T组数据
每组数据开头有四个整数,分别代表n m s w
接下来m行,每行是是两个数l,r代表区间[l,r]的左右端点

其中T<=10

n<=10^6,m<=10^5

0<l<=r<=n

0<=w<=s<10^8

Output

对于每组数据输出一行,代表符合要求的区间个数

SampleInput
4
1 0 0 0 1000000 0 0 0 1000000 1 0 0
1 1000000 10 10 20 14
2 10
5 9
5 5
6 8
2 6
9 10
6 7
6 10
4 5
5 7
SampleOutput
0
499999500000
499999500000
8 思路:看到这题,我先想要怎么把发完压岁钱后的数据存下来,如果弄个数组,每次输入一个[l,r]就吧l到r数组里的数+1,这样的话万一输入的全是1 1000000这样的话输入一次就要做100万次加法再输入个10万次,这样的话就会计算1000亿次,肯定会超时一脸,这里需要一个小技巧,叫做差分,以下是差分代码
 while (m--)
{
int x,y;
scanf("%d%d",&x,&y);
a[x]++,a[y+]--;
}
for (int i=;i<=n;++i)
a[i]=a[i-]+a[i];

差分

差分的意思大概是比如你输入1 3

它就会让a[1]++,a[4]--,然后区间刷新,让a[i]=a[i]+a[i-1],这样循环一次后,从a[1]到a[5]就会变成1,1,1,0,0,你们可以自己模拟一遍体会一下这种方法。

然后存好数据后就可以开始想办法解决问题了,因为要多次用到区间和,所以我用前缀和处理了一下数据

 for (int i=;i<=n;++i)
sum[i]=sum[i-]+a[i];

前缀和

然后我用尺取的方法先找到满足(这个区间得到钱的总数不少于s条件)的区间,然后再添加一个指针k,找到满足(这个区间可以被分成两个不相交的子区间且每个子区间得到的钱的总数不小于w)条件的分界点k,找到一个满足条件的区间后,可以一直增加到n都满足条件,所以答案每次会增加n-r+1。随着l的增加,k和r也只会单调增加(因为随着l增加,要满足条件1和条件2,[l,r]要大于s[l,k]要大于w),所以l,r,k都是单调增加的,时间复杂度为o(n)。以下是尺取代码。

 ansx=a[];///ansx代表当前尺取的区间和
for(l=;l<=n&&l<=r;l++)
{
while(ansx<s&&r<n)
{
r++;
ansx+=sum[r]-sum[r-];
}
while(ansx>=s&&r<=n)
{
while(sum[k]-sum[l-]<w&&k<n)k++;
if(sum[r]-sum[k]>=w&&l!=r)
{
ans+=n-r+;
break;
}
else if(r==n)break;
else if(r<n)
{
r++;
ansx+=sum[r]-sum[r-];
}
}
ansx-=sum[l]-sum[l-];
}

尺取(三指针)

答案有可能会爆int的表示范围,注意答案使用longlong,其他的用int就好了,longlong计算比int慢,有可能会导致超时。

FJUT16级第一周寒假作业题解J题的更多相关文章

  1. FJUT16级第一周寒假作业题解I题

    涨姿势题3 TimeLimit:1000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就 ...

  2. FJUT16级第一周寒假作业题解G题

    题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P6 涨姿势题1 TimeLimit:1000MS  MemoryLimit:128000K ...

  3. FJUT16级第一周寒假作业题解D题

    题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P3 第八集,体能训练 TimeLimit:1000MS  MemoryLimit:128M ...

  4. 16级第一周寒假作业F题

    Subsequence TimeLimit:1000MS  MemoryLimit:65536K 64-bit integer IO format:%lld Problem Description A ...

  5. 福建工程学院16级第一周寒假作业E题----第七集,奇思妙想

    第七集,奇思妙想                                                                                            ...

  6. 16级第二周寒假作业E题

    Home_W的位运算4 TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 给 ...

  7. 16级第二周寒假作业H题

    快速幂(三) TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 计算( AB ...

  8. 第一周pta作业2

    7-2 求最大值及其下标 (20 分) 本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始). 输入格式: 输入在第一行中给出一个正整数n(1<n≤10).第二行输入n ...

  9. 《OD学hadoop》第一周0626 作业二:Linux基础

    一.打包压缩 知识点: tar -zxvf -C PATH tar -jxvf tar -zcvf tar -jcvf tar:打包命令 -z 打包同时gzip压缩 -j 打包同时bzip2 -c 打 ...

随机推荐

  1. Flask從入門到入土(三)——模板

    模板是一個包含響應文本的文件,其中包含佔位變量表示的動態部分,其具體值只是請求上下文中才能知道.使用真實值替換變量,再返回最終得到的響應字符串,這一過程稱爲渲染.爲了渲染模板,Flask使用了一個名爲 ...

  2. 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.

    spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...

  3. spring boot admin + spring boot actuator + erueka 微服务监控

    关于spring boot actuator简单使用,请看 简单的spring boot actuator 使用,点击这里 spring boot admin 最新的正式版本是1.5.3 与 spri ...

  4. Swagger2 Oauth2.0 令牌 请求头

    @EnableSwagger2 @Bean public Docket createRestApi() { ParameterBuilder tokenPar = new ParameterBuild ...

  5. linux清屏命令(clear,reset)

    (1)clear 这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息.一般都会用这个命令. (2)reset 这个命令将完全刷新终端屏幕,之前的终端输入 ...

  6. Minicom串口工具安装及配置

    Minicom串口工具安装及配置 1. 简述 嵌入式开发多采用串口线连接电脑进行开发及调试. 2 安装及配置串口工具(以Minicom为例) Tiny4412开发板提供的有RS232电平的DB9公头接 ...

  7. 浏览器通过Scheme协议启动APP中的页面

    在APP开发过程中,通过外部浏览器调起APP页面的场景也很普遍使用.下面就介绍一下通过外部H5页面唤起APP中页面的通用方法. 1.首先需要在AndroidMainifest.xml中对你要启动的那个 ...

  8. Android的微信智能心跳方案

    原文地址: 年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了差不多两个多礼拜 ...

  9. 错误代码: 1381 You are not using binary logging

    1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:show master logs 错误代码: 1381 You are no ...

  10. 挖一挖不常用到而又很实用的重载-Split

    Split这个基本上所有的程序开发人员都用到,一般使用单字符和长字符串拆分字符串的较多,其实还有一个重载非常好用,那就是多种组合字符来进行拆分. 例如: "aaaaaaaaaa{@}bbbb ...