这题二话不说, 用map[i][j]表示坐标为i, j的点是什么颜色的.. 很快就写出来了, 但是内存超过了,, 内存最多16MB.
没办法, 只好另辟思路, 但是在数据压缩方面我又很弱, 就看标程也花了两三天的时间, 今天终于是看懂了..
用rect记录所有矩形的坐标以及相应的颜色.
程序具体的步骤如下:
输入A, B, N. 记录第一个矩形: (0, 0) (A, B), 颜色为1
接着读入其余的矩形, 设当前是第i个
对i之前所有的矩形迭代, 此时迭代到的是第j个.
判断i是否完全包含j, 即: i.x1 >= j.x1 && i.x2 >= j.x2 && i.y1 <= j.y1 && i.y2 >= j.y2..
若全包围的话, 将第j个矩形删除.
如果没包围的话, 就判断i会将j拆分成几个矩形, 并将j删除, 再分别拆分的矩形分别放入rect中.
/*
LANG: C
ID: zqy11001
PROG: rect1
*/
#include <stdio.h>
#include <string.h>
#define MAX 10001
#define getint(i) scanf("%d", &i)
#define loop(i, j, k, l)\
if(a.i l b.i){\
t = a;\
t.j = b.k;\
tmp[n++] = t;\
a.i = b.i;\
}
struct rect{
int t;
int x1, x2, y1, y2;
}rect[MAX];
int rr;
int color[2500];
int func(struct rect a, const struct rect b, struct rect *tmp)
{
int n;
struct rect t;
if(b.x1 >= a.x2 || b.x2 <= a.x1 || b.y1 >= a.y2 || b.y2 <= a.y1){
return 0;
}
if(b.x1 <= a.x1 && b.x2 >= a.x2 && b.y1 <= a.y1 && b.y2 >= a.y2){
return -1;
}
n = 0;
loop(x1, x2, x1, <=);
loop(x2, x1, x2, >=);
loop(y1, y2, y1, <=);
loop(y2, y1, y2, >=);
return n;
}
int main(void)
{
int n, nr, m;
int a, b, i, j, k;
struct rect t[4], cur;
freopen("rect1.in", "r", stdin);
freopen("rect1.out", "w", stdout);
getint(a);
getint(b);
getint(n);
rect[0].x1 = rect[0].y1 = 0;
rect[0].x2 = a;
rect[0].y2 = b;
rect[0].t = 1;
rr = 1;
for(i = 1; i <= n; i++){
scanf("%d%d%d%d%d", &rect[rr].x1, &rect[rr].y1,
&rect[rr].x2, &rect[rr].y2, &rect[rr].t);
cur = rect[rr++];
nr = rr - 1;
for(j = 0; j < nr; j++){
m = func(rect[j], cur, t);
if(!m){
continue;
}
if(m < 0){
memmove(rect + j, rect + j + 1,
sizeof(struct rect) * (rr - j - 1));
j--;
rr--;
nr--;
continue;
}
rect[j] = t[--m];
while(m--){
rect[rr++] = t[m];
}
}
}
memset(color, 0, sizeof(color));
for(i = 0; i < rr; i++){
color[rect[i].t - 1] += (rect[i].x2 - rect[i].x1) *
(rect[i].y2 - rect[i].y1);
}
for(i = 0; i < 2500; i++){
if(color[i]){
printf("%d %d\n", i + 1, color[i]);
}
}
return 0;
}
分享到:
相关推荐
Kruskal算法则是按照边的权重从小到大排序,每次添加一条不形成环的新边,直到所有顶点都在同一棵树中。 输入格式要求给出农场的数量N和一个N×N的距离矩阵,表示农场之间的距离。输出是所有农场间连接的最小光纤总...
做的很辛苦, 里面附有注释,大家支持一下吧...
USACO,全称为United States阿Olympiad in Informatics,是美国计算机奥林匹克竞赛,旨在为高中生提供一个学习和展示编程技能的平台。这个比赛涵盖了算法、数据结构以及问题解决等多个方面,对于想要深入理解计算机...
### USACO 2010-2011 季度竞赛概览与关键信息 #### 一、概述 美国计算机奥林匹克(USACO)是面向全球中学生的计算机科学竞赛,旨在发掘并培养计算机科学领域的年轻人才。USACO 2010-2011 季度竞赛于 2010 年 11 月...
USACO,全称为United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者的算法设计、问题解决和编程能力。该比赛每年举行,分为青铜、白银、黄金和铂金四个级别,难度逐渐递增。...
《USACO 合集:全面解析与学习指南》 USACO,全称为USA Computing Olympiad,是一项针对中学生举办的在线编程竞赛,旨在提升参赛者的算法设计和问题解决能力。这个合集提供了丰富的资源,包括英文原题、中文译题、...
USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者在算法设计、问题解决以及计算机科学基础方面的技能。这个压缩包文件提供了丰富的资源,帮助参赛者或学习者更好...
【标题】"usaco traning全部数据" 涉及的是一个编程竞赛训练平台——USACO(USA Computing Olympiad)的数据集。USACO是一个专门为美国中学生设计的在线编程竞赛,旨在提升参赛者的算法设计和编程能力,特别是在解决...
《USACO入门指南——第一章解析》 USACO,全称USA Computing Olympiad,是美国计算机奥林匹克竞赛,旨在培养中学生在算法和编程方面的技能。对于初学者来说,USACO提供了很好的学习路径和挑战。本文将针对USACO的第...
USACO(美国计算机奥林匹克竞赛)是面向全球中学生的一项编程竞赛,主要涉及算法和问题解决能力。这个压缩包文件“usaco历年测试数据”包含了该赛事历年的测试题目和样例输入输出数据,这对于参赛者准备比赛或者提升...
USACO,全称为United States Computer Olympiad,是一项面向中学生的国际性计算机编程竞赛,旨在提升参赛者的算法设计和编程能力。USACO比赛通常使用C++语言进行,因此"USACO 1.1 c++源程序"指的是USACO入门阶段1.1...
某些USACO题目的答案,很详细,代码清晰结构良好,算法高效易于调试
USACO,全称United States Computer Olympiad,是美国计算机奥林匹克竞赛,是一项旨在培养青少年编程技能和算法理解的国际性比赛。这个比赛对于有志于在计算机科学领域深入发展的学生来说,具有很高的学习价值和挑战...
### USACO心得及总结 #### 第一部分 动态规划 **USACO**(美国计算机奥林匹克竞赛)作为一项国际知名的编程竞赛,不仅考验参赛者的编程能力,还对其算法理解和应用有着极高的要求。其中,动态规划(Dynamic ...
USACO,全称United States阿Olympiad in Computer Science,是美国计算机科学奥林匹克竞赛,旨在激发中学生对计算机科学的兴趣,尤其是算法和编程技能。这个"USACO全部测试数据.zip"压缩包包含了历年来USACO比赛的...
USACO(USA Computing Olympiad)是美国计算机奥林匹克竞赛,是一项面向中学生的编程竞赛,旨在提升学生的算法设计、编程和问题解决能力。该比赛通常包括训练营和一系列在线比赛,最终选拔出优秀选手代表美国参加...
USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者的算法设计、编程能力和问题解决能力。本压缩包包含了USACO比赛的题解、源代码以及对应的中文翻译,对于想要...
《USACO全部测试数据详解》 USACO,全称United States Computer Olympiad,是美国计算机奥赛,是一项旨在提升青少年计算机编程能力的竞赛。该竞赛覆盖了基础算法、数据结构、问题解决等多个计算机科学的重要领域,...
USACO,全称为United States Computer Olympiad,是一项面向中学生的国际性计算机编程竞赛,旨在提升参赛者在算法设计、问题解决以及编程方面的技能。USACO比赛通常包含多个编程题目,参赛者需要使用C++、Java等语言...