zoj3961(区间问题)
点击打开zoj1961Let's Chat
Time Limit:
1 Second Memory Limit:65536 KB
ACM (ACMers' Chatting Messenger) is a famous instant messaging software developed by Marjar Technology Company. To attract more users, Edward, the boss of Marjar Company, has recently added a new feature to the software. The
new feature can be described as follows:
If two users, A and B, have been sending messages toeach other on the lastmconsecutive
days, the "friendship point" between them will be increased by 1 point.
More formally, if user A sent messages to user B on each day between the (i -m
+ 1)-th day and thei-th day (both inclusive), and user B also sent messages to user A on each day between the (i
- m + 1)-th day and thei-th day (also both inclusive), the "friendship point" between A and
B will be increased by 1 at the end of thei-th day.
Given the chatting logs of two users A and B duringn consecutive days, what's the number of the friendship points between them at the end of then-th
day (given that the initial friendship point between them is 0)?
Input
There are multiple test cases. The first line of input contains an integerT (1 ≤T
≤ 10), indicating the number of test cases. For each test case:
The first line contains 4 integers n (1 ≤n ≤ 109),m
(1 ≤m ≤n),x
andy (1 ≤x,y
≤ 100). The meanings ofn andm are described above, whilex
indicates the number of chatting logs about the messages sent by A to B, andy indicates the number of chatting logs about the messages sent by B to A.
For the following x lines, thei-th line contains 2 integersla,i
andra,i (1 ≤la,i
≤ra,i ≤n),
indicating that A sent messages to B on each day between thela,i-th
day and thera,i-th
day (both inclusive).
For the following y lines, thei-th line contains 2 integerslb,i
andrb,i (1 ≤lb,i
≤rb,i ≤n),
indicating that B sent messages to A on each day between thelb,i-th
day and therb,i-th
day (both inclusive).
It is guaranteed that for all 1 ≤ i <x,ra,i
+ 1 <la,i + 1
and for all 1 ≤i <y,rb,i
+ 1 <lb,i + 1.
Output
For each test case, output one line containing one integer, indicating the number of friendship points between A and B at the end of then-th day.
Sample Input
2
10 3 3 2
1 3
5 8
10 10
1 8
10 10
5 3 1 1
1 2
4 5
Sample Output
3
0
Hint
For the first test case, user A and user B send messages to each other on the 1st, 2nd, 3rd, 5th, 6th, 7th, 8th and 10th day. Asm = 3, the friendship
points between them will be increased by 1 at the end of the 3rd, 7th and 8th day. So the answer is 3.
Author: WENG, Caizhi
Source: The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
本题是:扫描线思想
对于此类题需要注意:
一:可能有区间合并
二:可能有区间排序
三:可能有不合法区间
四:对于判断交区间,并不需要很多个if语句判断,具体的,
我们设L=max(a.l,b.l),R=min(a.r.b.r),则做差为并期间,当R-L>0时为我们常见的具体的并区间。
幸运的是本题良心题,不需要排序合并,而且数据小,即便O(xy)也能过
//我的原始代码,拒绝不思考就引用
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,m,x,y,ans;
int l1[105],r1[105],l2[105],r2[105];
void _in()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=x;i++)
cin>>l1[i]>>r1[i];
for(int i=1;i<=y;i++)
cin>>l2[i]>>r2[i];
}
void _find(int a,int b)
{
int temp,L,R;
L=max(l1[a],l2[b]);
R=min(r1[a],r2[b]);
temp=R-L+1;
if(temp>=m) ans+=temp-m+1;
}
void _solve()
{
for(int i=1;i<=x;i++)
for(int j=1;j<=y;j++){
_find(i,j);
}
cout<<ans<<endl;
}
int main()
{
int t,T;
cin>>T;
for(t=1;t<=T;t++){
ans=0;
_in();
_solve();
}
return 0;
}
理解起来应该很简单
引申一下,对于这一类扫描线思想题目。
我们的大概步骤是:
1,排序(假定按左a.l为关键词排序)
2,合并(如区间[1,3],[3,5]合并成[1,5].而[1,3],[2,4]合并成[1,4])
3,按右a.r为关键词向右扫描,则本题的复杂度可以降到O(x+y) (应用师兄的代码http://blog.csdn.net/DongChengRong/article/details/70496302)
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100+20;
int n,m,x,y; struct Node
{
int start,endd;
}A[maxn],B[maxn]; /*int cmp(struct Node s1,struct Node s2)
{
return s1.start<s2.start;
}*/ int main()
{
int test;
scanf("%d",&test);
for(int i=0;i<test;i++)
{
scanf("%d%d%d%d",&n,&m,&x,&y);
for(int j=1;j<=x;j++) scanf("%d%d",&A[j].start,&A[j].endd);
for(int j=1;j<=y;j++) scanf("%d%d",&B[j].start,&B[j].endd);
//sort(A+1,A+1+x,cmp);
//sort(B+1,B+1+y,cmp);
int ans=0,j=1,k=1;
while(k<=y && j<=x)
{
int a,b;
if(B[k].start>A[j].endd) { j++; continue; }
if(B[k].endd<A[j].start) { k++; continue; }
a=max(B[k].start,A[j].start);
b=min(B[k].endd,A[j].endd);
if(a>n || b>n) break;
int date=b-a+1;
int point=date+1-m;
if(point>=1) ans+=point;
if(A[j].endd<B[k].endd) j++;
else if(A[j].endd==B[k].endd) { j++; k++;}
else k++;
}
printf("%d\n",ans);
}
return 0;
}
(当然,本题任然不需要排序)
如有错误,感谢指出
zoj3961(区间问题)的更多相关文章
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- [LeetCode] Find Right Interval 找右区间
Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...
- [LeetCode] Non-overlapping Intervals 非重叠区间
Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- [LeetCode] Summary Ranges 总结区间
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
随机推荐
- Project 10:简单图像的绘制
目标:绘制如图图像 #include <stdio.h> int main() { int n,i,j,o,k=0; printf("请输入一个数:"); scanf( ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- Brotli、Deflate、Zopfli、LZMA、LZHAM、Bzip2六种无损数据压缩性能比较
这里比较了六种数据压缩算法,结果表明Brotli算法会代替普遍使用的Deflate算法.分别用Canterbury compression corpus,web contentcorpus,和 enw ...
- 【2017集美大学1412软工实践_助教博客】个人作业3——个人总结(Alpha阶段)
题目 个人作业3--个人总结(Aplha阶段) 成绩公示 评分项 alpha过程的总结 5个问题 自我评价表 评论区互动 总分 分值 4 2.5 2.5 1 10 201221123032 1 1 2 ...
- 201521123077 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123020 《Java程序设计》第3周学习总结
本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 书面作业 1.代码 ...
- 201521123051《Java程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. Java多线程同步的方法: (1)同步方法:即有synchronized关键字修饰的方法. 由于java的每个对象 ...
- 201521123019 《Java程序设计》第9周学习总结
1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...
- Caused by: java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual tha
使用了数据库的关键字index,如果有类似的错误,看看自己有没有使用关键字!
- 06jQuery-03-选择器查找和过滤
1.查找 find().parent().prev().next() 通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤. 最 ...