FJUT16级第一周寒假作业题解J题
题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P9
涨姿势之区间刷新
Value_Dragon是一个有钱人。快过年了,所以他准备发红包。但是他发红包的方式很奇葩。他让n个人排成一排。每次选择1-n中的一段区间[l,r]发,给区间中的每一个人一块钱。就这样发了m次红包。发完后他想知道在[1,n]的子区间中有多少个区间满足以下要求
这个区间得到钱的总数不少于s
这个区间可以被分成两个不相交的子区间且每个子区间得到的钱的总数不小于w
(注:一个区间的子区间包括自己本身)
防坑提醒,长度为1的区间比如[1,1],是不能被拆成两个子区间的
第一行是一个整数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
对于每组数据输出一行,代表符合要求的区间个数
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
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题的更多相关文章
- FJUT16级第一周寒假作业题解I题
涨姿势题3 TimeLimit:1000ms MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就 ...
- FJUT16级第一周寒假作业题解G题
题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P6 涨姿势题1 TimeLimit:1000MS MemoryLimit:128000K ...
- FJUT16级第一周寒假作业题解D题
题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P3 第八集,体能训练 TimeLimit:1000MS MemoryLimit:128M ...
- 16级第一周寒假作业F题
Subsequence TimeLimit:1000MS MemoryLimit:65536K 64-bit integer IO format:%lld Problem Description A ...
- 福建工程学院16级第一周寒假作业E题----第七集,奇思妙想
第七集,奇思妙想 ...
- 16级第二周寒假作业E题
Home_W的位运算4 TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 给 ...
- 16级第二周寒假作业H题
快速幂(三) TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 计算( AB ...
- 第一周pta作业2
7-2 求最大值及其下标 (20 分) 本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始). 输入格式: 输入在第一行中给出一个正整数n(1<n≤10).第二行输入n ...
- 《OD学hadoop》第一周0626 作业二:Linux基础
一.打包压缩 知识点: tar -zxvf -C PATH tar -jxvf tar -zcvf tar -jcvf tar:打包命令 -z 打包同时gzip压缩 -j 打包同时bzip2 -c 打 ...
随机推荐
- 机器学习之支持向量机(四):支持向量机的Python语言实现
注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...
- uva12325 暴力枚举
这题刚开始我就贪心,直接wrong了,贪心适合可以取一个物体部分的题. 还是老实枚举吧,注意枚举要分类,不然可能会超时,还有注意答案是long long AC代码: #include<cstdi ...
- Centos7下,简单DOCKER 使用.映射SSH端口到宿主主机.
其实使用docker完全没有必要ssh,初学的时候,可以这样熟悉以下操作. 参考这哥们的文章:http://www.jianshu.com/p/d2dd936863ec 获取镜像 docker pul ...
- js处理时间戳显示的问题
function getDate(tm){ ); var year = date.getFullYear(); var month = date.getMonth()+1; var day = dat ...
- 3_Longest Substring Without Repeating Characters -- LeetCode
C++解法一: class Solution { public: int lengthOfLongestSubstring(string s) { ] = {},left = , res = ; ; ...
- cmder默认的命令提示符λ改成$
新版的cmder(2016.11.3测试)单纯修改init.bat或以前的方法都试过了不行,下面是我自己找到的方法.亲测可行. cmder\vendor\clink.lua文件中第41行中{lamb} ...
- 查看dmp文件
1.查看dmp文件,首先要通过以下的链接地址进行下载 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.m ...
- Java中替换HTML标签的方法
1.替换HTML标签 replaceAll("\\&[a-zA-Z]{0,9};", "").replaceAll("<[^>]* ...
- Flex弹出窗口请求Action函数
Flex弹出窗口请求Action函数 private function askQuestion(event:MouseEvent):void { var askQuestions:AskWindow ...
- 使用jsoup抓取新闻信息
1,jsoup简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和 ...