codeforces1401E Divide Square

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;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/108247442