Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

文章目录

  • A - Tiny Arithmetic Sequence
  • B - Do you know the second highest mountain?
  • C - Secret Number
  • D - Game in Momotetsu World
  • E - Xor Distances
  • F - Insertion Sort

Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)

A - Tiny Arithmetic Sequence

if−elseif-elseifelse直接判

B - Do you know the second highest mountain?

sortsortsort排序

C - Secret Number

本来以为要计数DPDPDP/生成函数,但是仔细一看密码位数固定只有444位,直接暴力枚举判断

D - Game in Momotetsu World

考试时一直正着跑两人交替,总是错;考虑过倒着跑回去,但是没有实现出来(自己想要的效果)

每个人都是聪明的,都想尽可能拉开与对方的正差距,缩小与对方的负差距

ci,j−dpi,jc_{i,j}-dp_{i,j}ci,jdpi,j写得真的很妙

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 2005
int dp[maxn][maxn], c[maxn][maxn];
char s[maxn];
int n, m;int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) {scanf( "%s", s + 1 );for( int j = 1;j <= m;j ++ )c[i][j] = ( s[j] == '+' ? 1 : -1 );}for( int i = n;i;i -- )for( int j = m;j;j -- ) {if( i == n && j == m ) continue;else if( i == n ) dp[i][j] = c[i][j + 1] - dp[i][j + 1];else if( j == m ) dp[i][j] = c[i + 1][j] - dp[i + 1][j];else dp[i][j] = max( c[i + 1][j] - dp[i + 1][j], c[i][j + 1] - dp[i][j + 1] );}if( dp[1][1] > 0 ) printf( "Takahashi\n" );else if( dp[1][1] < 0 ) printf( "Aoki\n" );else printf( "Draw\n" );return 0;
}

E - Xor Distances

EEE竟然比DDD简单凸(艹皿艹 )eggs

di,j=dj,i⇒di,j=dk,i⨁dk,j=dk,i⨁dk,j⨁dx,k⨁dx,k=dx,i⨁dx,jd_{i,j}=d_{j,i}\Rightarrow d_{i,j}=d_{k,i}\bigoplus d_{k,j}=d_{k,i}\bigoplus d_{k,j}\bigoplus d_{x,k}\bigoplus d_{x,k}=d_{x,i}\bigoplus d_{x,j}di,j=dj,idi,j=dk,idk,j=dk,idk,jdx,kdx,k=dx,idx,j

两个点之间的最短距离异或等于任选一个点做超级点,超级点到两个点的最短距离异或和(不妨就设为111)

异或是二进制操作,各位独立,考虑拆解每一位iii

如果iii位有贡献2i2^i2i,那么一定是两个点到111的距离第iii位异或为10=11^0=110=1

所以拆开每位分别统计有多少个点的距离该位为111,乘法原理,任何一个都可以和该位不是111的任何一个组起来

#include <cstdio>
#include <vector>
using namespace std;
#define maxn 200005
#define int long long
#define mod 1000000007
vector < pair < int, int > > G[maxn];
int n;
int dep[maxn];void dfs( int u, int fa ) {for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;if( v == fa ) continue;else dep[v] = dep[u] ^ w, dfs( v, u );}
}signed main() {scanf( "%lld", &n );for( int i = 1, u, v, w;i < n;i ++ ) {scanf( "%lld %lld %lld", &u, &v, &w );G[u].push_back( make_pair( v, w ) );G[v].push_back( make_pair( u, w ) );}dfs( 1, 0 );int ans = 0;for( int j = 0;j < 60;j ++ ) {int cnt = 0;for( int i = 1;i <= n;i ++ )if( 1ll << j & dep[i] ) cnt ++;else;ans = ( ans + ( 1ll << j ) % mod * cnt % mod * ( n - cnt ) % mod ) % mod;}printf( "%lld\n", ans );return 0;
}

F - Insertion Sort

显然,对于每个数最多只会操作一次,假设不动数的集合为SSS,且S1<S2<...<SxS_1<S_2<...<S_xS1<S2<...<Sx

