Bob和Alice(1)

思路
模拟即可模拟即可模拟即可
时间复杂度:O1O1O1

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;signed main()
{string s , t ;cin >> s >> t ;int res = 0 ;fer(i,0,sz(s)-1){if(s[i] == t[i])res ++ ;}cout << res ;return 0;
}

Bob和Alice(2)

思路
模拟即可模拟即可模拟即可
时间复杂度:OnOnOn

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
const int N = 1e6 + 10 , M = 2010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;int n ;
int a[N] , b[N] , c[N] ;signed main()
{cin >> n ;fer(i,1,n) sf(a[i]) ;fer(i,1,n) sf(b[i]) ;fer(i,1,n-1) sf(c[i]) ;int res = 0 ;a[0] = -2 ;fer(i,1,n){res += b[a[i]] ;if(a[i] == a[i-1] + 1)res += c[a[i-1]] ;}cout << res ;}

Bob和Alice(3)

思路
对每一个i[1<=i<=n−1]对每一个i [1 <= i <= n - 1]对每一个i[1<=i<=n−1]
Bi>=max(Ai,Ai+1)B_i>=max(A_i,A_{i+1})Bi​>=max(Ai​,Ai+1​)

因此因此因此
B1>=max(A1,A2)B_1>=max(A_1,A_2)B1​>=max(A1​,A2​)
B2>=max(A2,A3)B_2>=max(A_2,A_3)B2​>=max(A2​,A3​)

Bn−1>=max(An−1,An)B_{n-1}>=max(A_{n-1},A_{n})Bn−1​>=max(An−1​,An​)

所以可以得到所以可以得到所以可以得到
A1<=B1A_1<=B_1A1​<=B1​
A2<=min(B1,B2)A_2<=min(B_1,B_2)A2​<=min(B1​,B2​)
A3<=min(B2,B3)A_3<=min(B_2,B_3)A3​<=min(B2​,B3​)

An−1<=min(Bn−2,Bn−1)A_{n-1}<=min(B_{n-2},B_{n-1})An−1​<=min(Bn−2​,Bn−1​)
An<=Bn−1A_n<=B_{n-1}An​<=Bn−1​

因此因此因此
A1<=B1A_1<=B_1A1​<=B1​
Ai<=min(Bi,Bi−1)[2<=i<=n−1]A_{i}<=min(B_i,B_{i-1})[2 <= i <= n - 1]Ai​<=min(Bi​,Bi−1​)[2<=i<=n−1]
An<=Bn−1A_n<=B_{n-1}An​<=Bn−1​

所以答案为所以答案为所以答案为
B1+Bn−1+∑i=2n−1min(Bi,Bi−1)B_1+B_{n-1}+\sum_{i=2}^{n-1}min(B_i,B_{i-1})B1​+Bn−1​+∑i=2n−1​min(Bi​,Bi−1​)
时间复杂度:OnOnOn

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
const int N = 1e6 + 10 , M = 2010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;int n ;
int a[N] ;
int b[N] ;signed main()
{  cin >> n ;fer(i,1,n-1) sf(b[i]) ;int s = b[1] ;fer(i,2,n-1)s += min(b[i] , b[i-1]) ;s += b[n-1] ;cout << s ;
}

Bob和Alice(4)

思路
先暴力求出前10项先暴力求出前10项先暴力求出前10项

我们可以发现我们可以发现我们可以发现
0=00 = 00=0
1=0+11 = 0 + 11=0+1
3=0+1+23 = 0 + 1 + 23=0+1+2
6=0+1+2+36 = 0 + 1 + 2 + 36=0+1+2+3
因此因此因此
答案为0+1+2+.....+n=n∗(n−1)2答案为0 + 1 + 2 + ..... +n=\frac{n*(n-1)}{2}答案为0+1+2+.....+n=2n∗(n−1)​
暴力找规律代码

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
inline void de(int x) {cout << x << "\n" ;}
inline void de2(int a , int b) {cout << a << " " << b << "\n" ;}
const int N = 1e6 + 10 , M = 2010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;signed main()
{fer(n,1,10){vector<int> v ;fer(i,1,n) v.pb(i) ;sort(all(v)) ;int res = 0 ;do{int s = 0 ;int k = 0 ;for(auto i : v){k ++ ;s += k % i ;}res = max(res , s) ;}while(next_permutation(all(v))) ;de2(n,res) ;}
}

