题解:P14103 [ZJCPC 2017] Let's Chat
题意
给定两组区间,第一组有
思路
简单模拟题,观察到数据范围除了
对于求交集操作,我们可以遍历到一个区间后再对另一组区间进行遍历,判断是否存在交集,即判断是否存在两个正整数
对于算分操作,遍历每个最终求出交集的区间,由于区间长度为
注意了,题目中说的是输出
在第
Code
#include <iostream>
#include <cstdio>
using namespace std;
int t, n, m, x, y, len = 0, ans = 0;
struct node{
int l, r;
};
node qj1[205], qj2[205], nq[405];
int main()
{
scanf("%d", &t);
while(t--){
len = 0;
ans = 0;
for(int i = 0;i < 405;i++){
if(i < 205LL){
qj1[i].l = 0;
qj1[i].r = 0;
qj2[i].l = 0;
qj2[i].r = 0;
}
nq[i].l = 0;
nq[i].r = 0;
} // 以上均为初始化操作
scanf("%d%d%d%d", &n, &m, &x, &y);
for(int i = 1;i <= x;i++) scanf("%d%d", &qj1[i].l, &qj1[i].r);
for(int i = 1;i <= y;i++) scanf("%d%d", &qj2[i].l, &qj2[i].r);
for(int i = 1;i <= x;i++){
for(int j = 1;j <= y;j++){
if(qj2[j].l <= qj1[i].r && qj2[j].r >= qj1[i].l){ // 存在交集
len++;
nq[len].l = max(qj2[j].l, qj1[i].l);
nq[len].r = min(qj2[j].r, qj1[i].r); // 存储交集
}
}
}
for(int i = 1;i <= len;i++){
if(nq[i].l > n) break; // 左端点越界,循环结束
int scr = min(n, nq[i].r) - nq[i].l + 2 - m; // 算分,注意右端点越界情况
int tot = max(0, scr); // 最终得分
ans = ans + tot; // 累加
}
printf("%d\n", ans); // 输出
}
return 0; // 结束 (。・ω・。)
}