题目链接:https://codeforc.es/contest/1076

A. Minimizing the String

题意:给出一个字符串,最多删掉一个字母,输出操作后字典序最小的字符串。

题解:若存在一个位置 i 满足 a[i] > a[i+1],若不删除 a[i] 则后续操作不可能更优。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 2e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; char s[MAXN]; int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int n;
scanf("%d%s",&n,s);
int pos = n - ;
for(int i = ; i < n - ; i++) {
if(s[i] > s[i + ]) {
pos = i;
break;
}
}
for(int i = ; i < n; i++)
if(i != pos) printf("%c",s[i]);
return ;
}

B. Divisor Subtraction

题意:对于一个 n,每次减去它的最小质因子直到为 0,求操作次数。

题解:n <= 1e10,所以先筛出 1e5 以内的质因子,然后暴力找最小质因子,当最小质因子为 2 的时候,已经不存在更小的质因子,直接跳出循环即可。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 2e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; bool check[MAXN];
int prime[MAXN];
int tot; void init() {
mst(check, false);
tot = ;
for(int i = ; i <= 1e5; i++) {
if(!check[i]) prime[tot++] = i;
for(int j = ; j < tot; j++) {
if(i * prime[j] > 1e5) break;
check[i * prime[j]] = true;
if(i % prime[j] == ) break;
}
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
init();
ll n;
scanf("%lld",&n);
ll ans = ;
while(n) {
bool flag = false;
for(int i = ; i < tot && n >= prime[i]; i++) {
if(n % prime[i] == ) {
if(prime[i] == ) {
flag = true;
ans += n / ;
n = ;
break;
}
n -= prime[i];
ans++;
flag = true;
break;
}
}
if(!flag) {
ans++;
break;
}
}
printf("%lld\n",ans);
return ;
}

C. Meme Problem

题意:给出一个 d,求是否存在 a + b = d 且 ab = d。

题解:解一元二次方程,判一下无解的条件即可。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 2e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
cin >> t;
while(t--) {
int d;
cin >> d;
if(d < && d != ) {
cout << "N" << endl;
continue;
}
cout << "Y ";
long double a = sqrt(((long double)d * d - 4.0 * (long double)d) / 4.0) + (long double)d / 2.0;
long double b = (long double)d - a;
cout << fixed << setprecision() << a << ' ';
cout << fixed << setprecision() << b << endl;
}
return ;
}

D. Edge Deletion

题意:给出一个 n 个点 m 条边的图,问最多保留 k 条边的情况下,起点 1 到每个点的最短路不变的最多有多少个,输出保留的边。

题解:先对起点 1 跑一遍 dij,因为 n - 1 条边可以构成图的最短路,每条边产生对一个点的最短路,故跑 dij 时记录一下走当前这个点的边,跑 dfs 按顺序输出结果即可。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 3e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; struct edge {
int v,w,id;
}; vector<edge>g[MAXN];
bool vis[MAXN];
ll dis[MAXN];
vector<int>ans;
pii add[MAXN]; void dij(int s, int n) {
ll inf2 = 1e16;
for(int i = ; i <= n; ++i)
dis[i] = inf2, vis[i] = ;
dis[s] = ;
priority_queue<pair<ll, int> >q;
q.push(mp(, s));
for(; !q.empty();) {
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = ;
for(int j = , sz = g[u].size(); j < sz; ++j) {
int v = g[u][j].v;
int w = g[u][j].w;
int id = g[u][j].id;
if(dis[v] > dis[u] + w) {
add[v] = mp(u,id);
dis[v] = dis[u] + w;
q.push(mp(-dis[v], v));
}
}
}
} vector<pii>vec[MAXN];
int tot; void dfs(int u) {
vis[u] = true;
for(int i = ; i < vec[u].size() && tot; i++) {
int v = vec[u][i].first, id = vec[u][i].second;
if(vis[v]) continue;
printf("%d ",id);
tot--;
dfs(v);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i = ; i <= m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u].pb({v,w,i});
g[v].pb({u,w,i});
}
dij(,n);
for(int i = ; i <= n; i++) {
vec[i].push_back(mp(add[i].first,add[i].second));
vec[add[i].first].push_back(mp(i,add[i].second));
}
tot = min(n - ,k);
printf("%d\n",min(n - ,k));
mst(vis, false);
dfs();
return ;
}

E. Vasya and a Tree

题意:有一棵 n 个点的树,有 m 次操作(v,d,x),每次将以 v 为根且距离 v <= d 的点加上权值 x(初始权值为0),输出最后每个点的权值。