那么其必定满足posS1<posS2<...<posSxpos_{S_1}<pos_{S_2}<...<pos_{S_x}posS1<posS2<...<posSx且对于某个点i,i∉Si,i∉Si,i/S

  • i:Aii:A_ii:Ai
  • posi<S1:Bipos_i<S_1:B_iposi<S1:Bi
  • Sx<posi:CiS_x<pos_i:C_iSx<posi:Ci

dpi:Sdp_i:Sdpi:S中最大下标为iii时的最小操作数

dpi=min(∑j=1i−1min(Aj,Bj),min⁡j<i,posj<posi(dpj+∑k=j+1i−1Ak)dp_i=min(\sum_{j=1}^{i-1}min(A_j,B_j),\min_{j<i,pos_j<pos_i}(dp_j+\sum_{k=j+1}^{i-1}A_k)dpi=min(j=1i1min(Aj,Bj),minj<i,posj<posi(dpj+k=j+1i1Ak)

posipos_iposi建线段树,logloglog查询

最后的答案即为min(dpi+∑j=i+1nmin(Aj,Cj))min(dp_i+\sum_{j=i+1}^nmin(A_j,C_j))min(dpi+j=i+1nmin(Aj,Cj))

#include <cstdio>
#include <iostream>
using namespace std;
#define inf 1e15
#define maxn 200005
#define int long long
int n;
int P[maxn], A[maxn], B[maxn], C[maxn];
int Asum[maxn], Bsum[maxn], Csum[maxn], pos[maxn];
int dp[maxn], t[maxn << 2];void modfiy( int num, int l, int r, int p, int v ) {if( l == r ) {t[num] = v;return;}int mid = ( l + r ) >> 1;if( p <= mid ) modfiy( num << 1, l, mid, p, v );else modfiy( num << 1 | 1, mid + 1, r, p, v );t[num] = min( t[num << 1], t[num << 1 | 1] );
}int query( int num, int l, int r, int L, int R ) {if( L <= l && r <= R ) return t[num];int mid = ( l + r ) >> 1, ans = inf;if( L <= mid ) ans = min( ans, query( num << 1, l, mid, L, R ) );if( mid < R ) ans = min( ans, query( num << 1 | 1, mid + 1, r, L, R ) );return ans;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%lld", &P[i] );pos[P[i]] = i;}for( int i = 1;i <= n;i ++ )scanf( "%lld %lld %lld", &A[i], &B[i], &C[i] );for( int i = 1;i <= n;i ++ ) {Asum[i] = Asum[i - 1] + A[i];Bsum[i] = Bsum[i - 1] + min( A[i], B[i] );Csum[i] = Csum[i - 1] + min( A[i], C[i] );}int ans = inf;for( int i = 1;i <= n;i ++ ) {dp[i] = min( Bsum[i - 1], query( 1, 1, n, 1, pos[i] ) + Asum[i - 1] );ans = min( ans, dp[i] + Csum[n] - Csum[i] );modfiy( 1, 1, n, pos[i], dp[i] - Asum[i] );}printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

Rabbits UVALive - 8211

Rabbits UVALive - 8211 题意&#xff1a; n个兔子的位置&#xff0c;兔子每次可以跳到两个兔子之间&#xff0c;问最多可以跳多少下&#xff1f; 题解&#xff1a; 求出所有相邻两数的间隔&#xff0c;然后减去最小间隔就是答案 代码&#xff1a; #include <bits/std…

2.16模拟总结

前言 期望&#xff1a;100700170 实际&#xff1a;400040 rnk14 分全部挂没了&#xff0c;太行了。 T1不开longlong见祖宗&#xff0c;而且KH说的那个也有道理&#xff0c;带权之后树的重心可以不只有两个&#xff0c;所以最后还应该倍增的跳。&#xff08;然而这个地方题解似…

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举判断符合要求的求最小值即可 C - Unexpressed O(n)O(\sqrt{n})O(n​)枚举aaa&#xff0c;暴力翻倍&#xff08;最小的222最多乘323232次就会超过nnn的上…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…

YBTOJBZOJ:大根堆(启发式合并)

解析 如果到了链上&#xff0c;本题就是求LIS。 考虑LIS的常见队列做法&#xff0c;其本质就是维护长度为 xxx 的序列的结尾的最小值 qxq_xqx​。 那么在本题尝试如法炮制&#xff0c;对于每个节点&#xff0c;都开一个队列&#xff0c;qxq_xqx​ 表示子树内选了 xxx 个节点后…

Tree UVALive - 8212

Tree UVALive - 8212 题意&#xff1a; 有n个点&#xff0c;k个颜色&#xff0c;每个点都要被染色&#xff0c;相同颜色之间的边算是被该颜色覆盖&#xff0c;问有多少边被所有颜色覆盖 题解&#xff1a; 题目给的是无根树&#xff0c;我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章&#xff08;.NET Core开源行动&#xff1a;一键创建Excel Add-in&#xff09; 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库&#xff0c;你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…

NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

文章目录A - 2nd Greatest DistanceB - RGB MatchingC - Odd Even SortD - 1 or 2E - Directed TreeF - Logical Operations on TreeNOMURA Programming Contest 2021(AtCoder Regular Contest 121)A - 2nd Greatest Distance 大模拟讨论yyds 将点按x,yx,yx,y分别排序 xxx贡献…

F - Heron and His Triangle UVALive - 8206

F - Heron and His Triangle UVALive - 8206 题意&#xff1a; 给你应该n&#xff0c;然后求一个最小的t&#xff0c;问长度为t-1&#xff0c;t&#xff0c;t1所组成的三角形的面积为整数,t>n 题解&#xff1a; 这题我一开始被题目的-1给迷惑了&#xff0c;以为筛出所有…

YBTOJ:最短时间(长链剖分、线段树)

解析 不难得到最优策略&#xff1a;先尽可能的快的送死直到路径畅通无组&#xff0c;然后一口气冲到t点。 现在的难点就在于如何尽可能的快的送掉特定的次数。 不难发现&#xff0c;花费时间关于死亡次数的函数必然是一个下凸包。 设 fx,if_{x,i}fx,i​ 表示子树内距离 xxx 不…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)

文章目录descriptionsolutioncode【模板】k短路 / [SDOI2010]魔法猪学院description iPig 在假期来到了传说中的魔法猪学院&#xff0c;开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后&#xff0c;iPig 对猪世界的世界本原有了很多的了解&#xff1…

Infinite Fraction Path UVALive - 8207

Infinite Fraction Path UVALive - 8207 题意&#xff1a; 给你n个数&#xff0c;每个数在0到9之间&#xff0c;每个数的下标一次是0~n-1&#xff0c;然后他所能走到的数为(i^21)%n,i为他本身的下标&#xff0c;然后让你求走n步&#xff0c;每一步的数相连&#xff0c;形成的…

YBTOJ洛谷P4869:出现位置(线性基)

解析 关键结论&#xff1a; 若 nnn 个数组成的线性基大小为 SSS&#xff0c;则其子集异或组成的结果有 2S2^S2S 种&#xff0c;且每种结果都有 2n−S2^{n-S}2n−S 种方案。 证明&#xff1a;考虑 n−Sn-Sn−S 个没有加入线性基的元素的任意一个子集&#xff0c;其异或和为 xxx…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分&#xff0c;我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库&#xff0c;是针对Microsoft Graph开发的场景的&#xff0c;有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

2017 ICPC沈阳区域赛

2017 沈阳区域赛 题号题目难度知识点ABBP FormulaBBridgeCEmpty Convex PolygonsDDefense of the AncientsEFive-round Show HandFHeron and His Triangle铜牌题推式子思维GInfinite Fraction Path快银稳铜dfs剪枝HLegends of the Three KingdomsILittle Boxes签到题大数JNew …

YBROJ洛谷P3211:XOR和路径(线性基,期望dp)

解析 不难想到第一步利用期望线性性逐位考虑。 然后就变成求一个布尔变量的期望了&#xff0c;可以直接转化为求概率。 我一开始的想求从1出发异或和为0/1的概率&#xff0c;然而这个东西在原点1附近的转移特别别扭…老出现概率大于1的迷惑情况。 然后我就不会了 正解是反过…