Codeforces Edu Round 67 A-C + E
A. Stickers and Toys
考虑尽量先买\(max(s, t)\)个里面单独的。那么如果\(s + t > n\)那么\(s + t - n\)的部分就该把\(min(s, t)\)踢出来,这些多的只能合并到另外一个上面去,所以答案就是:$ max(s, t) - (s + t - n) + 1$。
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int n, s, t;
int main(){
int T; scanf("%d", &T);
while(T--){
scanf("%d%d%d", &n, &s, &t);
printf("%d\n", max(s, t) - (s + t - n) + 1);
}
return 0;
}
B. Letters Shop
二分答案。答案符合区间包括性(单调性),若\([1, x]\)可行,那么\([1, y] (x <= y <= n)\)必然也可行。
预处理前缀和,\(check()\)的时间复杂度可以降到\(O(26)\),那么总共程序的时间复杂度为\(O(mlogn)\)。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200010, M = 50010;
char s[N], t[N];
int n, m, sum[N][26], g[26], len;
//[1, x]这段可不可行
bool inline check(int x){
for(int i = 0; i < 26; i++)
if(sum[x][i] < g[i]) return false;
return true;
}
int main(){
scanf("%d%s%d", &n, s + 1, &m);
for(int i = 1; i <= n; i++){
for(int j = 0; j < 26; j++) sum[i][j] = sum[i - 1][j];
sum[i][s[i] - 'a']++;
}
for(int i = 1; i <= m; i++) {
for(int j = 0; j < 26; j++) g[j] = 0;
scanf("%s", t + 1);
len = strlen(t + 1);
for(int i = 1; i <= len; i++) g[t[i] - 'a']++;
int l = 1, r = n;
while(l < r){
int mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n", r);
}
return 0;
}
C. Vasya And Array
由于发现在线做法需要分类讨论,懒癌晚期就把信息进行了排序\(qwq\)。
不难发现,\(NO\)的情况就是\(0\)的信息属于\(1\)的子序列。但是如果直接处理,就有多种冲突可能,\(check\)就需要分类讨论了。先处理\(1\)的数据,再处理\(0\)的数据,就只需要检查\(0\)是不是子区间就可以了。
关于方案,设\(f[i]\)为\(i\)和\(i + 1\)的关系(不变还是递减),这样只需要顺次维护即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010, M = 1010;
int n, m, f[N];
//f[i] 表示 i 和 i + 1 的关系
struct Node{
int l, r, t;
}e[M];
bool inline cmp(Node x, Node y){
return x.t > y.t;
}
bool inline check(int l, int r, int t){
for(int i = l; i < r; i++)
if(f[i] == -1 || f[i] == t) return true;
return false;
}
int main(){
memset(f, -1, sizeof f);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
int t, l, r; scanf("%d%d%d", &t, &l, &r);
e[i] = (Node){l, r, t};
}
sort(e + 1, e + 1 + m, cmp);
for(int i = 1; i <= m; i++){
int l = e[i].l, r = e[i].r, t = e[i].t;
if((!check(l, r, t))) { puts("NO"); return 0; }
else for(int i = l; i < r; i++)
if(f[i] == -1)f[i] = t;
}
int last = n; printf("YES\n%d ", n);
for(int i = 1; i < n; i++)
if(f[i]) printf("%d ", last);
else printf("%d ", --last);
return 0;
}
E. Tree Painting
换根法。发现是一颗树。每次扩展的时候,假设时间倒流,发现是一个逐层逆推递进的过程。
对于任意两点\((u, v)\),除了他们的路径上的贡献外,所有外面的扩展是相同的。
设
\(f[u][0]\)为该点向下扩展的花费,包括\(u\)的花费
\(f[u][1]\)为改点向上扩展的花费,不包括\(u\)的花费
\(size[u]\)为以\(u\)为子树的大小
状态转移方程:
\(f[u][0] = size[u] + \sum_{(u , v)} f[v][0]\)
\(f[v][1] = (n - size[v]) + f[u][1] + (f[u][0] - size[u] - f[v][0]) (u , v)\)
答案:
\(max\{f[i][0] + f[i][1] + (n - size[i])\} (1 <= i <= n)\)
这里可以理解为两者均是时间倒流的产物,第一次扩展是先扩展下面的,所以需要计算首次合并。
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 200010, M = N << 1;
typedef long long LL;
int n, head[N], numE = 0;
LL f[N][2], size[N];
struct Edge{
int next, to;
}e[M];
void addEdge(int from, int to){
e[++numE].next = head[from];
e[numE].to = to;
head[from] = numE;
}
void dfs_(int u, int fa){
size[u] = 1;
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs_(v, u);
size[u] += size[v];
f[u][0] += f[v][0];
}
f[u][0] += size[u];
}
void dfs(int u, int fa){
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
f[v][1] = (n - size[v]) + f[u][1] + (f[u][0] - size[u] - f[v][0]);
dfs(v, u);
}
}
int main(){
scanf("%d", &n);
for(int i = 1; i < n; i++){
int u, v; scanf("%d%d", &u, &v);
addEdge(u, v); addEdge(v, u);
}
dfs_(1, 0);
dfs(1, 0);
LL ans = -1;
for(int i = 1; i <= n; i++)
ans = max(ans, f[i][0] + f[i][1] + (n - size[i]));
printf("%lld\n", ans);
return 0;
}
Codeforces Edu Round 67 A-C + E的更多相关文章
- Codeforces Beta Round #67 (Div. 2)
Codeforces Beta Round #67 (Div. 2) http://codeforces.com/contest/75 A #include<bits/stdc++.h> ...
- 【计算几何】 Codeforces Beta Round #67 (Div. 2) E. Ship's Shortest Path
读懂题意其实是模板题.就是细节略多. #include<cstdio> #include<cmath> #include<algorithm> using name ...
- Codeforces Beta Round #67 (Div. 2)C. Modified GCD
C. Modified GCD time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Educational Codeforces Round 67 D. Subarray Sorting
Educational Codeforces Round 67 D. Subarray Sorting 传送门 题意: 给出两个数组\(a,b\),现在可以对\(a\)数组进行任意次排序,问最后能否得 ...
- Educational Codeforces Round 67
Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
随机推荐
- Golang调度器GMP原理与调度全分析(转 侵 删)
该文章主要详细具体的介绍Goroutine调度器过程及原理,包括如下几个章节. 第一章 Golang调度器的由来 第二章 Goroutine调度器的GMP模型及设计思想 第三章 Goroutine调度 ...
- 医学AI论文解读 |Circulation|2018| 超声心动图的全自动检测在临床上的应用
文章来自微信公众号:机器学习炼丹术.号主炼丹兄WX:cyx645016617.文章有问题或者想交流的话欢迎- 参考目录: @ 目录 0 论文 1 概述 2 pipeline 3 技术细节 3.1 预处 ...
- Java(6)集合
一.Java集合框架概述 1.什么是集合 集合框架:用于存储数据的容器. 数组.集合等存储数据的结构,叫Java容器. 此时的存储,是指内存层面的存储,不涉及持久化的存储. 任何集合框架都包含三大块的 ...
- 应届生应聘阿里,腾讯,美团90%会被问到的Netty面试题!史上最全系列!
1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大.伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源 ...
- FL studio系列教程(十八):FL Studio输出监视面板讲解
在FL Studio编曲制作软件中输出监视器面板主要的功能是监视输出电平和波形以及频谱.下面大家就跟小编一起来认识下什么是FL Studio监视面板以及它的一些特征吧! 1.首先,我们来看一下输出监视 ...
- 牛逼哄哄的PageHelper分页插件到底是怎么实现的?网友:给我10分钟,给你写一个~
Hi,各位读者们 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. ...
- HDU4632 Palindrome subsequence
标签(空格分隔): 区间qp Palindrome subsequence \[求一个string的 回文子序列 的个数 \] 少废话,上代码. #include<bits/stdc++.h&g ...
- Dapr DotNet5 HTTP 调用
Dapr DotNet5 HTTP 调用 版本介绍 Dotnet 版本:5.0.100 Dapr dotnet 版本:0.12.0-preview01 注意: Asp.Net Core 项目中的 la ...
- 聊聊 ClassLoader 是如何查找资源的
ClassLoader作用 classloader这个写业务代码的童鞋们,应该很少用到,但是写框架的应该很熟悉.这个类负责Java底层的类的加载和查找,简单滴说Java 的所有类都是由它负责将clas ...
- P3287 [SCOI2014]方伯伯的玉米田
首先可以证明,一定存在一种最优解,每次选择的区间结尾都是 \(n\).因为如果某一个区间结尾不是 \(n\),将其替换成 \(n\) 仍然保持单调不下降.接着都按这个策略拔高玉米. 令 \(f_{i, ...