Avito Cool Challenge 2018 Solution

A. Definite Game

签.

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int a;
 7     while (scanf("%d", &a) != EOF)
 8     {
 9         [](int x)
10         {
11             for (int i = x - 1; i >= 1; --i) if (x % i)
12             {
13                 printf("%d\n", x - i);
14                 return;
15             }
16             printf("%d\n", x);
17         }(a);
18     }
19     return 0;
20 }

B. Farewell Party

签。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define N 100010
 5 int n, a[N], b[N], cnt[N];
 6 vector <int> v[N];
 7 int ans[N];
 8
 9 bool ok()
10 {
11     for (int i = 1; i <= n; ++i) if (!v[i].empty() && v[i].size() != i)
12         return false;
13     return true;
14 }
15 void solve()
16 {
17     int cnt = 0;
18     for (int i = 1; i <= n; ++i) v[i].clear();
19     for (int i = 1; i <= n; ++i)
20     {
21         int id = n - a[i];
22         if (v[id].size() == id)
23         {
24             ++cnt;
25             for (auto it : v[id]) ans[it] = cnt;
26             v[id].clear();
27         }
28         v[id].push_back(i);
29     }
30     if (!ok())
31     {
32         puts("Impossible");
33         return;
34     }
35     else
36     {
37         for (int i = 1; i <= n; ++i) if (!v[i].empty())
38         {
39             ++cnt;
40             for (auto it : v[i])
41                 ans[it] = cnt;
42         }
43         puts("Possible");
44         for (int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
45     }
46 }
47
48 int main()
49 {
50     while (scanf("%d", &n) != EOF)
51     {
52         for (int i = 1; i <= n; ++i) scanf("%d", a + i);
53         solve();
54     }
55     return 0;
56 }

D. Maximum Distance

Upsolved.

题意:

有一张图

定义一条路径的长度的路径上边权最大值

定义两点距离为两点之间最短路径

有一些特殊点,要对所有特殊点求离它最远的特殊点

思路:

我们考虑一条边所连接的两个连通块里,如果这两个连通块里都有特殊点

那么这条边的权值就可以用于更新特殊点的答案

其实就是一个求最小生成树的过程,先按边权排序

要注意的是不是求整个图的最小生成树,而是所有特殊点的最小生成树

其实是最小瓶颈生成树.

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define N 100010
 5 int n, m, k;
 6 struct node
 7 {
 8     int u, v, w;
 9     void scan() { scanf("%d%d%d", &u, &v, &w); }
10     bool operator < (const node &other) const { return w < other.w; }
11 }edge[N];
12
13 int pre[N], cnt[N];
14 int find(int x) { return pre[x] == 0 ? x : pre[x] = find(pre[x]); }
15 int Kruskal()
16 {
17     sort(edge + 1, edge + 1 + m);
18     for (int i = 1; i <= m; ++i)
19     {
20         int u = edge[i].u, v = edge[i].v, w = edge[i].w;
21         int fu = find(u), fv = find(v);
22         if (fu == fv) continue;
23         cnt[fv] += cnt[fu];
24         pre[fu] = fv;
25         if (cnt[fv] == k) return w;
26     }
27 }
28
29 int main()
30 {
31     while (scanf("%d%d%d", &n, &m, &k) != EOF)
32     {
33         memset(pre, 0, sizeof pre);
34         memset(cnt, 0, sizeof cnt);
35         for (int i = 1, x; i <= k; ++i) scanf("%d", &x), cnt[x] = 1;
36         for (int i = 1; i <= m; ++i) edge[i].scan();
37         int res = Kruskal();
38         for (int i = 1; i <= k; ++i) printf("%d%c", res, " \n"[i == k]);
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/Dup4/p/10332497.html

时间: 2024-11-09 13:58:15

Avito Cool Challenge 2018 Solution的相关文章

Codeforces Avito Code Challenge 2018 D. Bookshelves

Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/D Description Mr Keks is a typical white-collar in Byteland. He has a bookshelf in his office with some books on it, each book has an integer positive

cf掉分记——Avito Code Challenge 2018

再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: //By Menteur_Hxy #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int n,ans; cha

[Avito Code Challenge 2018 G] Magic multisets(线段树)

题目链接:http://codeforces.com/contest/981/problem/G 题目大意: 有n个初始为空的‘魔法’可重集,向一个‘可重集’加入元素时,若该元素未出现过,则将其加入:否则该可重集中所有元素的个数都会翻倍. 例如将$2$加入${1,3}$会得到${1,2,3}$,将$2$加入${1,2,3,3}$会得到${1,1,2,2,3,3,3,3}$. $q$次操作,每次操作要么向一个区间内的所有可重集加入某个元素,要么询问一个区间内可重集的大小之和. $n,q ≤ 2×1

Avito Cool Challenge 2018 B - Farewell Party

题目大意: 有n个人 接下来一行n个数a[i] 表示第i个人描述其他人有a[i]个的帽子跟他不一样 帽子编号为1~n 如果所有的描述都是正确的 输出possible 再输出一行b[i] 表示第i个人的帽子的编号 如果存在矛盾 输出impossible 如果存在p 个人都描述有q个人跟他们的帽子不一样 此时若 p+q=n 说明正确且这p个人的帽子都一样 如 a[] = 3 3 2 2 2 ,此时一种解为 b[] = 1 1 2 2 2 存在p=2个人描述有q=3个人跟他们不一样 说明这两个人的帽子

Avito Cool Challenge 2018:C. Colorful Bricks

C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色与其左边的颜色不同(第一个除外),问一共有多少染色方案. 题解: 我们首先来考虑一下dp. 设dp(i,j)为当前第i个方块,一共有j个方块与它前面的方块不同的方案个数. 那么转移方程为dp(i,j)=dp(i-1,j-1)*(m-1)+dp(i-1,j). 代码如下: #include <bits

Avito Cool Challenge 2018 A. B题解

A. Definite Game 题目链接:https://codeforces.com/contest/1081/problem/A 题意: 给出一个数v,然后让你可以重复多次减去一个数d,满足v%d!=0,问最后可以得到最小的是多少. 题解: 除开v=2输出2,其余直接输出1就行了= =/ 代码如下: #include <bits/stdc++.h> using namespace std; int main(){ int v; cin>>v; cout<<(v==

Avito Cool Challenge 2018:D. Maximum Distance (最小生成树)

题目链接 题意 : 给出一个联通图和一些特殊的点,现在定义cost(u,v)为一条从u到v的路径上面边权的最大值 , 定义dis(u,v) 为从u到v 路径上面cost 的最小值 然后求所有特殊点到其他特殊点的最大距离 题解: 做这题前,首先思考一件事情,对于一颗树来说点到点的距离是不是就是树上面路径的边权最大值 我们来证明一下:假设在最小生成树上面的路径cost为w1,另外在原图中还有一条路径从u到v,其cost为w2,那么必然有w2>w1的.那么我们最后的dis一定是w1. 那么我们现在的目

Codechef October Challenge 2018 游记

Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小厨用了另外一种规则:双方每累计得 K 分才会交换发球权.比赛开始时,由大厨发球. 给定大厨和小厨的当前得分(分别记为 P1 和 P2),请求出接下来由谁发球. 思路: \((P1+P2)\%K\)判断奇偶性即可. 代码链接 BITOBYT - Byte to Bit 题目大意: 在字节国里有三类居民

June Challenge 2018 Division 2

Naive Chef 暴力 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() { 5 int T; 6 scanf("%d", &T); 7 while(T--){ 8 int N, A, B, x, ca = 0, cb = 0; 9 scanf("%d %d %d", &N, &A, &B); 10 for(int i = 1; i <