题目链接: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. 《Mysql 事务 - 隔离》

    一:事务概念 -  ACID(Atomicity.Consistency.Isolation.Durability,即原子性.一致性.隔离性.持久性) 二:事务产生的问题 - 多个事务同时执行的时候 ...

  2. php实现支付宝在线支付和扫码支付demo

    ### php实现支付宝在线支付和扫码支付demo 背景:在做一个公众号时增加了h5端,需要接入支付,非微信环境,选择了支付宝,以下简单记录下实现过程,并做了简单的封装,拿来即可使用,注意:本项目只是 ...

  3. Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归

    此处将抽象和结构.自定义函数.参数的使用.作用域.递归放在一起学习,看起来很怪是不是? 但实际上这几者之间是有紧密联系的,不然Python基础教程(第三版)的作者为什么会把它们放在一起哪?手动滑稽 好 ...

  4. 20190705-Python数据驱动之DDT

    DDT ddt 是第三方模块,需安装, pip install ddt DDT包含的装饰器 包含一个类装饰器@ddt和两个方法装饰器@data和@file_data 通常情况下,@data中的数据按照 ...

  5. vue.js移动端app:初始配置

    本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...

  6. 导入别的项目到我的eclipse上出现红色感叹号问题

        项目红色感叹号问题问题 一般我们在导入别的项目到我的eclipse上面会发现,项目上面有红色的错误     原因 因为我电脑上的 jdk版本和别人电脑jdk版本不一样,那么对于的jre版本也不 ...

  7. (四)lucene之文本域加权

    一.前言 1.1 应用场景 有时在搜索的时候,会根据需要的不同,对不同的关键值或者不同的关键索引分配不同的权值,让权值高的内容更容易被用户搜索出来,而且排在前面. 为索引域添加权是再创建索引之前,把索 ...

  8. 五、小程序wx:key中的关键字*this

    “保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如果是对象则不可以 data:{ array:[1,2,3,4,5], ob ...

  9. eclipse复制工作空间配置步骤

    多个workspace,把每个workspace的设置共享,省去每次都重新配置一次. 总结一下,复制工作空间配置步骤如下: [最好是在新的workspace创建项目之前操作] 1 使用eclipse新 ...

  10. Python 生成动态变量 调用动态变量

    动态生成变量: variable = locals() for i in range(10): variable['A'+str(i)] = 123 print(A8) 调用动态变量: v = loc ...