zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    关于对话框创建与销毁的虚函数用法
    控件属性设置注意事项
    删除非空文件夹下所有内容方法
    CString类使用技巧
    视图间通信方法
    CTreeCtrl控件使用技巧
    MFC MDI 遍历打开的所有文档
    将datagrid的数据源到出导excel
    ASP.NET 給一組控件賦值 範例.
    ASP.NET Resouce Kit
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15408397.html
Copyright © 2011-2022 走看看