POJ3467(预处理)

Cross Counting

Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 1331   Accepted: 375

Description

Given a N × M grid with different colors on each cell, your task is to calculate the total amount of crosses of a specific color. We say there exists a cross of size
k centered at the cell (x,y) iff all cells lying in the
x-th row or the y-th column and within a distance of k from (x,y) share the same color. Note that if two crosses have the same center but different sizes we consider they are distinct. Unfortunately, the color of
each cell may varies by time and you have to respond to all the queries.

Input

There are four integers, N, M, C, Q, in the first line. (1 ≤
N, M, C ≤ 100, 1 ≤ Q ≤ 10000)

The next N lines each contains M integers between 1 and C which describe the color of cells.

The following Q lines each has either the form "C i j k" indicating to change the color of cell (i,
j) into k, or the form "Q c" indicating to query the total amount of crosses of color
c. (1 ≤ iN, 1 ≤ jM, 1 ≤ k,
cC)

Output

Output the answer to each query.

Sample Input

5 5 3 6
1 3 2 3 1
3 3 2 3 3
2 2 2 2 2
3 3 2 3 3
1 3 2 3 1
Q 1
Q 2
Q 3
C 2 3 3
C 3 2 3
Q 3

Sample Output

0
2
0
1

Source

POJ Monthly--2007.11.25, Yang Yi

题目看起来有线段树的味道,我线段树能力有限。

发现N,M都非常少,用O(N*M*(N+M))做预处理。

对于每次更新。改变的是十字架。所以更新须要O(N+M)个更新。

我在外层加了一层哨兵。写起来比較顺畅。

/***********************************************************
	> OS     : Linux 3.13.0-24-generic (Mint-17)
	> Author : yaolong
	> Mail   : [email protected]
	> Time   : 2014年10月15日 星期三 07时11分26秒
 **********************************************************/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int N = 205;
