点击打开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 ≤mn),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,in),
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,in),
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(区间问题)的更多相关文章

  1. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  2. SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等

    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  5. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  6. [LeetCode] Non-overlapping Intervals 非重叠区间

    Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...

  7. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  8. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  9. [LeetCode] Summary Ranges 总结区间

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...

随机推荐

  1. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...

  2. C#后台调用浏览器打开下载连接地址的三种方法

    一.从注册表中读取到本地计算机默认浏览器,然后调用下载. private void button1_Click(object sender, EventArgs e)   {       //从注册表 ...

  3. centos6/7通用查看系统版本

    查看centos6/7系统版本   要写一个centos系统的初始化脚本,但是centos6和centos7版本有很多命令都不相同,所以为了让脚本在两个版本之间都可以使用,就需要对centos系统版本 ...

  4. select设置disable后ie修改默认字体颜色暂时解决

    找了很多资料,终于在科学上网后找到了一个方法,虽然暂时不知道原理,但是已经实现了功能就是好的 select[disabled='disabled']::-ms-value { color: #000; ...

  5. Flask05 cookie

    1 什么是cookie 就是网站存放到你浏览器中的一部分固定内容:当你下次访问我这个网站的时候,你会把之前我存放到你浏览器中的数据带回来给我        你要先登录(用户名.密码) ->   ...

  6. jQuery高级Ajax

    .load();加载远程的HTML文件代码,并插入到指定的DOM节点中.可以只传入一个参数,表示加载一个静态的HTML代码片段. $("#div1").load("loa ...

  7. 让你的python程序同时兼容python2和python3

    python邮件列表里有人发表言论说「python3在10内都无法普及」.在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己 ...

  8. 201521123080《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 流(Stream): Stream是从起源(source)到接收(sink)的有序数据 按照流向分可以分为输入 ...

  9. java System.currentTimeMillis()毫秒值和具体日期值互相转换

    System.currentTimeMillis()与日期 间是可以相互转换的,通过 SimpleDateFormat dateformat = new SimpleDateFormat(" ...

  10. Linux帮助手册(man)

    Linux的帮助文档 在我们使用Linux的过程中,都会遇到这样那样的问题,一般我们在计算机能连上网的情况下会进行百度或Google解决问题,但是并不是所有文题都能在网上很快得到答案.万一我们是在没有 ...