CF685D Kay and Eternity 題解
阿新 • • 發佈:2021-10-14
Link.
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; }