A:msc和mas

Solved.

考虑斐波那契数列,即最多加45次即会超过1e9,直接暴力即可

 #include <bits/stdc++.h>
using namespace std; int a, b, l; int solve(int st)
{
int A = a, B = b;
while ()
{
if (st == )
{
if (A > l) return printf("Yes");
else
{
int B0 = B;
while (B < * B0) B += A;
}
}
else
{
if (B > l) return printf("No");
else
{
int A0 = A;
while (A < * A0) A += B;
}
}
st ^= ;
}
} int main()
{
while (scanf("%d%d%d", &a, &b, &l) != EOF)
{
solve(); putchar(' ');
solve(); putchar('\n');
}
return ;
}

B:msc和mcc

Solved.

考虑如果有一个区间满足,那么左右两边扩展区间肯定也是满足的

再考虑从左到右,如果$1-x满足,那么2-y满足的话, 显然有y >= x$

那么只需要双指针找到以i为左界,找到最近的右界,那么这个点的贡献就是n - r + 1

再考虑怎么判断是否合法

不难发现,只有mscmcc 和 mccmsc 两种情况,注意其中可以加入其他字符,但是最终取出的子序列都会归结到这两种情况 都判断一下即可

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 100010
int n;
char str[N];
set <int> m, s, c;
int st_m[], pos_s, pos_c[]; bool check1()
{
// mscmcc
if (s.upper_bound(st_m[]) == s.end()) return false;
pos_s = *s.upper_bound(st_m[]);
if (c.upper_bound(pos_s) == c.end()) return false;
pos_c[] = *c.upper_bound(pos_s);
if (c.upper_bound(max(st_m[], pos_c[])) == c.end()) return false;
pos_c[] = *c.upper_bound(max(st_m[], pos_c[]));
if (c.upper_bound(pos_c[]) == c.end()) return false;
return true;
} bool check2()
{
// mccmsc
if (c.upper_bound(st_m[]) == c.end()) return false;
pos_c[] = *c.upper_bound(st_m[]);
if (c.upper_bound(pos_c[]) == c.end()) return false;
pos_c[] = *c.upper_bound(pos_c[]);
if (s.upper_bound(st_m[]) == s.end()) return false;
pos_s = *s.upper_bound(st_m[]);
if (c.upper_bound(max(pos_s, pos_c[])) == c.end()) return false;
return true;
} bool ok()
{
if (m.size() < ) return false;
if (s.size() < ) return false;
if (c.size() < ) return false;
st_m[] = *m.begin(); m.erase(m.begin());
st_m[] = *m.begin(); m.insert(st_m[]);
if (check1()) return true;
if (check2()) return true;
return false;
} int main()
{
while (scanf("%d", &n) != EOF)
{
m.clear(); s.clear(); c.clear();
ll res = ;
scanf("%s", str + );
for (int i = , r = ; i <= n; ++i)
{
while (r < n && !ok())
{
++r;
if (str[r] == 'm') m.insert(r);
else if (str[r] == 's') s.insert(r);
else c.insert(r);
}
if (!ok()) break;
res += n - r + ;
if (str[i] == 'm') m.erase(i);
else if (str[i] == 's') s.erase(i);
else c.erase(i);
}
printf("%lld\n", res);
}
return ;
}

C:msc的宠物

Upsolved.

先二分答案,再DP求解最少需要删去的边数。

设$g[u] 表示 以 u 为根的子树下最少需要删去的边数,f[u][x] 表示以u为根的子树下u所处的连通块中点权最大值为x的情况下最少需要删去的边数$

$对于u 和 v  如果 a[u] < x 并且 a[v] < x 并且 abs(a[u] - a[v])  < x  那么 u 和 v 就可以同属一个连通块 $

$那么转移就是 f[u][x] += min(g[v] +1, f[v][x])$

其他情况的转移都是 $f[u][x] += g[v] +1$

最后 $g[u] = min(f[u][x])$

 #include <bits/stdc++.h>
