すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)

Problem Statement

We have a grid with H rows and W columns. At first, all cells were painted white.

Snuke painted N of these cells. The i-th ( 1≤iN ) cell he painted is the cell at the ai-th row and bi-th column.

Compute the following:

  • For each integer j ( 0≤j≤9 ), how many subrectangles of size 3×3 of the grid contains exactly j black cells, after Snuke painted N cells?

Constraints

  • 3≤H≤109
  • 3≤W≤109
  • 0≤Nmin(105,H×W)
  • 1≤aiH (1≤iN)
  • 1≤biW (1≤iN)
  • (ai,bi)≠(aj,bj) (ij)

Input

The input is given from Standard Input in the following format:

H W N
a1 b1
:
aN bN

Output

Print 10 lines. The (j+1)-th ( 0≤j≤9 ) line should contain the number of the subrectangles of size 3×3 of the grid that contains exactly j black cells.

Sample Input 1

4 5 8
1 1
1 4
1 5
2 3
3 1
3 2
3 4
4 4

Sample Output 1

0
0
0
2
4
0
0
0
0
0

There are six subrectangles of size 3×3. Two of them contain three black cells each, and the remaining four contain four black cells each.

Sample Input 2

10 10 20
1 1
1 4
1 9
2 5
3 10
4 2
4 7
5 9
6 4
6 6
6 7
7 1
7 3
7 7
8 1
8 5
8 10
9 2
10 4
10 9

Sample Output 2

4
26
22
10
2
0
0
0
0
0

Sample Input 3

1000000000 1000000000 0

Sample Output 3

999999996000000004
0
0
0
0
0
0
0
0
0

题意:给定一个高为h,宽为w的矩阵,然后给你n个黑色块的坐标。让你求出所有大小为3*3的矩阵分别包含了多少个黑色块,你只需要输出含有0~9个黑色块的个数的矩阵数量分别是多少。

思路:由于h和w的数量很大,没有办法进行直接标记模拟。、我们思考如下:每一个黑色的方块只会对9个3*3的矩阵有贡献。

看图:

看图可以知道,蓝色圆圈的位置如果是黑色块,可以对以红色点为左上角起点的3*3的区间有贡献。

那么我们对每一个黑色块算出的一共9个的贡献矩阵,全部加入到一个数组中,排序后处理答案即可。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), ‘\0‘, sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
    ll x,y;
}a[maxn];
ll n;
ll h,w;
ll xx[]={-2,-2,-2,-1,-1,-1,0,0,0};
ll yy[]={-2,-1,0,-2,-1,0,-2,-1,0};
ll ans[1000];
ll mod=1e9+7;
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
    gbtb;
    cin>>h>>w>>n;
    repd(i,1,n)
    {
        cin>>a[i].x>>a[i].y;
    }
    vector<ll> v;
    repd(i,1,n)
    {
        repd(j,0,8)
        {
            ll x=a[i].x+xx[j];
            ll y=a[i].y+yy[j];
            if(x>=1&&x+2<=h&&y>=1&&y+2<=w)
            {
//                cout<<x<<" "<<y<<endl;
                ll num=(x)*mod+y;
                v.push_back(num);
            }
        }
    }
    sort(ALL(v));
    v.push_back(-9ll);
    ll ww=1ll;
    ll ans0=(h-2ll)*(w-2ll);
    for(int i=0;i<v.size()-1;i++)
    {
//        db(v[i]);
        if(v[i]==v[i+1])
        {
            ww++;
        }else
        {
            ans[ww]++;
            ww=1ll;
            ans0--;
        }
    }
    cout<<ans0<<endl;
    repd(i,1,9)
    {
        cout<<ans[i]<<endl;
    }

    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ‘ ‘ || ch == ‘\n‘);
    if (ch == ‘-‘) {
        *p = -(getchar() - ‘0‘);
        while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) {
            *p = *p * 10 - ch + ‘0‘;
        }
    }
    else {
        *p = ch - ‘0‘;
        while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘) {
            *p = *p * 10 + ch - ‘0‘;
        }
    }
}

すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)

原文地址:https://www.cnblogs.com/qieqiemin/p/10713861.html

时间: 2024-10-28 10:58:52

すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)的相关文章

ARC 061D すぬけ君の塗り絵 set模拟

