题目链接: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. spring 组件@Scope(request,session)示例

    上回说到, spring组件的注解Scope大约有singleton.prototype.request.session.global session 这么几种常用的场景.这里需要特别说明一下,根据源 ...

  2. js在函数中未定义的变量的处理

    <html> <head> <script type="text/javascript"> var z=1; function abc(){ x ...

  3. POJ - 3268 单源最短路

    题意:给定一些有向边,以及一个目的地,从某个点到达目的地,再从目的地回到那个点.共有n个点,问这n个点花费最大是多少? 思路:从目的地回去直接把目的地作为源点即可.那么从某个点到达目的地应该如何得到最 ...

  4. 洛谷P3375 - 【模板】KMP字符串匹配

    原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...

  5. Unix代码段和数据段

    关于UNIX系统代码段和数据段分开的目的:方便编程. 1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而 ...

  6. 写出一条Sql语句:取出表Customer中第31到第40记录(SQLServer,以自动增长的Id作为主键,注意:Id可能不是连续的。

    select top 10 * from (select ROW_NUMBER() over(order by Id) as rows,* from Customer) as C where C.ro ...

  7. HeapAlloc,GlobalAlloc,LocalAlloc,VirtualAlloc,malloc,new的异同

    1. 首先我们来看HeapAlloc: MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的 空间利用起来, ...

  8. dedecms 使用自由列表实现首页列表分页

  9. VxWorks镜像简介

    VxWorks镜像可分为三类:   可加载型VxWorks镜像:存储在开发机上,运行在板上RAM中   基于ROM的VxWorks镜像:存储在板上ROM,运行在板上RAM中   ROM驻留的VxWor ...

  10. Java之List排序

    1.Java封装类 Student.java: /** * @Title:Student.java * @Package:com.you.data * @Description: * @Author: ...