[AtCoder Regular Contest 125] A-F全题解

文章目录

  • A - Dial Up
  • B - Squares
  • C - LIS to Original Sequence
  • D - Unique Subsequence
  • E - Snack
  • F - Tree Degree Subset Sum

网址链接

A - Dial Up

签到题

特判一下有没有0/1在目标串中出现而没在原串出现

除了第一次0/1数字互换时,需要从a1a_1a1左右找距离最近的不同数字

后面互换就是左/右转一次

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 200005
int n, m;
bool s0, s1, t0, t1;
int s[maxn], t[maxn];int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &s[i] );if( s[i] ) s1 = 1;else s0 = 1;}for( int i = 1;i <= m;i ++ ) {scanf( "%d", &t[i] );if( t[i] ) t1 = 1;else t0 = 1;}if( ( t1 and ! s1 ) or ( t0 and ! s0 ) )return ! printf( "-1\n" );int l = 0, r = 0;for( int i = n;i;i -- )if( s[i] == s[1] ) l ++;else { l ++; break; }for( int i = 1;i <= n;i ++ )if( s[i] == s[1] ) r ++;else break;int c = min( l, r ), now = s[1], ans = 0;bool flag = 0;for( int i = 1;i <= m;i ++ ) {if( now ^ t[i] ) {if( flag ) now ^= 1, ans ++;else now ^= 1, ans += c;flag = 1;}ans ++;}printf( "%d\n", ans );return 0;
}

B - Squares

简单题

x2−y=z2(x,y∈[1,n])x^2-y=z^2\quad \Big(x,y\in[1,n]\Big)x2y=z2(x,y[1,n])

(x+z)(x−z)=y(x+z)(x-z)=y(x+z)(xz)=y

observation : x+z x-z 同奇偶,且x+z >>> x-z

则有 x−z∈[1,n]x-z\in[1,\sqrt{n}]xz[1,n]

考虑枚举i=x−zi=x-zi=xz,计算出x+zx+zx+z的范围[1,⌊ni⌋]\big[1,\lfloor\frac{n}{i}\rfloor\big][1,in]

然后计算在范围内与iii同奇偶的个数

时间复杂度O(n)O(\sqrt n)O(n)

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define mod 998244353
int n, ans;signed main() {scanf( "%lld", &n );for( int i = 1;i * i <= n;i ++ ) {int l = i, r = n / i;if( ( i & 1 ) ^ ( l ^ 1 ) ) l ++;if( ( i & 1 ) ^ ( r ^ 1 ) ) r ++;if( l <= r ) ans = ( ans + ( r - l ) / 2 + 1 ) % mod;}printf( "%lld\n", ans );return 0;
}

C - LIS to Original Sequence

简单构造题

observation1 : a1a_1a1一定填在序列第一位

  • 如果a1=1a_1=1a1=1,填序列第一位是肯定的

  • 如果a1>1a_1>1a1>1,假设不填第一个,那么需要一个小于a1a_1a1的数填在前面,才会是最佳字典序

    但填在a1a_1a1前面,就会和a1,...,aka_1,...,a_ka1,...,ak构成更长的最长上升子序列,不满足条件,假设不成立

observation2 : 如果a1≠1a_1≠1a1=1,则a2a_2a2一定填111是最优的

  • 第一位都已经固定了,为了使答案字典序最小,肯定先放111,构成1,a2,...,ak1,a_2,...,a_k1,a2,...,ak的相同长度LIS\rm LISLIS

observation3 : 除去a1a_1a1111,出现了新的子问题,构造一个长度为n−2n-2n2的序列,LIS\rm LISLISa2,...,aka_2,...,a_ka2,...,ak

所以可以一位一位的递归构造,实际上遍历一遍即可构造

#include <cstdio>
#define maxn 200005
int a[maxn];
bool vis[maxn];
int n, k;int main() {scanf( "%d %d", &n, &k );for( int i = 1;i <= k;i ++ ) scanf( "%d", &a[i] );for( int i = 1, j = 1;i < k;i ++ ) {printf( "%d ", a[i] );vis[a[i]] = 1;while( j < a[i] and vis[j] ) j ++;if( ! vis[j] ) printf( "%d ", j ), vis[j] = 1;}for( int i = n;i;i -- )if( ! vis[i] ) printf( "%d ", i );return 0;
}

D - Unique Subsequence

DPDPDP简单题

observation : x......x****x****后面以xxx开头的任意子序列都不会成为答案

所以可以设计dpi:dp_i:dpi: 从后往前到i时以iii开始的答案,lstAi:lst_{A_i}:lstAi: AiA_iAi上一次的位置

