[coci2015-2016 coii] dijamant【图论】

传送门:http://www.hsin.hr/coci/archive/2015_2016/

进去之后的最下面的国家赛。顺便说一句,dijamant是克罗地亚语的“钻石”的意思。

官方题解是说压位的暴力可以AC,但是给出了一个更棒的算法,是这样的:只考虑如何判断“diamond”,因为前两个子任务实在是太容易了。设Pi为当前声明的类继承的第i个类。那么当声明一个类时,先读取其继承的类,读进P,然后对P按“由刚刚声明的类到最早声明的类”排序,换句话说,就是从大到小排(当然了,如果使用stl的map,一定是越早成功声明的类,编号越小)。然后,维护一个布尔型的R数组,若Ri为true,表明当前正在声明的类可以从第i个类派生(derive)出来。那么分两种情况:

①,若Pi已经被标记,即R[Pi] = true,则直接ignore

②,若Pi未被标记,则将所有可以派生出Pi的类全部标记,并且如果某个可以派生出Pi的类已经被标记,则说明出现了一个diamond,声明类失败。

上述内容仔细想想、画画图就有了,确实挺巧妙的。

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <cstring>

const int maxn = 1005, maxe = 1000006;

int head[maxn], to[maxe], next[maxe], lb;
int n, P[maxn], idx, cnt;
char R[maxn];
std::string str, now;
std::map<std::string, int> mp;

inline void ist(int aa, int ss) {
	to[lb] = ss;
	next[lb] = head[aa];
	head[aa] = lb;
	++lb;
}
bool cmp(const int aa, const int ss) {
	return aa > ss;
}

int main(void) {
	freopen("dijamant.in", "r", stdin);
	freopen("dijamant.out", "w", stdout);
	memset(head, -1, sizeof head);
	memset(next, -1, sizeof next);
	std::cin >> n;
	char flag;
	int tem;
	int nn = n;
	while (nn--) {
		flag = 0;
		std::cin >> now;
		if (mp.count(now)) {
			std::cout << "greska\n";
			flag = 1;
		}
		std::cin >> str;

		if (flag) {
			while (1) {
				std::cin >> str;
				if (!strcmp(str.c_str(), ";")) {
					break;
				}
			}
			continue;
		}

		idx = 0;
		memset(R, 0, sizeof R);
		while (1) {
			std::cin >> str;
			if (!strcmp(str.c_str(), ";")) {
				break;
			}
			if (!flag) {
				if (!mp.count(str)) {
					flag = 1;
					std::cout << "greska\n";
				}
				else {
					P[idx++] = mp[str];
				}
			}
		}
		if (flag) {
			continue;
		}

		std::sort(P, P + idx, cmp);
		for (int i = 0; i < idx; ++i) {
			tem = P[i];
			if (R[tem]) {
				P[i] = -1;
				continue;
			}
			for (int j = head[tem]; j != -1; j = next[j]) {
				if (R[to[j]]) {
					flag = 1;
					std::cout << "greska\n";
					goto spe;
				}
				else {
					R[to[j]] = 1;
				}
			}
		}
		spe:;
		if (flag) {
			continue;
		}

		for (int i = 0; i < cnt; ++i) {
			if (R[i]) {
				ist(cnt, i);
			}
		}
		for (int i = 0; i < idx; ++i) {
			if (P[i] != -1) {
				ist(cnt, P[i]);
			}
		}
		std::cout << "ok\n";
		mp[now] = cnt;
		++cnt;
	}
	return 0;
}

  

时间: 2024-11-18 22:43:26

[coci2015-2016 coii] dijamant【图论】的相关文章

[COCI]coci2015/2016 nekameleoni

题意: 初始数列,每个数都在1~k以内 支持两种操作:1.修改一个数,修改后的数在1~k内                           2.查询一个最短包含1~k的序列的长度 查询100000,数列100000,k是50 题解 考虑压缩状态到一个二进制串. 用一个线段树.每个点维护前缀的状态,后缀的状态.被包含的最短的 然后如果暴力合并子树信息,这样是的,其实有用的状态不超过个.那么时间复杂度就是 合并子树的时候尺取. 就是.卡卡卡卡卡常大概好像就过了

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R

HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10    Accepted Submission(s): 3 Problem Description There are N bombs needing exploding. Each bomb has three attributes: exploding radius ri,

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个顶点的竞

NOIp 2016 总结

NOIp 2016 总结 -----YJSheep Day 0 对于考前的前一天,晚自习在复习图论的最短路和生成树,加深了图的理解.睡得比较早,养足精力明日再战. Day 1 拿到题目,先过一边,题目都很长,心中有些忐忑. T1是一道模拟,关键是对位置进行操作,题目比较水,,但我好像没处理好当取模为0的情况,因为0与等价,但输出的时候有特殊处理,估计会wa几个点.太不应该了. T2是一道图论的题目,还好昨晚复习了,有点基础.要想做出来显然不可能,我选择用深搜来遍历每条路,估计不是爆栈就是超时,但

2016年的总结

距离大一入学已经经过了两年半的时间,离我第一次接触C语言也过去了两年半.向王瑞洲(以下简称GodWang)请教字符串的读入.01背包的情景还历历在目,弹指一挥间,如今已是大三. 在高考结束的时候,莫名其妙的只想填计算机类的专业,也许是出于对编程的好奇,又或许是觉得会编程的人特别帅.在纠结了很久是选择计算机还是软件工程之后,我决定选择软件工程,因为我对硬件方面没有太大的兴趣.就这样,我和爸爸妈妈将全国带有软件工程专业的学校都找了出来,寻找自己能去的地方.最后,我来到了这里——浙江财经大学信息学院.

2016暑假多校训练参赛感想

参赛感想 这是第一次参加暑假多校训练,应该也会是人生中最后一次,我真的很庆幸能参加这个训练,和全国几乎所有高校的ACMer一起在一个平台上做题!昨天为止多校已经完全结束,今天看到叉姐的训练感想(叉姐的感想链接),我觉得我也有必要写下自己的训练感想. 人的眼界总是狭窄的,当在自己的学校站在前几名的时候觉得自己还不错,应该会有不错的将来,但是当第一次参加国赛(2015 南阳站)的时候我便被别人实力所震撼,我突然觉得自己在别人的眼里简直就是小学生,菜到不行.别人在5个小时可以AK,而我连最水的题也要想

联合训练图论场

联合训练图论场题解报告 传送门 A.Euler 题意:略 分析: 这题主要是先掌握欧拉通路的概念,然后是如何判断图是否存在欧拉通路. 欧拉通路:通过图中每条边且只通过一次,并且经过每一顶点的通路. 欧拉回路:通过图中每条边且只通过一次,并且经过每一顶点的回路. 无向图: 欧拉通路:连通图+只存在0个或者两个度数为奇数的点. 欧拉回路:连通图+所有节点的度数均为偶数. 有向图: 欧拉通路:连通图+(所有点的入度=出度 || 出两个点之外其他点的入度=出度,一个点的入度-出度=1,一个点的出度-入度