AtCoder Beginner Contest 188题解
A
题意
问\(x,y\)相差是否小于\(3\)
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
ll x,y;
int main(){
	scanf("%lld%lld",&x,&y);
	if(abs(y - x) < 3)
	puts("Yes");
	else
	puts("No");
}
B
题意
问两个向量的内积是否为\(0\)
照着题目模拟就行
#include<iostream>
#include<cstdio>
#define ll long long
ll n,a[10000006],b[10000006];
int main(){
	scanf("%lld",&n);
	for(int i = 1;i <= n;++i)
	scanf("%lld",&a[i]);
	ll sum = 0;
	for(int i = 1;i <= n;++i){
		scanf("%lld",&b[i]);
		sum += a[i] * b[i];
	}
	if(sum == 0)
	puts("Yes");
	else
	puts("No");
}
C
题意
\(2^n\)个人进行树状比赛,问最后获得第二名的人是谁
用类似于线段树的建树,最后对根节点\(1\)的两个子节点进行判断(比较的时候用键值,树上存的是编号)
#include<iostream>
#include<cstdio>
#define ll long long
#define mid ((l + r) >> 1)
ll n,a[1000005];
int val[(1000005) << 2];
void build(int now,int l,int r){
	if(l == r){
		val[now] = l;
		return ;
	}
	build(now * 2,l,mid);
	build(now * 2 + 1,mid + 1,r);
	if(a[val[now * 2]] > a[val[now * 2 + 1]])
	val[now] = val[now * 2];
	else
	val[now] = val[now * 2 + 1];
	return;
} 
int main(){
	scanf("%lld",&n);
	n = (1 << n);
	for(int i = 1;i <= n;++i)
	scanf("%lld",&a[i]);
	build(1,1,n);
	if(val[1] == val[2])
	std::cout<<val[3];
	else
	std::cout<<val[2];
}
D
题意
\(Takahashi\) 出去游玩,现在提供了\(n\)个项目,时间是\([a_i, b_i]\),这些项目每天分别需要花费\(c_i\),但它可以选择一天花费\(C\)元玩这天所有可玩项目,项目出现了他就一定要玩,求他的最少花费
考虑离散化,在离散后的数组上打差分标记,再对当前的钱数进行一个前缀和,对每一段判断是否取\(C\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long 
ll n,C;
ll a[200005],b[200005],c[200005],cnt;
ll num[800005],mark[800005];
unsigned ll now = 0,ans = 0;
int main(){
	scanf("%lld%lld",&n,&C);
	ll sum = 0;
	ll vsum = 0;
	for(int i = 1;i <= n;++i){
		scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
		num[++cnt] = a[i];
		num[++cnt] = b[i] + 1;
	}
	std::sort(num + 1,num + cnt + 1);
	cnt = std::unique(num + 1,num + cnt + 1) - num - 1;
	for(int i = 1;i <= n;++i){
		mark[std::lower_bound(num + 1,num + cnt + 1,a[i]) - num] += c[i];
		mark[std::lower_bound(num + 1,num + cnt + 1,b[i] + 1) - num] -= c[i];
	}
	num[0] = num[1] + 1;
//	for(int i = 1;i <= cnt;++i)
//	std::cout<<num[i]<<" "<<mark[i]<<std::endl;
	now = mark[1];
	for(int i = 2;i <= cnt;++i){
		//std::cout<<" "<<num[i - 1]<<" "<<num[i]<<" "<<now<<std::endl;
		if(now <= C)
		ans += (now) * (num[i] - num[i - 1]);
		else
		ans += C * (num[i] - num[i - 1]);
		now += mark[i];
	}
	std::cout<<ans<<std::endl;
}
E
题意
有向图,有点权,你可以在一个点上用点权买一块黄金,在再另一块你能到达的点上以点权卖出,问必须进行一次买卖的最大收益
我原本是进行一次\(dfs\)这样处理每个点的前缀最小值,但这样会在环上跑\(2\)次,我也这样\(T\)了一发
我们可以考虑按照点权的大小优先\(dfs\)这样最算有环也只用跑\(1\)次
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
ll n,m,cnt,ans = -0x3f3f3f3f;
ll head[200005];
ll val[200005],maxx[200005],minn[200005];
int vis[200005];
struct K{
	ll val,num;
}p[200005];
struct P{
	ll to,next;
}e[400005];
void add(ll x,ll y){
	e[++cnt].to = y;
	e[cnt].next = head[x];
	head[x] = cnt;
}
void dfs(ll now){
	//std::cout<<now<<" "<<val[now]<<" "<<minn[now]<<std::endl;
	ans = std::max(val[now] - minn[now],ans);
	for(int i = head[now];i;i = e[i].next){
		if(!vis[e[i].to]){
		minn[e[i].to] = std::min(minn[now],val[now]);
		vis[e[i].to] ++ ;
		dfs(e[i].to);
		}
	}
}
bool operator < (K a,K b){
	return a.val < b.val;
}
int main(){
	memset(maxx,-0x3f,sizeof(maxx));
	memset(minn,0x3f,sizeof(minn));
	scanf("%lld%lld",&n,&m);
	for(int i = 1;i <= n;++i)
	scanf("%lld",&p[i].val),p[i].num = i,val[i] = p[i].val;
	for(int i = 1;i <= m;++i){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
	}
	std::sort(p + 1,p + 1 + n);
	for(int i = 1; i<= n;++i)
	if(!vis[p[i].num])
	dfs(p[i].num);
	std::cout<<ans<<std::endl;
}
F
题意
有\(x,y\),可以对\(x做+1,-1,*2\)的操作请问最少几次能到\(y\)
考虑进行记忆化搜索,以后这种没有太好思路的题都可以往搜索想
#include<iostream>
#include<cstdio>
#include<map>
#define ll long long
using std::map;
ll x,y;
map<ll,ll>QWQ;
ll solve(ll y){
	if(y <= x) return x - y;
	if(QWQ.count(y)) return QWQ[y];
	ll ans = y - x;
	if(y % 2) ans = std::min(ans,1 + std::min(solve(y - 1),solve(y + 1)));
	else
	ans = std::min(ans,1 + solve(y / 2));
	return QWQ[y] = ans;
}
int main(){
	scanf("%lld%lld",&x,&y);
	std::cout<<solve(y);
}
AtCoder Beginner Contest 188题解的更多相关文章
- AtCoder Beginner Contest 154 题解
		人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ... 
- AtCoder Beginner Contest 153 题解
		目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ... 
- AtCoder Beginner Contest 177 题解
		AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ... 
- AtCoder Beginner Contest 184 题解
		AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ... 
- AtCoder Beginner Contest 173 题解
		AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ... 
- AtCoder Beginner Contest 172 题解
		AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ... 
- AtCoder Beginner Contest 169 题解
		AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ... 
- AtCoder Beginner Contest 148 题解
		目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ... 
- AtCoder Beginner Contest 151 题解报告
		总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ... 
随机推荐
- 初学python-day3 元组
			day2 列表已更新! 
- 【UE4 C++】Slate 初探: Editor UI 与 Game UI
			概述 名词区分 Slate Slate 是完全自定义.与平台无关的UI框架 应用 可用于编辑器UI,编辑器的大部分界面都是使用 Slate 构建的 可做为游戏UI 可作为独立应用开发 只能 C++ 开 ... 
- 腾讯bugly产生bug定位行数不准解决方案
			定位不准是因为做了混淆导致行数与实际代码行数不对.解决方案是要上传符号表.下载地址https://bugly.qq.com/v2/downloads 下载好因为我打开文件的说明文件是空文件(可能工作人 ... 
- 浅析ReDoS的原理与实践
			转载于http://www.freebuf.com/articles/network/124422.html ReDoS(Regular expression Denial of Service) 正 ... 
- RabbitMQ设计原理解析
			背景 RabbitMQ现在用的也比较多,但是没有过去那么多啦.现在很多的流行或者常用技术或者思路都是从过去的思路中演变而来的.了解一些过去的技术,对有些人来说可能会产生众里寻他千百度的顿悟,加深对技术 ... 
- Beta-功能规格说明书
			项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.引言 1. 项目简介 项目团队:删库跑路对不队 项目名称:题士 项目内容 ... 
- 手把手教你学Dapr - 2. 必须知道的概念
			Sidecar 边车 Dapr API提供Http和gRPC两种通讯方式. 运行方式则可以是容器也可以是进程(Windows开发推荐使用Self Hosted,后续会解释). 这样的好处是与运行环境无 ... 
- 【做题记录】[NOIP2011 提高组] 观光公交
			P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ... 
- NOIP模拟86(多校19)
			T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ... 
- Logic strength modeling
			7.9 Verilog HDL提供了信号争用.双向通过门.电阻式MOS器件.动态MOS.电荷共享的精确建模,并通过允许标量净信号值具有全范围的未知值和不同强度级别或强度级别的组合来实现其他依赖于技术的 ... 
