题目链接: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. WinForm中ClickOnce发布至广域网

    ClickOnce智能客户端,是微软提供比较早的一项技术,用于实现WinForm开发的应用程序能够自动更新,省去给每台客户端升级带来的困扰. 从网上的贴子里看,有的说好用,有的说不好用.客观的说,微软 ...

  2. bcache的使用

    一.前提:内核中需要配置bcache模块 1.1 检查 - 是否存在于内核中:检查/sys/fs/bcache目录是否存在,没有说明内核中没有bcache - 是否以内核模块方式存在:检查/lib/m ...

  3. AndroidStudio中导入module(简单版)

    1.把要导入成Mudle的项目修改成符合Library的格式 修改该项目中bulid.gradle文件中第一行代码 把 apply plugin: 'com.android.application' ...

  4. C# 之三类文件的读写( .XML,.INI 和 .TXT 文件)

    笔记之用,关于三类.xml, .ini, .txt 文件的 C# 读写,请多多指教! 1,第一类:.xml 文件的读写 先贴上xml文件,下面对这个文件进行操作: <?xml version=& ...

  5. 浅谈 Glide - BitmapPool 的存储时机 & 解答 ViewTarget 在同一View显示不同的图片时,总用同一个 Bitmap 引用的原因

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  6. linux iptables扩展,脚本防火墙

    netfileter:防火墙内核态ip tables:防火墙用户态(管理防火墙规则) iptables的表和链表包括不同的链,链包括大量的规则4个表: raw,mangle,nat,filter5种链 ...

  7. ImportError: No module named 'xlrd' 解决办法

    import pandas as pd data = pd.read_excel('工作簿1.xls',sheetname='Sheet1') 用pandas读取Excel文件时,会提示 Import ...

  8. GOF 23种设计模式

    设计模式目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Sin ...

  9. PHP stream_context_create()作用和用法分析

    stream_content_create 创建并返回一个文本数据流并应用各种选项,可用于fopen(),filegetcontents()等过程的超时设置.代理服务器.请求方式.头信息设置的特殊过程 ...

  10. 使用ffserver实现转发实时流媒体(摄像头捕获)

    本系统为ubuntu 10.04LTS 说明1:本实验在本机成功测试通过: 说明2:本实验仅仅测试了视频流,未测试音频流. 1.配置ffserver.conf -------------------- ...