题解:考虑离线操作,把每个点作为根的操作存起来,dfs 记录当前深度所增加的权值,对于不可到达的深度,用一个数组来记录要减去的值,差分的思想,详见代码~

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 3e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; vector<int>vec[MAXN];
vector<pii>q[MAXN]; int h = -;
ll ans[MAXN],dep[MAXN],now = ; void dfs(int u,int fa) {
h++;
now += dep[h];
for(int i = ; i < q[u].size(); i++) {
int d = q[u][i].first, x = q[u][i].second;
now += x;
if(h + d + < MAXN) dep[h + d + ] -= x;
}
// cout << u << " " << fa << ":" << now << endl;
ans[u] += now;
for(int i = ; i < vec[u].size(); i++) {
int v = vec[u][i];
if(v == fa) continue;
dfs(v,u);
}
for(int i = ; i < q[u].size(); i++) {
int d = q[u][i].first, x = q[u][i].second;
now -= x;
if(h + d + < MAXN) dep[h + d + ] += x;
}
now -= dep[h];
h--;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int n;
scanf("%d",&n);
for(int i = ; i < n; i++) {
int u,v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
int m;
scanf("%d",&m);
while(m--) {
int v,d,x;
scanf("%d%d%d",&v,&d,&x);
q[v].push_back(mp(d,x));
}
dfs(,);
for(int i = ; i <= n; i++)
printf("%lld ",ans[i]);
return ;
}

F. Summer Practice Report

题意:一本书有 n 页,每页有 xi 个 0 和 yi 个 1,问存不存在每页的数字构成一个序列,连起来之后最多连续的 0 和 1 不超过 k。

题解:记录每一页组成序列之后,连续 1 和连续 0 的最小值,转移即可。因为一页中连续的 1 最多 k 个,所以可容纳的 0 的个数为 pre0 + k * x,记录这个数是否大于 0 即可判断是否合法,1 也同理。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 3e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; ll x[MAXN],y[MAXN]; int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int n;
ll k;
scanf("%d%lld",&n,&k);
for(int i = ; i <= n; i++) scanf("%lld",&x[i]);
for(int i = ; i <= n; i++) scanf("%lld",&y[i]);
ll nowx = -k, nowy = -k;
for(int i = ; i <= n; i++) {
nowx += x[i] - y[i] * k;
nowy += y[i] - x[i] * k;
if(nowx < -k) nowx = -k;
if(nowy < -k) nowy = -k;
if(nowx > || nowy > ) {
puts("NO");
return ;
}
}
puts("YES");
return ;
}

G. Array Game(待补)

题意:

题解:

Codeforces Educational Codeforces Round 54 题解的更多相关文章

  1. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  2. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  3. Codeforces Educational Codeforces Round 57 题解

    传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...

  4. Codeforces Educational Codeforces Round 5 E. Sum of Remainders 数学

    E. Sum of Remainders 题目连接: http://www.codeforces.com/contest/616/problem/E Description The only line ...

  5. Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法

    D. Longest k-Good Segment 题目连接: http://www.codeforces.com/contest/616/problem/D Description The arra ...

  6. Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集

    C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...

  7. Codeforces Educational Codeforces Round 5 B. Dinner with Emma 暴力

    B. Dinner with Emma 题目连接: http://www.codeforces.com/contest/616/problem/A Description Jack decides t ...

  8. Codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers 高精度比大小,模拟

    A. Comparing Two Long Integers 题目连接: http://www.codeforces.com/contest/616/problem/A Description You ...

  9. Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值

    E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...

随机推荐

  1. 从MongoDB及mysql 谈B/B+树

    一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点.B树是专门为外部存储器设计的,如磁盘,它对于读 ...

  2. Qt程序开机自动运行

    一.写入注册表需要管理员权限 1.开发中生成并运行程序需要写入注册表时,应该以管理员权限打开项目: 2.点击程序运行需要写入注册表,则应该以管理员权限打开此程序. 二.实现 void MoreSetW ...

  3. python笔记005-字符串-列表-元组

    目录 1 上次作业补充拓展... 1 1.1 进制转换... 1 1.2 类型判断... 1 2 今日学习内容... 2 2.1 格式化输出... 2 2.2 基本运算符... 2 2.2.1 算术运 ...

  4. diy操作系统 附录:常用命令

    ld -m elf_i386 as --32 gcc -m 16 o

  5. 解决 windows oracle ORA-01113和ORA-01110错误

    windows2008上的数据库版本为11.2.0.4.0,数据库打开为mount状态.报错如下: SQL> startup ORACLE instance started. Total Sys ...

  6. S04_CH01_搭建工程移植LINUX/测试EMMC/VGA

    S04_CH01_搭建工程移植LINUX/测试EMMC/VGA 1.1概述: 本章内容是在已经提供安装了VIVADO2015.4 的ubuntu系统下,进行.大家可以下周我们已经提供的虚拟机镜像,我们 ...

  7. redis键的排序操作

    命令名称:sort 语法:sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ ...

  8. HTTP协议探究(六):H2帧详解和HTTP优化

    一 复习与目标 1 复习 HTTP1.1存在的问题 HTTP2.0要兼容HTTP1.1 HTTP2.0的重要概念 分帧层 二进制:流 消息 帧 流的状态.优先级和并发 流量控制 服务器推送 首部压缩 ...

  9. C++虚函数【Java有虚函数吗?】

    1,简单介绍 定义在基类中的函数,子类必须对其进行覆写![必须对其进行覆写?!]——Java中的接口.Abstract方法中的抽象类也有这样的要求. C++中定义: virtual void deal ...

  10. .NET Core 发布部署问题

    运行环境      操作系统                  开发工具      frameworks     .Net Core SDK 版本             托管运行 本地        ...