传送门: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;
}

  

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

  1. [COCI]coci2015/2016 nekameleoni

    题意: 初始数列,每个数都在1~k以内 支持两种操作:1.修改一个数,修改后的数在1~k内                           2.查询一个最短包含1~k的序列的长度 查询100000 ...

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

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

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

    传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)     Problem ...

  4. Google Codejam 2016 Round1A Problem C BFFs 简单图论

    链接 Google Codejam 2016 Round1A Problem C BFFs 题意 n个小朋友要坐成一个圈.每个小朋友心中都有一个Best Friend Forever.要保证每个人的左 ...

  5. 2016年蓝桥杯省赛A组c++第7题(图论)

    /* 有12张连在一起的12生肖的邮票,规格是3*4,即: 1111 1111 1111 现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连) */ /* 思路: 先将所有五个一组的情 ...

  6. 2016年蓝桥杯省赛A组c++第3题(图论)

    /* 有一个含有10个格子的图形,现用0~9填充,连续的数不能填充在相邻的格子中(包括对角线相邻). 现每个数只能填写一次,问有多少种填充方法? 0111 1111 1110 (1表示有格子,0表示没 ...

  7. NOIp 2016 总结

    NOIp 2016 总结 -----YJSheep Day 0 对于考前的前一天,晚自习在复习图论的最短路和生成树,加深了图的理解.睡得比较早,养足精力明日再战. Day 1 拿到题目,先过一边,题目 ...

  8. [深度学习大讲堂]从NNVM看2016年深度学习框架发展趋势

    本文为微信公众号[深度学习大讲堂]特约稿,转载请注明出处 虚拟框架杀入 从发现问题到解决问题 半年前的这时候,暑假,我在SIAT MMLAB实习. 看着同事一会儿跑Torch,一会儿跑MXNet,一会 ...

  9. 2016 Multi-University Training Contest 7

    6/12 2016 Multi-University Training Contest 7 期望 B Balls and Boxes(BH) 题意: n个球放到m个盒子里,xi表示第i个盒子里的球的数 ...

随机推荐

  1. c++程序书写原则

    1.头文件中声明类,数据变量声明为私有,函数声明为公有. 2.所有函数实现放在非main.cpp文件中. 3.main.cpp只写函数的调用接口.

  2. codeforces B. George and Round 解题报告

    题目链接:http://codeforces.com/contest/387/problem/B 题目意思:给出1-n个问题,以及要满足是good rounde条件下这n个问题分别需要达到的compl ...

  3. Facebook图片存储系统Haystack——存小文件,本质上是将多个小文件合并为一个大文件来降低io次数,meta data里存偏移量

    转自:http://yanyiwu.com/work/2015/01/04/Haystack.html 一篇14页的论文Facebook-Haystack, 看完之后我的印象里就四句话: 因为[传统文 ...

  4. 看 迪杰斯特拉(Dijsktra)算法体会

    迪杰斯特拉 看啊哈算法中迪杰斯特拉算法体会: 算法思路 : 1.先找到源头到其他点的最短路: 2.以最短路作为中转点进行比较,用一个dis数组保存源头到他的最优距离 3.用循环进行最优筛选: #inc ...

  5. 配置react+webpack+es6中的一些教训

    1.要用es6,因为目前浏览器的支持情况,那么肯定需要插件将e6的代码转换成es5,我用的是babel-loader,事实证明使用6.x版本似乎是不行的,我换成5.3.2之后就成功了. 2.webpa ...

  6. 谈谈javaScript

    谈谈javaScript  (杰我学习) 一. 什么是JavaScript       人们通常所说的JavaScript,其正式名称为ECMAScript.这个标准由ECMA组织发展和维护.ECMA ...

  7. java中的几种内部类

    Java中的几种内部类 内部类,听名字就可以知道是什么意思,就是类里面的类.有成员内部类,静态内部类,局部内部类和匿名内部类. 下面说一个每种内部类的的使用. 一.  成员内部类

  8. 【C/C++】计算两个整数的最大公约数和最小公倍数

    算法一 任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现. 则整数x,y可以分别标记为:x=p1x1p2x2...pmxm y=p1y1p2y2...pmym ...

  9. Linux下监控网卡流量的软件iftop

    官网上说使用iftop需要libpcap和libcurses这两个包. 用命令查找了一下 #  rpm -qa | grep libpcap libpcap-0.9.4-15.el5 只找到了这个,缺 ...

  10. linux 查看某进程 并杀死进程 ps grep kill

    Linux 中使用top 或 ps 查看进程使用kill杀死进程 1.使用top查看进程: $top 进行执行如上命令即可查看top!但是难点在如何以进程的cpu占用量进行排序呢? cpu占用量排序执 ...