using namespace std; #define N 1010
#define INF 0x3f3f3f3f
#define ll long long
int n, k, a[N], f[N][N], g[N]; ll x;
vector <int> G[N]; void dp(int u, int fa = )
{
for (auto v : G[u]) if (v != fa)
{
dp(v, u);
for (int i = ; i <= n; ++i)
{
if (a[u] <= a[i] && a[v] <= a[i] && abs(a[u] - a[v]) <= x)
f[u][i] += min(g[v] + , f[v][i]);
else
f[u][i] += g[v] + ;
}
}
for (int i = ; i <= n; ++i)
g[u] = min(g[u], f[u][i]);
} bool check()
{
memset(g, 0x3f, sizeof g);
for (int i = ; i <= n; ++i) for (int j = ; j <= n; ++j)
f[i][j] = (abs(a[i] - a[j]) <= x) ? : INF;
dp();
return g[] <= k;
} void Run()
{
while (scanf("%d%d", &n, &k) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", a + i);
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
ll l = , r = , res = -;
while (r - l >= )
{
x = (l + r) >> ;
if (check())
{
res = x;
r = x - ;
}
else
l = x + ;
}
printf("%d\n", res);
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}

D:msc的背包

Unsolved.

E:msc的序列

Unsolved.

F:msc的无向图

Unsolved.

Wannafly挑战赛28 Solution的更多相关文章

  1. Wannafly挑战赛28

    总结- A-开始觉得是找规律,最开始模拟当时我觉得如果L达到1e9的范围的话,岂不是要加1e9次,模拟也就没有认真写,现在想来,后面由于加的不再是1,而是我前面的值,这样相当了一个斐波那契的类型,而斐 ...

  2. [Wannafly挑战赛28][B msc和mcc][预处理+枚举]

    链接:https://ac.nowcoder.com/acm/contest/217/B来源:牛客网 msc和mcc 题目描述 msc和mcc是一对好朋友,有一天他们得到了一个长度为n的字符串s. 这 ...

  3. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

    Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...

  4. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  5. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  6. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  7. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  8. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

  9. Wannafly挑战赛25C 期望操作数

    Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...

随机推荐

  1. 前端 ui 框架

    Bootstrap:http://getbootstrap.com/css/ ant-design:https://ant.design/ weui:https://weui.io/ amazeui: ...

  2. Spring学习笔记--初始化和销毁Bean

    可以使用bean的init-method和destroy-method属性来初始化和销毁bean.定义一个Hero类: package com.moonlit.myspring; public cla ...

  3. CSDN专栏收集

     Android集 1.Himi李华明的<Android游戏开发专栏>http://blog.csdn.net/column/details/androidgame.html2.老罗的&l ...

  4. 【CSS系列】布局篇

    一.让设计居中 1.使用自动空白边让设计居中 <style type="text/css"> body{ text-align:center; min-width:76 ...

  5. UVa 673 Parentheses Balance (stack)

    题目描述 : 判断字符串是不是符合正确的表达式形式. 要点 : 考虑字符串为空的时候,用getline输入,每一次判断后如果为No则要清空栈.对称思想. 注意输入格式. 代码: #include &l ...

  6. Android 内存使用hprof文件打开方法

    http://blog.csdn.net/moruihong/article/details/7677128 与C++的内存不同,C++的内存泄露是由于分配了内存给某程序但是又没有回收造成的.Java ...

  7. spring全局变量引起的并发问题

    先看下面小段代码,一个controller,一个service. controller.java代码:    ........    @Autowired     private XXXService ...

  8. js对字符串进行加密和解密方法!

    在做一些微信小程序,或混合 app 的时候,或者是考虑到一些 JS 数据安全的问题.可能会使用到 JS 对用户信息进行缓存. 例如在开发:微信小程序对用户进行加密缓存,开发混合APP对用户信息进行加密 ...

  9. python range函数与numpy arange函数

    1.range()返回的是range object,而np.arange()返回的是numpy.ndarray() range尽可用于迭代,而np.arange作用远不止于此,它是一个序列,可被当做向 ...

  10. pandas处理日期时间,按照时间筛选

    pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面: 按日期筛选数据 按日期显示数据 按日期统计数据 运行环境为 windows系统, ...