1. 程式人生 > 其它 >CF685D Kay and Eternity 題解

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