dpi=∑j=i+1lstAidpjdp_i=\sum_{j=i+1}^{lst_{A_i}}dp_jdpi=j=i+1lstAidpj 并且dplstAidp_{lst_{A_i}}dplstAi要清零

最后答案就是∑idplsti\sum_i dp_{lst_i}idplsti

区间求和,单点修改可以用树状数组维护

#include <cstdio>
#define mod 998244353
#define int long long
#define maxn 200005
int n;
int f[maxn], t[maxn], lst[maxn], A[maxn];int lowbit( int i ) { return i & -i; }void add( int i, int val ) {for( ;i <= n;i += lowbit( i ) ) t[i] = ( t[i] + val + mod ) % mod;
}int query( int i ) {int ans = 0;for( ;i;i -= lowbit( i ) ) ans = ( ans + t[i] ) % mod;return ans;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &A[i] );for( int i = n;i;i -- ) {if( ! lst[A[i]] ) f[i] = ( query( n ) + 1 ) % mod;else f[i] = query( lst[A[i]] );if( lst[A[i]] ) add( lst[A[i]], -f[lst[A[i]]] );add( i, f[i] );lst[A[i]] = i; }int ans = 0;for( int i = 1;i <= n;i ++ )	ans = ( ans + f[lst[i]] ) % mod;printf( "%lld\n", ans );return 0;
}

E - Snack

困难题

一眼网络流

  • 超级源点SSS,超级汇点TTT,蛇Li,i∈[1,n]L_i,i\in[1,n]Li,i[1,n],人Rj,j∈[1,m]R_j,j\in[1,m]Rj,j[1,m]
  • ∀i,i∈[1,n]S→Li\forall_{i,i\in[1,n]} S\rightarrow L_ii,i[1,n]SLi,流量AiA_iAi
  • ∀i,i∈[1,n];j,j∈[1,m]Li→Rj\forall_{i,i\in[1,n];j,j\in[1,m]}L_i\rightarrow R_ji,i[1,n];j,j[1,m]LiRj,流量BjB_jBj
  • ∀j,j∈[1,m]Rj→T\forall_{j,j\in[1,m]}R_j\rightarrow Tj,j[1,m]RjT,流量CjC_jCj

求图的最大流即可

但是n,mn,mn,m级别根本不能支持网络流的算法

需要找一种可以不真的跑网络流的算法求最大流

转换一下,最大流等于最小割

将蛇LiL_iLi分成X,YX,YX,Y两个部分,XXX与超级源点在一个集合,YYY与超级汇点在一个集合

则每个人RjR_jRj就可以独立决定自己是在SSS集合还是TTT集合

  • SSS集合,就要断掉和TTT的边,花费CjC_jCj
  • TTT集合,就要断掉和XXX集合的所有边,花费集合大小的∣X∣⋅Bj|X|·B_jXBj
  • 选择两者中的较小值

重要的是XXX的划分,因此先决定XXX的划分

AiA_iAi的降序从LiL_iLi中选择用作XXX的定点

尝试所有的XXX,从0−N0-N0N

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
vector < int > G[maxn];
int n, m, sumB, sumC;
int A[maxn], B[maxn], C[maxn], sumA[maxn];signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &A[i] );for( int i = 1;i <= m;i ++ ) scanf( "%lld", &B[i] );for( int i = 1;i <= m;i ++ ) scanf( "%lld", &C[i] );sort( A + 1, A + n + 1 );for( int i = 1;i <= m;i ++ ) sumB += B[i];for( int i = 1;i <= n;i ++ ) sumA[i] = sumA[i - 1] + A[i];for( int i = 1;i <= m;i ++ ) G[min( n, C[i] / B[i] )].push_back( i );int ans = 1e18;for( int i = 0;i <= n;i ++ ) {ans = min( ans, sumA[n - i] + i * sumB + sumC );for( auto j : G[i] ) sumB -= B[j], sumC += C[j];}printf( "%lld\n", ans );return 0;
}

F - Tree Degree Subset Sum

困难题

did_idi表示iii点的度数−1-11,则度数范围为[0,n−2][0,n-2][0,n2]

定义fif_ifi : 度数和为iii时最小选取顶点的集合个数,gig_igi : 度数和为iii时最大选取顶点的集合个数

引理:∀fi≤y≤gi\forall_{f_i\le y\le g_i}fiygi,一定都有一种顶点选取方式满足度数和为yyy

假设这个引理是正确的

利用与abc-215 colorful candies 2的同样的思想

不同度数的个数最多有n\sqrt nn

设计DPDPDP转移出fif_ifiggg可以由fff推出

fi=min⁡{fi−sumd+cnt}f_i=\min\{f_{i-sumd}+cnt\}fi=min{fisumd+cnt}

可以用log\rm loglog倍增一段相同度数个数