AC代码AC代码AC代码
时间复杂度:O1O1O1

#include<bits/stdc++.h>
using namespace std;signed main()
{long long n ;cin >> n ;cout << n * (n - 1) / 2 ;
}

Bob和Alice(5)

思路
这题是这6道当中最难的一道了这题是这6道当中最难的一道了这题是这6道当中最难的一道了
难点在于首先要想到枚举答案难点在于首先要想到枚举答案难点在于首先要想到枚举答案
其次是边界问题其次是边界问题其次是边界问题

首先考虑暴力On2必定超时首先考虑暴力On^2必定超时首先考虑暴力On2必定超时
考虑如何优化考虑如何优化考虑如何优化
我们发现答案一定是从1到n我们发现答案一定是从1到n我们发现答案一定是从1到n
对每一个答案x,我们如果可以用logn的时间求出有多少个区间的第二大值等于x对每一个答案x,我们如果可以用logn的时间求出有多少个区间的第二大值等于x对每一个答案x,我们如果可以用logn的时间求出有多少个区间的第二大值等于x
此题即迎刃而解此题即迎刃而解此题即迎刃而解

假设答案为x假设答案为x假设答案为x
它的下标为id它的下标为id它的下标为id


第一种情况第一种情况第一种情况
答案为x∗(RR−R)∗(id−L)答案为x * (RR - R) * (id - L)答案为x∗(RR−R)∗(id−L)
在[id,R]区间外面但是不超过[L,RR]区间在[id,R]区间外面但是不超过[L,RR]区间在[id,R]区间外面但是不超过[L,RR]区间
因此一共有(RR−R)∗(id−L)个区间满足第二大值等于x因此一共有 (RR - R) * (id - L)个区间满足第二大值等于x因此一共有(RR−R)∗(id−L)个区间满足第二大值等于x

同理同理同理

第二种情况第二种情况第二种情况
答案为x∗(L−LL)∗(R−id)答案为x * (L- LL) * (R - id)答案为x∗(L−LL)∗(R−id)

其实想到这一步不难其实想到这一步不难其实想到这一步不难
还剩下2个难题还剩下2个难题还剩下2个难题
第一个问题第一个问题第一个问题
如何用logn的时间之内找到左右两边比它大的下标如何用logn的时间之内找到左右两边比它大的下标如何用logn的时间之内找到左右两边比它大的下标

肯定是二分肯定是二分肯定是二分
怎么二分?怎么二分?怎么二分?
一个大致的想法是枚举的当前答案是x一个大致的想法是枚举的当前答案是x一个大致的想法是枚举的当前答案是x
左右2边的数都比它大左右2边的数都比它大左右2边的数都比它大

因此是不是可以从大到小枚举答案因此是不是可以从大到小枚举答案因此是不是可以从大到小枚举答案
然后依次在set里面插入下标然后依次在set里面插入下标然后依次在set里面插入下标
二分找到即可二分找到即可二分找到即可

第二个问题第二个问题第二个问题
LL,L,R,RR可能不存在LL,L,R,RR可能不存在LL,L,R,RR可能不存在
边界问题如何讨论?边界问题如何讨论?边界问题如何讨论?
最开始的时候插入0,0,n+1,n+1即可最开始的时候插入0,0,n+1,n+1即可最开始的时候插入0,0,n+1,n+1即可

感兴趣的可以推一下为什么感兴趣的可以推一下为什么感兴趣的可以推一下为什么