int mp[N][N];
int cnt[N][N];
int color[N];
void update ( int i, int j )
{
    cnt[i][j] = 0;
    for ( int k = 1;; k++ )
    {
        if ( mp[i + k][j] == mp[i][j] && mp[i - k][j] == mp[i][j] && mp[i][j + k] == mp[i][j] && mp[i][j - k] == mp[i][j] )
        {
            cnt[i][j]++;
        }
        else
        {
            return ;
        }
    }
}
int main()
{
    int n, m, c, q;
    while ( scanf ( "%d%d%d%d", &n, &m, &c, &q ) != EOF )
    {
        int i, j, k;
        memset ( color, 0, sizeof ( color ) );
        memset ( mp, 63, sizeof ( mp ) );
        memset ( cnt, 0, sizeof ( cnt ) );
        for ( i = 1; i <= n; i++ )
        {
            for ( j = 1; j <= m; j++ )
            {
                scanf ( "%d", &mp[i][j] );
            }
        }
        for ( i = 1; i <= n; i++ )
        {
            for ( j = 1; j <= m; j++ )
            {
                update ( i, j );
                color[mp[i][j]] += cnt[i][j];
            }
        }
        char tmp;
        while ( q-- )
        {
            scanf ( " %c", &tmp );
            if ( tmp == 'Q' )
            {
                scanf ( "%d", &i );
                printf ( "%d\n", color[i] );
            }
            else
            {
                scanf ( "%d%d%d", &i, &j, &k );
                if ( mp[i][j] == k )
                {
                    continue;
                }
                color[mp[i][j]] -= cnt[i][j];
                mp[i][j] = k;
                update ( i, j );
                color[mp[i][j]] += cnt[i][j];
                //cout<<cnt[i][j]<<" "<<i<<j<<endl;
                for ( int ak = 1; ak <= n; ak++ )
                {
                    if ( i != ak )
                    {
                        color[mp[ak][j]] -= cnt[ak][j]; //减掉
                        update ( ak, j );
                        color[mp[ak][j]] += cnt[ak][j];
                    }
                }
                for ( int ak = 1; ak <= m; ak++ )
                {
                    if ( j != ak )
                    {
                        color[mp[i][ak]] -= cnt[i][ak]; //减掉
                        update ( i, ak );
                        color[mp[i][ak]] += cnt[i][ak];
                    }
                }
            }
        }
    }
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-10 14:11:07

POJ3467(预处理)的相关文章

预处理指令

1.预处理指令 即编译之前执行的指令 C中的预处理指令包括:文件包含,宏定义,条件编译 2.文件包含#include <stdio.h> <>和""的区别 #include <file_1.h> //直接在C库函数头文件所在目录下找 #include "file_1.h" //先在main.c所在目录下找,若无到环境变量path路径中找,若无,到C库函数头文件所在目录中找 #include可能会导致重复包含文件,降低编译效率 解决

OC高效率52之多用类型常量,少用#define预处理指令

// //  ViewController.m //  OC高效率52之多用类型常量,少用#define预处理指令 /**  *     1. 不要用预处理定义常量.这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作.即时有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中得常量值不一致.        2.在实现文件中使用static const 来定义"只在编译单元内可见的常量".由于此类常量不在全局符号表中,所以无需为其名称加前缀.     

简单的预处理操作

运用opencv完成的基本的预处理操作 # -*- coding: UTF-8 -*-import cv2import numpy as np def recognition(img):    #灰度化    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    cv2.imshow('gray', gray)    cv2.waitKey(0) #二值化    ret, binary = cv2.threshold(gray, 109, 255, cv

数据预处理(完整步骤)

原文:http://dataunion.org/5009.html 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库需要对高质量的数据进行一致地集成)(3)原始数据中存在的问题:不一致 —— 数据内含出现不一致情况重复不完整 —— 感兴趣的属性没有含噪声 —— 数据中存在着错误.或异常(偏离期望值)的数据高维度二:数据预处理的方法(1)数据清洗 —— 去噪声和无关数据(2)数

unity平台的预处理(宏的定义)

在unity的跨平台中,我们常常会在各个平台游走,如安卓版,苹果版,PC版.在不同的平台上,我们要做不同的操作.然而我们可以使用unity的自带的宏定义来做平台的判断.Unity帮我们定义了例如以下平台预处理.(还有一些版本号的宏定义,这里没有写出来.) 我们使用#if #elif #endif进行宏命令的判断,unity会自己判断哪些条件成立,然后执行指定的代码.例子如下: 此外,我们还可以自己对宏命令进行定义:在edit-project settings-player中的设定栏可以添加属于自

POJ - 2253 Frogger(Floyd最短路+预处理)

题目链接:http://poj.org/problem?id=2253 题意:青蛙要从点1到点2,给出各点的坐标,如果点A到点B可以通过A->C,C->B,A到B的距离可以用A->C和C-B中较长的一边代替(如果A直接到B更短的话就不用了),求点1到点2的最短距离. 题解:本来想用dijkst,但是想想就200的数据量,直接Floyd岂不美滋滋.先预处理一下各点之间的距离.因为取两条边中较长的那条边,所以转移的话,那转移的两条边都要比原来的短才可以. 值得注意的是用C的格式输入的时候要用

机器学习系列(6)_从白富美相亲看特征预处理与选择(下)

作者:viewmode=contents">龙心尘 &&寒小阳 时间:2016年1月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50493845. http://blog.csdn.net/han_xiaoyang/article/details/50503115 声明:版权全部,转载请联系作者并注明出处 1. 剧情一:挑螃蟹的秘密 李雷与韩梅梅的关系发展得不错.趁国庆休假一起来天津玩. 今天,李雷十分

4、多用类型常量,少用#define预处理指令

摒弃: #define ANIMATION_DURATION 0.3 #define ERROR_MESSAGE @"ErrorMessage" 1)没有常量的类型信息 2)假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,都可以访问和修改ANIMATION_DURATION. 推荐: 1.私有常量 .m文件 static const NSTimeInterval kAnimationDuration = 0.3; static NSString *const kError

PHP:PDO prepare预处理

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念.它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它.预处理语句具有两个主要的优点: 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次.当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划.对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢.通过使用一个预处理语