dsrvuu Ioencgc_Aeionb
所谓的永别不见得只有死别一种
关注数: 25 粉丝数: 152 发帖数: 6,885 关注贴吧数: 178
因为一些疏忽这题弄了半天 # [NOIP2013 普及组] 车站分级 ## 题目描述 一条单向的铁路线上,依次有编号为 $1, 2, …, n $的 $n $个火车站。每个火车站都有一个级别,最低为 $1$ 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 $x$,则始发站、终点站之间所有级别大于等于火车站$ x$ 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点) 例如,下表是$ 5 $趟车次的运行情况。其中,前$ 4$ 趟车次均满足要求,而第 $5$ 趟车次由于停靠了 $3$ 号火车站($2$ 级)却未停靠途经的 $6$ 号火车站(亦为 $2$ 级)而不满足要求。 ![]() 现有 $m$ 趟车次的运行情况(全部满足要求),试推算这$ n$ 个火车站至少分为几个不同的级别。 ## 输入格式 第一行包含 $2$ 个正整数 $n, m$,用一个空格隔开。 第 $i + 1$ 行$(1 ≤ i ≤ m)$中,首先是一个正整数 $s_i(2 ≤ s_i ≤ n)$,表示第$ i$ 趟车次有 $s_i$ 个停靠站;接下来有$ s_i$个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。 ## 输出格式 一个正整数,即 $n$ 个火车站最少划分的级别数。 ## 样例 #1 ### 样例输入 #1 ``` 9 2 4 1 3 5 6 3 3 5 6 ``` ### 样例输出 #1 ``` 2 ``` ## 样例 #2 ### 样例输入 #2 ``` 9 3 4 1 3 5 6 3 3 5 6 3 1 5 9 ``` ### 样例输出 #2 ``` 3 ``` ## 提示 对于$ 20\%$的数据,$1 ≤ n, m ≤ 10$; 对于 $50\%$的数据,$1 ≤ n, m ≤ 100$; 对于 $100\%$的数据,$1 ≤ n, m ≤ 1000$。
有点烧脑,拓扑排序过了,其他人的并查集题解没太看懂 # [NOIP2015 提高组] 信息传递 ## 题目描述 有 $n$ 个同学(编号为 $1$ 到 $n$ )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 $i$ 的同学的信息传递对象是编号为 $T_i$ 的同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮? ## 输入格式 共$2$行。 第$1$行包含1个正整数 $n$ ,表示 $n$ 个人。 第$2$行包含 $n$ 个用空格隔开的正整数 $T_1,T_2,\cdots\cdots,T_n$ ,其中第 $i$ 个整数 $T_i$ 表示编号为 $i$ 的同学的信息传递对象是编号为 $T_i$ 的同学, $T_i \leq n$ 且 $T_i \neq i$ 。 ## 输出格式 $1$个整数,表示游戏一共可以进行多少轮。 ## 样例 #1 ### 样例输入 #1 ``` 5 2 4 2 3 1 ``` ### 样例输出 #1 ``` 3 ``` ## 提示 样例1解释 ![]() 游戏的流程如图所示。当进行完第$ 3$ 轮游戏后, $4 $号玩家会听到 $2$ 号玩家告诉他自己的生日,所以答案为 $3$。当然,第 $3$ 轮游戏后,$ 2 $号玩家、 $3$ 号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。 对于 $30\%$的数据, $n ≤ 200$; 对于 $60\%$的数据, $n ≤ 2500$; 对于$ 100\%$的数据, $n ≤ 200000$。
很暴力的算法,依然通过了,是不是数据太水了 题目: # [NOI2015] 程序自动分析 ## 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。 考虑一个约束满足问题的简化版本:假设 $x_1,x_2,x_3,\cdots$ 代表程序中出现的变量,给定 $n$ 个形如 $x_i=x_j$ 或 $x_i\neq x_j$ 的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:$x_1=x_2,x_2=x_3,x_3=x_4,x_4\neq x_1$,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。 现在给出一些约束满足问题,请分别对它们进行判定。 ## 输入格式 输入的第一行包含一个正整数 $t$,表示需要判定的问题个数。注意这些问题之间是相互独立的。 对于每个问题,包含若干行: 第一行包含一个正整数 $n$,表示该问题中需要被满足的约束条件个数。接下来 $n$ 行,每行包括三个整数 $i,j,e$,描述一个相等/不等的约束条件,相邻整数之间用单个空格隔开。若 $e=1$,则该约束条件为 $x_i=x_j$。若$e=0$,则该约束条件为 $x_i\neq x_j$。 ## 输出格式 输出包括 $t$ 行。 输出文件的第 $k$ 行输出一个字符串 `YES` 或者 `NO`(字母全部大写),`YES` 表示输入中的第 $k$ 个问题判定为可以被满足,`NO` 表示不可被满足。 ## 样例 #1 ### 样例输入 #1 ``` 2 2 1 2 1 1 2 0 2 1 2 1 2 1 1 ``` ### 样例输出 #1 ``` NO YES ``` ## 样例 #2 ### 样例输入 #2 ``` 2 3 1 2 1 2 3 1 3 1 1 4 1 2 1 2 3 1 3 4 1 1 4 0 ``` ### 样例输出 #2 ``` YES NO ``` ## 提示 【样例解释1】 在第一个问题中,约束条件为:$x_1=x_2,x_1\neq x_2$。这两个约束条件互相矛盾,因此不可被同时满足。 在第二个问题中,约束条件为:$x_1=x_2,x_1 = x_2$。这两个约束条件是等价的,可以被同时满足。 【样例说明2】 在第一个问题中,约束条件有三个:$x_1=x_2,x_2= x_3,x_3=x_1$。只需赋值使得 $x_1=x_2=x_3$,即可同时满足所有的约束条件。 在第二个问题中,约束条件有四个:$x_1=x_2,x_2= x_3,x_3=x_4,x_4\neq x_1$。由前三个约束条件可以推出 $x_1=x_2=x_3=x_4$,然而最后一个约束条件却要求 $x_1\neq x_4$,因此不可被满足。 【数据范围】 ![]() 注:实际上 $n\le 10^6$ 。
很暴力的算法, 没想到AC了 # [BOI2003]团伙 ## 题目描述 现在有 $n$ 个人,他们之间有两种关系:朋友和敌人。我们知道: - 一个人的朋友的朋友是朋友 - 一个人的敌人的敌人是朋友 现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。 ## 输入格式 第一行输入一个整数 $n$ 代表人数。 第二行输入一个整数 $m$ 表示接下来要列出 $m$ 个关系。 接下来 $m$ 行,每行一个字符 $opt$ 和两个整数 $p,q$,分别代表关系(朋友或敌人),有关系的两个人之中的第一个人和第二个人。其中 $opt$ 有两种可能: - 如果 $opt$ 为 `F`,则表明 $p$ 和 $q$ 是朋友。 - 如果 $opt$ 为 `E`,则表明 $p$ 和 $q$ 是敌人。 ## 输出格式 一行一个整数代表最多的团体数。 ## 样例 #1 ### 样例输入 #1 ``` 6 4 E 1 4 F 3 5 F 4 6 E 1 2 ``` ### 样例输出 #1 ``` 3 ``` ## 提示 对于 $100\%$ 的数据,$2 \le n \le 1000$,$1 \le m \le 5000$,$1 \le p,q \le n$。 #include #include #include #include #include #include #include #include #include #include #include #include #include #define usi unsigned int using namespace std; inline void mr(int& theNumberToRead) { theNumberToRead = 0; int prn = 1; char c = getchar(); while (!isdigit(c)) { if (c == '-')prn = -1; c = getchar(); }while (isdigit(c)) { theNumberToRead = 10 * theNumberToRead + c - 48; c = getchar(); }theNumberToRead *= prn; } int f[1001], n, m, p, q, ans; char opt; vectore[1001]; int fi(int k) { int r = k, t; while (r != f[r]) r = f[r]; while (k != r) t = k, k = f[k], f[t] = r; return r; } void jo(int a, int b) { int u = fi(a), v = fi(b); if (u != v) { --ans; f[u] = v; } } int main() { mr(n); mr(m); ans = n; for (int i = 1; i <= n; ++i) f[i] = i; while (m--) { opt = getchar(); while (!isalpha(opt)) opt = getchar(); mr(p); mr(q); if (opt == 'F') jo(p, q); else { e[p].push_back(q); e[q].push_back(p); } } for (int i = 1; i <= n; ++i) for (int j = 1, l = e[i].size(); j < l; ++j) jo(e[i][j - 1], e[i][j]); printf("%d", ans); return 0; }
首页 1 2 3 下一页