HFUT 1357.梯田AGAIN(安徽省2016“京胜杯”程序设计大赛 D)

梯田AGAIN

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submissions: 23 Accepted: 8

Description

大家还记得去年的梯田吗?土豪YZK在一块小岛上有着一大片n*m的梯田,每块1*1的田地都有它的高度。奴隶们不甘被YZK剥削,他们联合起来决定发动一场海啸淹掉YZK的部分梯田。

奴隶们去年尝试了一下,结果发现,由于土质太过松软,水能够透过土地渗入到相邻的梯田,即对于海啸高度h,梯田中所有小于等于h的土地都会由于土质松软而被被淹没。

现在给你一个n*m的矩阵,代表梯田中每块田地的高度。然后给定q个询问,每个询问给定一个海啸高度h,问在此高度下,不被淹没的梯田数量是多少。

Input

第一行一个整数T,表示测试数据组数。

对于每组测试数据:

第一行三个数字n,m,q,表示梯田的行数,列数和询问数。

之后n行,每行m个数字,表示每块田地的高度,梯田高度不大于1000000。

之后q行,每行给出一个海啸高度h,问大于这个高度的梯田有多少块。

0<T<20。

0<n,m<=200。

0<=q<1000。

0<=h<=1000000.

Output

对于每个询问,给出一个整数,表示大于这个海啸高度的梯田数量。

Sample Input

2
2 2 2
1 2
3 4
2
3
2 3 3
1 2 3
3 4 5
0
4
5

Sample Output

?2
1
6
1
0

题目比较容易理解,可以看出,整个梯田的大小可能是200*200,而询问的数量是1000,h的最大高度为1000000

因此,可以知道,在极限数据情况下,如果保存梯田中每块田的高度的话,会有大量的重复计算,会导致超时。

可以将每个高度的梯田的数目记录下来,采用记忆化搜索的方式来查询。

(比赛时的数据貌似比这个容易过)

AC代码:GitHub

 1 /*
 2 By:OhYee
 3 Github:OhYee
 4 HomePage:http://www.oyohyee.com
 5 Email:[email protected]
 6 Blog:http://www.cnblogs.com/ohyee/
 7
 8 かしこいかわいい?
 9 エリーチカ!
10 要写出来Хорошо的代码哦~
11 */
12
13 #include <cstdio>
14 #include <algorithm>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <iostream>
19 #include <vector>
20 #include <list>
21 #include <queue>
22 #include <stack>
23 #include <map>
24 using namespace std;
25
26 //DEBUG MODE
27 #define debug 0
28
29 //循环
30 #define REP(n) for(int o=0;o<n;o++)
31
32 const int maxh = 1000005;
33 int cnt[maxh];
34 int ans[maxh];
35
36 int Max = -1;
37
38 int Ans(int h) {
39     if(h > Max)
40         return 0;
41     if(ans[h] == -1)
42         ans[h] = cnt[h] + Ans(h + 1);
43
44     return ans[h];
45 }
46
47 void Do() {
48     memset(cnt,0,sizeof(cnt));
49     memset(ans,-1,sizeof(cnt));
50     Max = -1;
51
52
53     int n,m,q;
54     scanf("%d%d%d",&n,&m,&q);
55
56     for(int i = 0;i < n;i++)
57         for(int j = 0;j < m;j++) {
58             int temp;
59             scanf("%d",&temp);
60             Max = max(Max,temp);
61             cnt[temp]++;
62         }
63
64     REP(q) {
65         int h;
66         scanf("%d",&h);
67         printf("%d\n",Ans(h)-cnt[h]);
68     }
69 }
70
71 int main() {
72     int T;
73     scanf("%d",&T);
74     while(T--)
75         Do();
76     return 0;
77 }
时间: 2024-11-05 14:59:46

HFUT 1357.梯田AGAIN(安徽省2016“京胜杯”程序设计大赛 D)的相关文章

HFUT 1354.砝码称重(安徽省2016“京胜杯”程序设计大赛 A)

砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 12 Accepted: 10 Description 小明非常喜爱物理,有一天,他对物理实验室中常用的弹簧拉力计产生了兴趣.实验室中有两种质量不同的砝码,小明分别用a个第一种砝码放在弹簧拉力计上和b个第二种砝码放在弹簧拉力计上,假设每增加单位重量的砝码,弹簧拉力计的长度增加1,那么两次称量弹簧拉力计的长度差是多少呢?(假设拉力计不发生非弹性形变) Input 第

HFUT 1355.阵前第一功(安徽省2016“京胜杯”程序设计大赛 B)

阵前第一功 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 15 Accepted: 8 Description A国每个国民都有一定战斗力,每年国家都要对人民的战斗力进行一次排序统计,他们的排序规矩是相同战斗力的排名一样,而且只占一个排序名额.比如,有5个人:100,100,90,90,70. 两个100的并列第一,称为第一战斗力,两个90的并列第二,称为第二战斗力,依次类推...现在你想查询第K战斗力是多少 Inpu

HFUT 1356.转啊转(安徽省2016“京胜杯”程序设计大赛 E)

转啊转 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 25 Accepted: 8 Description 在二维平面上,有一个固定的圆和一个固定的点(保证该点不在圆上),还有一个动点在圆上以角速度w绕圆心一直转.在t时刻,连接该动点与定点成一条直线k,求直线k被圆所截线段的长度(即直线k在圆内部分长度).          动点初始时刻在圆的三点钟方向(即与x轴正方向平行),并以逆时针方向绕圆转.?    Input

HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图.换句 话说,将完全图每条边定向将得到一个竞赛图.下图展示的是一个有4个顶点的竞

HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))

最大的位或 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description B君和G君聊天的时候想到了如下的问题.给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大.其中|表示按位或,即C. C++. Java中的|运算. Input 包含至多10001组测试数据.第一行有一个正整数,表示数据的组数.接下

HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))

扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 998    Accepted Submission(s): 289 Problem Description 扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔.该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子可能处于己知和未知的状态

HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))

朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然

HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)

异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai}.对于这个序列的一个连续子序列{al,al+1,-,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C.C++. Java等语言中的^运算.小璐提出了M个询问,每个询问用

2016年中国大学生程序设计竞赛(杭州)1006 Four Operations

Four Operations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38    Accepted Submission(s): 18 Problem Description Little Ruins is a studious boy, recently he learned the four operations! Now