河水被污染啦
很明显,每条河流能够污染的区域是一个矩形。
其实本题就是让我们求一个矩形面积并
Luogu 3875
#include
#include
#include
#include
const int maxm=21000;
struct node{
int xl,xr,h;
int f;
}link[maxm<<1];
int n,cnt;
int num[maxm<<1];
namespace seg{
struct tree{
int add,sum;
}st[maxm<<2];
void col(int o,int l,int r)
{
if(st[o].add) st[o].sum=num[r+1]-num[l];
else if(l==r) st[o].sum=0;
else st[o].sum=st[(o<<1)].sum+st[(o<<1)|1].sum;
}
void modify(int o,int l,int r,int ql,int qr,int s)
{
if(l>qr||rreturn;
if(ql<=l&&r<=qr)
{
st[o].add+=s;
col(o,l,r);
return;
}
int mid=(l+r)>>1;
modify((o<<1),l,mid,ql,qr,s);
modify((o<<1)|1,mid+1,r,ql,qr,s);
col(o,l,r);
}
}
using namespace seg;
inline bool comp(node x,node y)
{
return x.h<y.h;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int xl,yl,xr,yr;
if(y1==y2)
{
xl=std::min(x1,x2);
yl=y1-1;
xr=std::max(x1,x2);
yr=y1+1;
}
if(x1==x2)
{
xl=x1-1;
yl=std::min(y1,y2);
xr=x1+1;
yr=std::max(y1,y2);
}
link[++cnt].xl=xl,link[cnt].xr=xr,link[cnt].h=yl,link[cnt].f=1;
num[cnt]=xl;
link[++cnt].xl=xl,link[cnt].xr=xr,link[cnt].h=yr,link[cnt].f=-1;
num[cnt]=xr;
}
std::sort(link+1,link+cnt+1,comp);
std::sort(num+1,num+cnt+1);
int t=std::unique(num+1,num+cnt+1)-num-1;
int ans=0;
for(int i=1;iint xl=std::lower_bound(num+1,num+t+1,link[i].xl)-num;
int xr=std::lower_bound(num+1,num+t+1,link[i].xr)-num-1;
modify(1,1,t,xl,xr,link[i].f);
ans+=(link[i+1].h-link[i].h)*st[1].sum;
}
printf("%d\n",ans);
return 0;
}