https://codeforces.com/problemset/problem/1401/E
这题关键是知道什么时候矩形会增加。。。首先4个边框围成的矩形先ans=1
第一种是如果一条中间的线横跨整个对边,那么ans++
第二种则是如果一条线与另一条线在中间有交点,则ans++
以为x,y互不相同,那么一定是一条直线和一条竖线形成交点,由于这条直线和这条竖线都是连接到某一边的边界的,那么一定会新增一个矩形
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=1e6+10;
int n,m;ll ans;
int b[maxl];
struct hx
{
int y,lx,rx;
};
vector<hx> in[maxl],out[maxl];
struct sx
{
int x,ly,ry;
}a[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
int y,lx,rx;
ans=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&y,&lx,&rx);
++y;
in[lx].push_back(hx{y,lx,rx});
out[rx+1].push_back(hx{y,lx,rx});
if(lx==0 && rx==maxl-10)
++ans;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].ly,&a[i].ry);
if(a[i].ly==0 && a[i].ry==maxl-10)
++ans;
++a[i].ly;++a[i].ry;
}
}
inline bool cmp(const sx &a,const sx &b)
{
return a.x<b.x;
}
inline void add(int i,int x)
{
while(i<maxl)
{
b[i]+=x;
i+=i&-i;
}
}
inline int sum(int i)
{
int ret=0;
while(i)
{
ret+=b[i];
i-=i&-i;
}
return ret;
}
inline void mainwork()
{
int l=-1;
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++)
{
while(l<a[i].x)
{
++l;
for(hx d:in[l])
add(d.y,1);
for(hx d:out[l])
add(d.y,-1);
}
ans+=sum(a[i].ry)-sum(a[i].ly-1);
}
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}