题意:H*W矩形 初始全部为白色,n次操作 将某个(a,b)涂黑,问3*3子矩形中,黑色个数为0~9分别有多少个? H*W<=1e9 n<=1e5. 按矩形的右下角来计数,(每个矩形可以按右下角来编号),填一个格子(a,b)右下角(a+i,b+j),包含它的有9个. set[i] 记录有多少个矩形被加i次,枚举i,(x,y)找到原来被加的次数 然后更新即可 O(N*100*logn) 直接用map统计也行 #include <bits/stdc++.h> using namespa

Snuke&#39;s Coloring 2-1

问题 H: Snuke's Coloring 2-1 时间限制: 1 Sec  内存限制: 128 MB提交: 141  解决: 59[提交][状态][讨论版][命题人:admin] 题目描述 There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper right corner at (W,H). Each of its sides is parallel to the x-axi

AtCoder 2316 思维题

题目链接:https://vjudge.net/problem/AtCoder-2316 题意:给你n个人的位置,每个人能往左跳一格或两格到无人的位置,跳到0位置,这个人消失.n个人消失组成一个排列,问有多少种排列. 感觉自己题目做得少也不是很聪明,这种手推规律或者说考验思维的题目还是很头疼啊. 最后看了zzh大佬非常简短的AC代码,又问了队友之后才终于懂了一丢丢,但是以后遇到怕是还是不会. 如果人是一个隔一个站的,也就是站在1 3 5 7 9...的位子上,那n个人就有 n! 种排列. 如果不

Coloring Game(思维题)

David has a white board with 2×N2 \times N2×N grids.He decides to paint some grids black with his brush.He always starts at the top left corner and ends at the bottom right corner, where grids should be black ultimately. Each time he can move his bru

csp退役前的做题计划1(真)

csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさんの数式 / Many Formulas [x] ARC061D すぬけ君の塗り絵 / Snuke's Coloring [x] ARC061E すぬけ君の地下鉄旅行 / Snuke's Subway Trip [x] ARC061F 3人でカードゲーム / Card Game for Three [

Beta—review阶段成员贡献分

小组名称:nice! 小组成员:李权 于淼 刘芳芳 韩媛媛 宫丽君 项目内容:约跑app 分数分配规则 个人贡献分=项目基础分*0.5+个人表现分*0.5 基本贡献分 个人表现分 个人总分 于淼 2.9 2.8 5.7 刘芳芳 2.5 2.4 4.9 韩媛媛 2.3 2.5 4.8 宫丽君 2.5 2.5 5 李权 2.3 2.3 4.6 总结:从此次作业分配中可以体现大家的积极性明显提,事实也是如此.特别体现在团队任务的完成上.举个例子:找别的组的bug时,每人负责一个组,而且找的很细心.

Debug阶段成员贡献分

小组名称:nice! 小组成员:李权 于淼 刘芳芳 韩媛媛 宫丽君 项目内容:约跑app 分数分配规则 个人贡献分=项目基础分*0.5+个人表现分*0.5 组员工作量: 韩媛媛:版本控制报告站立会议----11.15站立会议---11.16版本控制报告站立会议---11.27站立会议---11.28找新蜂团队的bug 宫丽君:找金州勇士团队的bug 于淼:找飞天小女警团队的bug 刘芳芳:找天天向上团队的bug软件需求规格所明书 上网查找有关出现地图闪退的原因,搜集相关解决问题资料 李权:找奋斗

final阶段团队贡献分分配

小组名称:nice! 小组成员:李权 于淼 刘芳芳 韩媛媛 宫丽君 项目内容:约跑app 分数分配规则 个人贡献分=项目基础分(占50%)+个人表现分(占50%) 组员工作量: 韩媛媛:完成可运行的地图功能,记录了站立会议. 刘芳芳:参与发布过程,测试代码,撰写了review(事后诸葛亮会议)报告,反馈了用户体验报告. 于淼:在发布过程描述了产品,帮助组长调试发布设备,反馈了用户体验报告. 李权:调试发布前的代码,上传到服务器,提供发布需要的设备,并参与发布. 宫丽君:查阅资料,协调团队工作.

Atcoder ABC 069 C - 4-adjacent D - Grid Coloring

C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement We have a sequence of length N, a=(a1,a2,-,aN). Each ai is a positive integer. Snuke's objective is to permute the element in a so that the following conditi