题目简述

健佳是一个喜欢做游戏的小男生。当有人问问题时,他更喜欢通过玩游戏的方式作答,而不是直接回答。健佳碰到了他的朋友梅玉,跟她讲了台湾的航空网。在台湾有 $n$ 个城市(编号为 $0, \dots, n - 1$),其中有些城市之间有航线。每个航线连接两个城市,并且是双向的。

梅玉问健佳,是否任意两个城市之间都可以坐飞机互达(直接或间接),健佳不想直接回答,而是要通过做游戏的方式来告诉她。梅玉可以问"城市 $u$ 和 $v$ 之间有直接航线吗?",健佳会立刻直接回答该问题。梅玉会询问每对城市恰好一次,因此总计会有 $r = n(n - 1) /2 $ 个问题。如果由前 $i$($i < r$)个问题的答案可以推断出整个航空网是否连通,也就是说,是否任意一对城市之间都可以坐飞机互达(直接或间接),梅玉就获胜。否则意味着她需要知道全部 $r$ 个回答,此时健佳获胜。

为了让游戏更好玩,他们俩同意,健佳可以不要管台湾的真实航空网,而是可以随着游戏的进展而编造航空网,也就是根据梅玉此前的提问来决定此后如何作答。你的任务是,通过决定健佳如何回答,来帮助他赢得游戏。

任务

请写出一个可以帮助健佳获胜的程序。注意,无论是梅玉还是健佳,都不知道对方的策略。梅玉可以以任意的顺序来询问城市对,而健佳必须在不清楚后面提问的前提下立刻给出回答。你需要实现下面的两个函数:

  • initialize(n) —— 我们会先调用你的 initialize 函数。参数 $n$ 是城市数目。
  • hasEdge(u, v) —— 接着我们会调用 hasEdge 函数 $r = n(n - 1)/2$ 次。这些调用代表了梅玉的提问,顺序与她提问的次序相同。你必须回答在城市 $v$ 和 $u$ 之间是否有直接航线。具体而言,返回值 $1$ 表示有,$0$ 表示没有。

子任务

每个子任务包含若干个游戏。只有在你的程序帮助健佳赢得了某个子任务中的所有游戏之后,才能得到该子任务的分数。

子任务 分值 $n$
1 15 $n = 4$
2 27 $4 \leq n \leq 80$
3 58 $4 \leq n \leq 1500$

实现细节

本题只支持 C/C++。

你只能提交一个源文件实现上述的函数,其命名与接口需遵循下面的要求。你还要在该文件中包含头文件game.h。

void initialize(int n);
int hasEdge(int u, int v);

评测方式

评测系统将读入如下格式的输入数据:

  • 第 $1$ 行:$n$。
  • 余下 $r$ 行:每行包含两个整数 $u$ 和 $v$,表示对城市 $u$ 和 $v$ 的提问。

交互式类型的题目怎么本地测试

时间限制:$1\texttt{s}$

空间限制:$256\texttt{MB}$

下载

样例及测评库下载


真·水·构造题


一开始的想法是,尽量的使得两个联通块最后才联通,这样就能使得不到最后一步,整张图无法联通

那么,用并查集维护一下,每次\(O(n^2)\)查询一下涉及的两个联通块加入新的边以后是否完整了

完整了,那么要返回两条边联通,否在返回不连通

但这样的话,最后一部分数据是要TLE的

#include "game.h"
#include<cstring>
#include<cstdio> int fa[2010],a[2010][2010],N; int Find(int x)
{
return x==fa[x]?x:fa[x]=Find(fa[x]);
} void initialize(int n) {
N=n;
for (int i=0;i<n;i++)
fa[i]=i;
memset(a,0,sizeof(a));
} bool check(int x,int y,int n)
{
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (Find(i)==x && Find(j)==y)
if (!a[i][j]) return false;
return true;
} int hasEdge(int u, int v) {
a[u][v]=a[v][u]=1;
if (check(Find(u),Find(v),N)) {fa[Find(u)]=Find(v);return 1;}
else return 0;
}

然后发现....我可能制杖了啊

直接判断这条边是否是当前点连出的最后一条边即可

因为要保证每一个点都联通的话,至少存在一条边连入图中

这样的话,如果压个行,一行就解决了啊

#include "game.h"
#include<cstdio>
#include<cstring>
#include<iostream> int a[2010],N; void initialize(int n) {
memset(a,0,sizeof(a));N=n;
}
int hasEdge(int x, int y) {
if (x<y) std::swap(x,y);
a[x]++;
if (a[x]==x) return 1;else return 0;
}

【IOI2014】Game的更多相关文章

  1. [UOJ#24]【IOI2014】Rail

    #24. [IOI2014]Rail 台湾有一个连接着岛的东.西两岸的庞大的铁路线.这个铁路线包含有 mm 个区段.这些相连的区段以数字 0,…,m−10,…,m−1 为编号,且编号由西端开始.每一个 ...

  2. UOJ#24. 【IOI2014】Rail 交互题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ24.html 题解 我们将 C 型车站称为 左括号 '(', D 型车站称为右括号 ')' ,设括号 i 的位置为 p[i ...

  3. uoj#29. 【IOI2014】Holiday

    http://uoj.ac/problem/29 经过的点集一定是一个包含start的区间,为了经过这个区间内所有点,必须先到达一个区间端点,再到达另一个区间端点,剩余的步数则贪心选区间内最大价值的点 ...

  4. 【BZOJ4367】[IOI2014]holiday假期 分治+主席树

    [BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...

  5. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  9. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

随机推荐

  1. Solr 中的 docValues=true

    前言:  在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来 ...

  2. poj 2251 三维地图最短路径问题 bfs算法

    题意:给你一个三维地图,然后让你走出去,找到最短路径. 思路:bfs 每个坐标的表示为 x,y,z并且每个点都需要加上时间 t struct node{ int x, y, z; int t;}; b ...

  3. dedecms 标签

    article文章页标签 文档工具:http://tools.dedecms.com/dedetag_maker/article.html {dede:field.title/} 文章标题 {dede ...

  4. Nginx配置语法和日志

    nginx配置 配置文件 重启服务 http请求 nginx日志 一共有两个日志文件 在配置文件中添加这个,就可以在日志文件中看到请求的userAgent 配置语法的检查 nginx重新加载配置 发送 ...

  5. day08 多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

  6. Leetcode28--->字符串的匹配(KMP)

    题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长 ...

  7. day03_02 Python版本的选择

    总结:python2.x是遗产(过时),python3.x是现在和未来的语言 In summary : Python 2.x is legacy, Python 3.x is the present ...

  8. [整理]Linux下的源码安装步骤及其功能解释

    源码的安装一般由3个步骤组成:配置(./configure).编译(make).安装(make install). 这时最常用的命令就是这三个--./configure && make ...

  9. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  10. cssText批量修改样式

    cssText所有浏览器都支持. cssText 的使用 obj.style.cssText = " width:200px;position:absolute;left:100px;&qu ...