[USACO19FEB]Painting The Barn S
题目描述
农夫约翰不擅长多任务处理。他经常分心,很难完成长的项目。目前,他正试图在谷仓的一侧上漆,但他一直在画小矩形区域,然后由于照料奶牛的需要而偏离了方向,使得谷仓的某些部分上漆的涂料比其他部分多。
我们可以将谷仓的一侧描述为一个二维x-y平面,农夫约翰在该平面上绘制n个矩形,每个矩形的边都与坐标轴平行,每个矩形由谷仓的左下角和右上角点的坐标描述。
农夫约翰想在谷仓上涂几层油漆,这样在不久的将来就不需要再重新粉刷了。但是,他不想浪费时间涂太多的油漆。结果表明,K涂层是最佳用量。请在他画完所有的长方形后,帮他确定谷仓有多少面积被K层油漆覆盖。
输入格式
输入的第一行包含n和k(1≤k≤n≤100000)。其余n行中的每一行包含四个整数x1、y1、x2、y2,描述正在绘制的矩形区域,左下角(x1、y1)和右上角(x2、y2)。所有x和y值都在0…1000范围内,并且所有矩形都有正面积。
输出格式
请输出谷仓被K层油漆覆盖的区域。
这道题一看就是二维差分,我的二维差分模板复制一下,发现样例都没过????
这个时候我开始怀疑我想法是不是错了,看了题解发现也是二维差分,但是好像跟我的写法不太一样;再次怀疑是不是我的板子错了,但是不太可能啊,写过这种题目的;
然后发现我的模板是左上角和右下角,这道题是左下角和右上角,一度怀疑这有问题;
最后的最后才发现,这道题给的是点的坐标,而模板是小格子坐标,只要左下角坐标加1就行;
总结:二维差分对于给的点是左上右下还是左下右上没有任何区别,但是要特别注意是点坐标还是格子坐标;
代码:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=