Codeforces Round #414

A

=w=

B

qvq

C(贪心)

题意:

Alice和Bob分别有长度为n(n<=1e5)的字符串,Alice先手,每次从自己的字符串中抽出一个字母放到新字符串的某个位置,一共轮流n次,也就是说最后新字符串长度为n。Alice的决策时希望最后结果字典序最小,Bob则是希望最大,他们都是聪明的,请输出最后会得到怎样一个字符串。

分析:

先对A和B的字符串排序,A的字符串从小到大排序,B的字符串从大到小排序,并且舍去他们各自的后一半字符,这些肯定用不到

轮到A,A希望字符串字典序小

  1)最直观的贪心就是把我现在手里最小的甩到最前面

  2)但是考虑到一点,就是如果B手中所有字符比A手中最小的那个字符还要小,那其实A不需要把东西甩到最前面,最前面让B去补,那么结果会更小;所以就是如果遇见这种情况,那么A就把自己最大的一张丢到序列的最后面

轮到B,B希望字符串字典序打

  1)最直观的贪心就是把我现在手里最大的甩到最前面

  2)但是考虑到一点,如果B手中所有字符比A手中最小的那个还要小,那其实A不需要把东西甩前面,最前面让A去补,那么结果会更大;所以如果遇见这种情况,那么B就把自己最小的一张丢到序列最后面

具体实现就两个指针移一移

D(缩点)

题意:

给你一个联通的无向图(n<=3e5),你需要给每个点一个编号,要满足:任意一对相邻的点对,那么点的编号差<=1,;任意一对不相邻的点对,那么点的编号差>1

分析:

我们可以把那些“等价的点”全部编号设为一样的

什么样的点是等价的呢?

如果有一些点相邻的点(加上自己)都是一模一样的,那么它们就是等价的

具体来看,就是一个完全子图,他们的编号应该是一样的(除了连出去边的个边点)

所以可以对vector排序,挑出那些邻接表情况相同的点,全部缩点

然后很容易发现对于那些分叉的情况是没有解的,也就是所有点的度数必须<=2

那么度数<=2就是一个链或者一个环,经检验,环也是不符合的,只有链是符合的

输出方案就从链的一端直接从1开始递增填数字就行了

时间: 2024-10-18 19:59:32

Codeforces Round #414的相关文章

Codeforces Round #414 Div.2

A 膜你 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int main() { 6 int a, b, c, n, ans = 0; 7 scanf("%d %d %d", &a, &b, &c); 8 scanf("%d", &n); 9 for (int p, i = 0; i < n; ++i) { 10 sc

【贪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company

考虑两个人,先把各自的集合排个序,丢掉一半,因为比较劣的那一半一定用不到. 然后贪心地放,只有两种决策,要么把一个最优的放在开头,要么把一个最劣的放在结尾. 如果我的最优的比对方所有的都劣(或等于),我就把我最劣的往结尾放.否则我把我最优的往开头放. 用multiset维护两人的集合即可. #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

Codeforces Round #400 C 前缀和,思维

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals 题意:n个数,问有多少个区间的和是k的次方数,即sum([l, r])=k^x, x>=0. abs(k)<=10. tags:一开始O(n^2)统计,果然炸了.. 这题要在统计到第 i 个数时,看s[i]-k^x是否在前面出现过.因为k指数增长很快,这样就是O(n). // #400 #include<b

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd