传送门

A - Password

输出\(n*n*n\)即可。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
cout << n * n * n;
}

B - Buffet

简单模拟。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 25;
int n;
int a[N], b[N], c[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cin >> b[i];
for(int i = 1; i < n; i++) cin >> c[i];
int ans = 0;
a[0] = -2;
for(int i = 1; i <= n; i++) {
ans += b[a[i]];
if(a[i] == a[i - 1] + 1) ans += c[a[i - 1]];
}
cout << ans;
}

C - Maximal Value

题意:

现在有\(n\)个数,每个数为\(a_i\),但你现在并不知道\(a\)。

现在给出\(n-1\)个数\(b_i\),满足\(b_i\geq max(a_i,a_{i+1})\),现在问\(\sum {a_i}\)最大的可能值为多少。

思路:

我们可以先只对两位分情况讨论一下:

  • 假设现在有\(b_i\leq b_{i+1}\),那么显然\(a_{i+1}\)只能为\(b_i\),要让和最大,那么\(a_i=b_i,a_{i+2}=b_{i+1}\);
  • 若\(b_i>b_{i+1}\),那么有\(a_{i+1}=b_{i+1},a_i=b_i,a_{i+2}=b_{i+1}\)。
  • 注意到不论哪种情况,都有\(a_i=b_i,a_{i+2}=b_{i+1},a_{i+1}\)为两者的最小值。

所以直接这样来搞就行了。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
int n;
int a[N], b[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i < n; i++) cin >> b[i];
int ans = 0;
for(int i = 2; i < n; i++) {
ans += min(b[i - 1], b[i]);
}
ans += b[1] + b[n - 1];
cout << ans;
}

D - Face Produces Unhappiness

题意:

现在给出一个只含\(L,R\)的序列,现在定义\(good pos\)为:假设当前为\(L\),其左边也为\(L\);或者当前为\(R\),其右边也为\(R\)。

现在你可以进行至多\(k\)次操作,每次操作可以选择一段区间将其翻转,注意是区间翻转\(180\)度,朝向和位置都会改变。

现在问最多可以有多少个\(goodpos\)。

思路:

  • 注意到每次翻转一段区间\([l,r]\),最多会多出\(2\)个\(goodpos\)。
  • 为什么?
  • 首先我们肯定会选择类似于这样的区间\(R[L\cdots L]R\)或者\(L[R\cdots R]L\)这样的才能最优,不然你翻转一下有啥用?
  • 并且又因为区间里面不会产生新的\(goodpos\),所以分析一下边界就行啦。
  • 也就是说每次会多两个\(goodpos\),会不会出现只多\(1\)个的情况呢?
  • 肯定会的,这时肯定翻转一次就全都一样的,所以最终答案就为\(min(n-1,now+2*k)\)。

实现起来还是很简单的~

Code
#include <bits/stdc++.h>
#define MP make_pair
using namespace std;
typedef long long ll;
const int N = 1e5 + 5; int n, k;
char s[N]; int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> k;
cin >> s + 1;
int ans = 0;
for(int i = 1; i <= n; i++) {
if(s[i] == s[i - 1] && s[i] == 'L') ++ans;
}
for(int i = n; i >= 1; i--) {
if(s[i] == s[i + 1] && s[i] == 'R') ++ans;
}
ans = min(n - 1, ans + 2 * k);
cout << ans;
}

E - Second Sum

题意:

定义\(X_{L,R}\)表示区间\([L,R]\)中第二大的数。

现在给出一个\(1\)~\(n\)的排列,求:

\[\sum_{L=1}^{N-1}\sum_{R=L+1}^N X_{L,R}
\]

思路:

  • 显然我们可以枚举每个数,并将其作为区间第二大数,然后看有多少个区间满足条件。
  • 然后我一开始写了个线段树\(T\)了...
  • 其实并不用,因为每次我们只需要用上比它大的数,所以我们从大的数往小搞,每次将其\(pos\)插入一个\(set\)里面就行了。
  • 之后直接在\(set\)里面二分,因为比它大的数的\(pos\)是具有单调性的。
  • 当我们找到区间右边比它大的两个位置和左边比它大的两个位置之后,直接统计答案即可。

细节见代码:

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 5; int n;
vector <pii> v; multiset <int> s; int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
int x; cin >> x;
v.push_back(MP(x, i));
}
s.insert(0), s.insert(0);
s.insert(n + 1), s.insert(n + 1);
sort(v.begin(), v.end());
reverse(v.begin(), v.end());
ll ans = 0;
for(auto i : v) {
int num = i.fi, p = i.se;
auto it = s.lower_bound(p);
int R1 = *it++;
int R2 = *it--;
--it;
int L1 = *it--;
int L2 = *it;
if(L1) ans += 1ll * num * (L1 - L2) * (R1 - p);
if(R1 <= n) ans += 1ll * num * (p - L1) * (R2 - R1);
s.insert(p);
}
cout << ans;
return 0;
}

F - Many Slimes

感觉这是一个很简单的贪心模拟题?

用\(vector+set\)模拟一下繁衍的过程即可,每次最大的数肯定产生比它小的最大的数,所以在\(vector\)中依次把数取出来,然后直接在\(set\)里面查找即可。

一开始写了个\(O(n)\)利用指针模拟的写法,但有两个点\(wa\)了...痛苦。

Code

AtCoder Beginner Contest 140的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

随机推荐

  1. UWP 在非UI线程中更新UI

    大家都知道,不可以在 其他线程访问 UI 线程,访问 UI 线程包括给 依赖属性设置值.读取依赖属性.调用方法(如果方法里面修改了依赖属性)等.一旦访问UI线程,那么就会报错,为了解决这个问题,需要使 ...

  2. java8新特性之——lambda表达式的使用

    lambda表达式简介 个人理解,lambda表达式就是一种新的语法,没有什么新奇的,简化了开发者的编码,其实底层还是一些常规的代码.Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解 ...

  3. R的获取和安装

    一.下载 R可以在CRAN(Comprehensive r archive network)http://cran.r-project.org上免费下载,可供选择的有Linux.Mac OS X和wi ...

  4. Navicat 软件的使用以及pymysql

    Navicat 软件的使用以及pymysql 一.navicate的安装及使用 下载 直接百度搜索navicate ,如下图 连接数据库 新建数据库以及新建表 选中然后鼠标右键 建模 利用navica ...

  5. MySQL创建、修改、删除数据库

    创建数据库 CREATE DATABASE [IF NOT EXISTS] t1 CHARACTER SET [=] utf8: 中括号中的代码可有可无:CHARATER如果不写则创建为默认的字符. ...

  6. Softmax用于手写数字识别(Tensorflow实现)-个人理解

    softmax函数的作用   对于分类方面,softmax函数的作用是从样本值计算得到该样本属于各个类别的概率大小.例如手写数字识别,softmax模型从给定的手写体图片像素值得出这张图片为数字0~9 ...

  7. cookie、localStorage 和 sessionStorage 的使用以及区别

    localStorage 和 sessionStorage 的增删改查: 存储数据: sessionStorage.setItem('key', 'sessionStorage的值'); // 存储数 ...

  8. Nim 游戏

    你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断 ...

  9. C语言程序设计100例之(18):火柴棒等式

    例18   火柴棒等式 用n根火柴棍,可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棒拼出的整数(若该数非零,则最高位不能是0).用火柴棒拼数字0~9的拼法如图1所示. 图1  用 ...

  10. RAC数据库的ORA-27123: Unable To Attach To Shared Memory Segment Linux-x86_64 Error: 22: Invalid argument

    RAC数据库的 ORA-27123: Unable To Attach To Shared Memory Segment Linux-x86_64 Error: 22: Invalid argumen ...