这题的细节问题是真的颇多这题的细节问题是真的颇多这题的细节问题是真的颇多
对码力要求和思维能力要求很高对码力要求和思维能力要求很高对码力要求和思维能力要求很高
一定要认真推一下所有的过程以及这题为什么要这么想一定要认真推一下所有的过程以及这题为什么要这么想一定要认真推一下所有的过程以及这题为什么要这么想
以及对时间复杂度有个清晰的认识以及对时间复杂度有个清晰的认识以及对时间复杂度有个清晰的认识
时间复杂度:OnlognOnlognOnlogn

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
const int N = 1e6 + 10 , M = 2010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;int n ;
int p[N] ;
int pos[N] ;signed main()
{cin >> n ;fer(i,1,n) sf(p[i]) , pos[p[i]] = i ;multiset<int> se ;int res = 0 ;se.insert(0) ;se.insert(0) ;se.insert(n + 1) ;se.insert(n + 1) ;der(i,n,1){auto x = i ;auto id = pos[x];auto r = *se.lower_bound(id) ;auto rr = *next(se.lower_bound(id));auto l = *prev(se.lower_bound(id));auto ll = *prev(se.lower_bound(id) , 2);res += ((id - l) * (rr - r) + (r - id) * (l - ll)) * x ;se.insert(id) ; }cout << res ;return 0;
}

Bob和Alice(6)

思路
其实思路就在题目中其实思路就在题目中其实思路就在题目中
按照题目说的模拟即可按照题目说的模拟即可按照题目说的模拟即可
一开始选的病毒的属性值一定是样例中最大的那一个一开始选的病毒的属性值一定是样例中最大的那一个一开始选的病毒的属性值一定是样例中最大的那一个
然后循环n秒然后循环n秒然后循环n秒
每次二分找到小于这个病毒属性值的最大的那一个病毒每次二分找到小于这个病毒属性值的最大的那一个病毒每次二分找到小于这个病毒属性值的最大的那一个病毒
然后把这个病毒删除然后把这个病毒删除然后把这个病毒删除
找不到说明不能满足题意找不到说明不能满足题意找不到说明不能满足题意
直接return0即可直接return0即可直接return0即可

因此题目涉及到删除及二分操作因此题目涉及到删除及二分操作因此题目涉及到删除及二分操作
可以用stl中的multiset完美解决可以用stl中的multiset完美解决可以用stl中的multiset完美解决
时间复杂度:OnlognOnlognOnlogn

