CF685D Kay and Eternity 题解

Codeforces
Luogu

Description.

\(n\) 个格子被涂黑,第 \(i\) 个是 \((x_i,y_i)\),对每个 \(x\in[1,n]\),求出恰好包含 \(x\) 个黑格子的 \(k\times k\) 矩形数量。
\(k\le 300\)

Solution.

扫描线什么的根本不会的啦

统计矩形时统计右下角,那相当于每个黑格子对应了一个 \((x_i-K+1,y_i-K+1)\)\((x_i,y_i)\) 的矩形。
然后扫描线,发现 \(O(nk)\) 可过,所以直接暴力枚举每个矩形中所有元素更新。
然后就做完了

Coding.

点击查看代码
//是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
const int N=200005;int n,K,tn[N],ut,ls[N],cn[N];ll rs[N];
struct ${int x,y,v;char operator<($ b) {return x<b.x;}}a[N];
int main()
{
	read(n,K);for(int i=1,x,y;i<=n;i++)
		read(x,y),a[i]=($){x-K,y,1},a[i+n]=($){x,y,-1},tn[++ut]=y,tn[++ut]=y-K;
	sort(tn+1,tn+ut+1),ut=unique(tn+1,tn+ut+1)-tn-1,sort(a+1,a+n+n+1);
	for(int i=1;i<=n+n;i++)
	{
		int l=lower_bound(tn+1,tn+ut+1,a[i].y-K)-tn;
		int r=lower_bound(tn+1,tn+ut+1,a[i].y)-tn;
		for(int j=l+1;j<=r;j++)
			rs[cn[j]]+=1ll*(tn[j]-tn[j-1])*(a[i].x-ls[j]),
			ls[j]=a[i].x,cn[j]+=a[i].v;
	}
	for(int i=1;i<=n;i++) printf("%lld%c",rs[i],i==n?'\n':' ');
	return 0;
}
原文地址:https://www.cnblogs.com/pealfrog/p/15408397.html