ZOJ

/*这题的思路是:不断取交集,并判断每个取到的交集中,能分出几个大小为3的子集(以双方都通话的天数为集合元素)
//注意,如果没有大于3的子集,那么就说明友谊度不会累加,但也不会扣除,按照原来的计算,不到反而会扣,所以要和0取max
// 参考博客; http://blog.csdn.net/a664607530/article/details/70893623
// 我写的和他略有不同的地方是,我的循环退出条件,改为了枚举完任意一个人的所有区间,则退出...不过这个只是小节,怎么写都无妨,最终是对的就行
*/


#include <iostream>
using namespace std;

struct time
{
	int l, r;
}a[105], b[105];
int main()
{
	cin.sync_with_stdio(false);
	cin.tie(0);
	
	int t, n, m, x, y;
	cin >> t;
	while (t--)
	{
		cin >> n >> m >> x >> y;
		
		for (int i = 1; i <= x; i++) cin >> a[i].l >> a[i].r;
		for (int i = 1; i <= y; i++) cin >> b[i].l >> b[i].r;
		
		int ii = 1, jj = 1, ans = 0;
		while (ii <= x && jj <= y)
		{
			int mi, ma;
			ma = max(a[ii].l, b[jj].l);
			mi = min(a[ii].r, b[jj].r);
			ans += max(mi - ma - m + 2, 0);
			
			if (a[ii].r < b[jj].r) ii++;
			else if (a[ii].r > b[jj].r) jj++;
			else ii++, jj++;		
		}
		cout << ans << endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/mofushaohua/p/7789468.html