#include <bits/stdc++.h>
#define fer(i,a,b) for(int i = a ; i <= b ; ++ i)
#define der(i,a,b) for(int i = a ; i >= b ; -- i)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
const int N = 1e6 + 10 , M = 2010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;int n ;
int s[N] ;
multiset<int> q ;
vector<int> a , b ;signed main()
{cin >> n ;fer(i,0,(1 << n) - 1) sf(s[i]) , q.insert(s[i]);auto it = --q.end() ;a.pb(*it) , q.erase(it) ;for(int i = 0 ; i < n ; i ++){for(auto j : a){auto it = q.lower_bound(j) ; if(it == q.begin()) { puts("No") ; return 0 ;}it -- ;b.pb(*it) , q.erase(it) ;}for(auto j : b) a.pb(j) ;b.clear() ;}puts("Yes") ;return 0;
}

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛(10)题解相关推荐

  1. 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 B: 跳蛙 - 题解

    传送门 分割 题目描述 输入描述 数据范围: 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:12 ...

  2. 2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 C: 剪切 - 题解

    传送门 分割 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 提示 题目分析 AC代码 分割 CMP 跳蛙 剪切 数学? 数学! 逃离 时间限制:1秒 空间限制:128M 题目描 ...

  3. 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(8)题解

    文章目录 问题 A: 鬼抓人 问题 B: 坠落之前 问题 C: 数据结构:树的子结点计数 问题 D: 糖果合并 问题 E: 幼儿园排座 问题 F: 简单路径计数 (((糖豆人小专题( •̀ ω •́ ...

  4. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 D: 点外卖 - 题解

    题意: 有 nnn 道菜,mmm 张券,券的作用是将任意一道菜的价格变为原来的一半(下取整),且允许叠加使用,问最少花费多少钱. 思路: 每一张券最优的使用方法一定是对当前价格最高的菜使用,那么这道题 ...

  5. 北京化工大学 2022-2023-1 ACM集训队每周程序设计竞赛(7)题解

    问题 A: 幸运数字 思路:直接把N当成字符串读入,循环判断是否有一位是7就可以了. #include <bits/stdc++.h>//#include<iostream>/ ...

  6. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 E: 祖玛的复仇 - 题解

    题意: 在长度为 n n n 的原字符串 S S S 找到中出现两次或两次以上的.相互之间没有重叠的连续子字符串的最大长度. 思路: 这道题的解法其实挺多的,大家可以之后多想下,我这里就只写一个最容易 ...

  7. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 A: 排火车 - 题解

    题意: S u n n y Sunny Sunny之后接 C l o u d y Cloudy Cloudy, C l o u d y Cloudy Cloudy之后接 R a i n y Rainy ...

  8. 2021-2022-2 ACM集训队每周程序设计竞赛(10) - 问题 A: 还原撕碎的字条,哄笑生气的毛毛 - 题解

    传送门 还原撕碎的字条,哄笑生气的毛毛 题目描述 输入描述 输出描述 样例一 输入 输出 样例二 输入 输出 样例三 输入 输出 题目分析 AC代码 还原撕碎的字条,哄笑生气的毛毛 还原撕碎的字条,哄 ...

  9. 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(11)题解

    文章目录 问题 A: 起名废柴 问题 B: 可视消息 问题 C: 虫洞旅行 问题 D: 整数化简分析 问题 E: 向量选取 问题 F: 勤劳的扫地机器人 问题 A: 起名废柴 根据题意,判断字符串 T ...

最新文章

  1. Android NDK 简单介绍、工具安装、环境配置
  2. 沙溪理工学校计算机,学雷锋树新风——沙溪理工学校计算机部开展学雷锋活动...
  3. NULL 值处理遇到的错误问题.
  4. STL——萃取机制(Traits)
  5. 【自定义控件】自定义属性
  6. 【学习笔记】浅谈广义矩阵乘法——动态DP
  7. asp.net html2canvas,Vue 结合html2canvas和jsPDF实现html页面转pdf
  8. Redis面试复习大纲在手面试不慌,讲的明明白白!
  9. numpy创建三维空数组_numpy数组的创建和属性转换
  10. WebApp 开发中常用的代码片段
  11. android market 选择
  12. Jedis问题解决方案大全:No more cluster attempts left
  13. Android:Activity(三):启动其他Activity并返回结果
  14. 微软Office Online服务安装部署(二)
  15. 调用接口登录禅道_干货,调用api获取禅道需求列表等
  16. Nitrux 图标主题与 Faenza 一样的设计 – 漂亮
  17. 【概率论与数理统计(研究生课程)】知识点总结6(抽样分布)
  18. 地下城与勇士(DNF)安图恩副本(黑雾之源、震颤的大地、舰炮防御战、擎天之柱、能量阻截战、黑色火山、安徒恩的心脏)(童年的回忆)
  19. Unity高质量场景打光参考资料
  20. 植物DNA甲基化专题 | nature:油棕Karma转座子表观遗传重要发现

热门文章

  1. poi多个模板实现文档合并
  2. 淘宝的直播视频怎么下载啊?有好的方法没有,越简单越好
  3. 2021海口高考调研成绩查询,2021年海口市高考调研测试附答案.doc
  4. treecnt 51Nod - 1677
  5. Arty A7-100(XC7A100TCSG324)开箱照
  6. 从零搭建 SpringCloud 服务
  7. 利用PRM-DUL工具恢复oracle dbf文件中的数据
  8. 互联网晚报 | 7月9日 星期六 |马斯克终止收购推特;​B 站回应 2 亿余条用户账号疑泄露传闻;上海逐步开放电影院和演出场所...
  9. “ 异常检测 ” 研究方向文章
  10. php单位有哪些,css中的角度单位有哪些?