最后gig_igi就相当于总个数减去度数和为s−is-isi的最小选取顶点的集合个数fs−if_{s-i}fsi

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 200005
#define int long long
struct node { int sumd, cnt;node(){}node( int Sumd, int Cnt ) {sumd = Sumd, cnt = Cnt;}
};
vector < node > g;
int n;
int d[maxn], f[maxn];signed main() {scanf( "%lld", &n );memset( d, -1, sizeof( d ) );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );d[u] ++, d[v] ++;}sort( d + 1, d + n + 1 );for( int i = 1, j = 1;i <= n;i = j ) {while( j <= n and d[i] == d[j] ) j ++;int cnt = j - i;for( int k = 1;k <= cnt;k <<= 1 ) {g.push_back( node( d[i] * k, k ) );cnt -= k;}if( cnt ) g.push_back( node( d[i] * cnt, cnt ) );}memset( f, 0x3f, sizeof( f ) );f[0] = 0; int sum = 0;for( auto now : g ) {sum += now.sumd;for( int i = sum;i >= now.sumd;i -- )f[i] = min( f[i], f[i - now.sumd] + now.cnt );}int ans = 0;for( int i = 0;i <= sum;i ++ )ans += max( ( n - f[sum - i] ) - f[i] + 1, 0ll );printf( "%lld\n", ans );return 0;
}

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

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

相关文章

DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

DotNetty 实现 Modbus TCP 系列 (一) 报文类DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例DotNetty 作为一个半成品&#xff0c;我们不需要关注细节的实现&#xff0c;只需要关注自己的业务即可&#xff0c;所以最主要的就是处理 Codecs 和 Handler。所有…

loj#2788-「CEOI2015 Day1」管道【树上差分】

正题 题目链接:https://loj.ac/p/2788 题目大意 给出nnn个点mmm条边的一张图&#xff0c;求它的所有割边。 1≤n≤105,1≤m≤61061\leq n\leq 10^5,1\leq m\leq 6\times 10^61≤n≤105,1≤m≤6106&#xff0c;内存限制16MB 解题思路 我们存不下所有的边&#xff0c;但是nnn很…

Acwing -- 单调队列优化的DP问题

文章目录引入acwing154 滑动窗口应用135 最大子序和1088.旅行问题AcWing 1087. 修剪草坪28AcWing 1089. 烽火传递AcWing 1090. 绿色通道AcWing 1091. 理想的正方形引入 acwing154 滑动窗口 题目链接 题解 应用 闫氏最优化问题分析法 135 最大子序和 题目&#xff1a; 输入…

模板:半平面交(计算几何)

所谓半平面交&#xff0c;就是和“半平先生”当面交谈。顾名思义&#xff0c;这是一个源于日本的算法。 &#xff08;逃&#xff09; 前言 感觉应用很灵活的一个算法&#xff0c;一切有两个变量的线性规划问题都可以转化为半平面交。 有时可能要注意取等问题&#xff08;指射…

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 文章目录A. Simply Strange SortB. Charmed by the GameC. Deep Down BelowD1/D2. Up the StripE. Bottom-Tier ReversalsF. Top-Notch InsertionsA. Simply Strange Sort 签到题&#xff0c;暴力做 …

[小技巧]C#中如何为枚举类型添加描述方法

背景在我们的日常开发中&#xff0c;我们会经常使用枚举类型。有时我们只需要显示枚举的值或者枚举值对应名称&#xff0c; 但是在某些场景下&#xff0c;我们可能需要将枚举值显示为不同的字符串。例&#xff1a; 当前我们有如下枚举Level这个枚举有4个可选值B, N, G, VG。 现…

Loj#3320-「CCO 2020」旅行商问题

正题 题目链接:https://loj.ac/p/3320 题目大意 有一张nnn个点的无向完全图&#xff0c;每一条边是红色或者蓝色&#xff0c;对于每个点sss求从这个点出发的一条尽量短的经过所有点的路径。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 显然地猜测一下最短的长度肯定是n…

AcWing 1087. 修剪草坪28

AcWing 1087. 修剪草坪 题意: 有n个数&#xff0c;不能选超过连续的k个数&#xff0c;问所能选的最大值是多少&#xff1f; 题解&#xff1a; 我们首先分析dp过程&#xff1a; dp[i]表示选择完前i个数的最大值 sum[i]表示前i项和 对于第i个数&#xff0c;它有两个情况&#…

洛谷P4463:calc(dp、拉格朗日插值)

Solution\text{Solution}Solution 神奇题目。 首先可以强制所有的数递增&#xff0c;最后的答案乘一个 n!n!n! 即可。 设 dpi,jdp_{i,j}dpi,j​ 表示在 [1,j][1,j][1,j] 的值域选了 iii 个数的答案&#xff0c;不难写出 dp 转移&#xff1a; dpi,jdpi−1,j−1jdpi,j−1dp_{i,j…

CF1710C-XOR Triangle【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1710C 题目大意 求有多少对0≤a,b,c≤n0\leq a,b,c\leq n0≤a,b,c≤n满足axorb,axorc,bxorca\ xor\ b,a\ xor\ c,b\ xor\ ca xor b,a xor c,b xor c作为边长时能构成一个非退化三角形。 n以二进制形式给出 1≤n<221051…

工业通信的开源项目 HslCommunication 介绍

前言&#xff1a;本项目的孵化说来也是机缘巧合的事&#xff0c;本人于13年大学毕业后去了一家大型的国企工作&#xff0c;慢慢的走上了工业软件&#xff0c;上位机软件开发的道路。于14年正式开发基于windows的软件&#xff0c;当时可选的技术栈就是MFC和C#的winform&#xff…

【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)

文章目录Gorgeous SequenceTyvj 1518 CPU监控【清华集训2015】VNaive OperationsPictureWalking RaceGorgeous Sequence HDU5306 操作 区间与xxx取min\rm minmin查询区间最大值查询区间和 比较暴力的线段树维护区间 Max : 区间最大值sub_max : 严格小于最大值的区间次大值…

Acwing 1089. 烽火传递

Acwing 1089. 烽火传递 题意&#xff1a; 有n个数&#xff0c;要保证每m个数中必须选一个&#xff0c;问所选数的最小总和是多少 题解&#xff1a; 我一开始设的状态为:dp[i]表示前i个数选完的最小值&#xff0c;第i个数可以选也可以不选&#xff0c;但是这样一个状态&…

CF886E Maximum Element(dp、组合数学)

Solution\text{Solution}Solution 纯纯的dp题。 关键在于我们 dp 时只关注不同元素之间的相对大小。 非法情况不易统计&#xff0c;考虑转而考虑合法情况再用全排列减。 设计 fif_ifi​ 为长度为 iii 的排列循环到一直最后也没有跳出的方案数。 枚举最大的元素 iii 放置的位置…

IIS作为ASP.NET Core2.1 反向代理服务器未说的秘密

--以下内容针对 ASP.NET Core2.1&#xff0c;2.2出现IIS进程内寄宿 暂不展开讨论---相比ASP.NET&#xff0c;出现了3个新的组件:ASP.NET Core Module、Kestrel、dotnet.exe&#xff0c; 后面我们会理清楚这三个组件的作用和组件之间的交互原理。 ASP.NET Core 设计的初衷是开源…

CF1710B-Rain【堆】

正题 题目链接:https://www.luogu.com.cn/problem/CF1710B 题目大意 一个数轴&#xff0c;每个位置上开始时都有一个ax0a_x0ax​0&#xff0c;nnn次操作pi,hip_i,h_ipi​,hi​对于所有位置axa_xax​令其变为axmax⁡(hi−abs(pi−x),0)a_x\max(h_i-abs(p_i-x),0)ax​max(hi​−…

数据结构之线段树Ⅴ——(李超线段树)Robot,Product Sum,Building Bridges,Jump mission

文章目录RobotProduct SumBuilding BridgesJump missionRobot BZOJ3938 机器人每次一旦改变速度&#xff0c;直到下一次改变速度为止 这一时间段内机器人的位置下标可以用一次函数表示 如果知道时刻t1t_1t1​即将改变速度的机器人位置&#xff0c;以及最近的下一次机器人速…

模板:拉格朗日插值(多项式)

所谓拉格朗日插值&#xff0c;就是在“拉格朗日”进行的一项民俗活动。拉格朗日通常在每年2月的第82个星期三。 &#xff08;逃&#xff09; 前言 非常强大的算法。 当可以证明某个函数是一个 kkk 次多项式时&#xff0c;我们就可以插入 k1k1k1 个函数值并快速的求出我们要求…

程序员修神之路--分布式缓存的一条明路(附代码)

菜菜呀&#xff0c;由于公司业务不断扩大&#xff0c;线上分布式缓存服务器扛不住了呀程序员主力 Y总如果加硬件能解决的问题&#xff0c;那就不需要修改程序菜菜我是想加服务器来解决这个问题&#xff0c;但是有个问题呀程序员主力 Y总&#xff1f;&#xff1f;&#xff1f;菜…

2019 ICPC Asia Nanjing Regional

题号题目难度知识点AA Hard Problem签到题思维题BChessboardCDigital Path签到题dfs记忆化搜索DHolesEObservationFPaper GradingGPoker GameHPrince and Princess四稳铜快银思维题ISpace StationJSpyKTriangle三题快铜计算几何