[2021-09-04 AtCoder Beginner Contest 217] 题解

文章目录

  • A - Lexicographic Order
  • B - AtCoder Quiz
  • C - Inverse of Permutation
  • D - Cutting Woods
  • E - Sorting Queries
  • F - Make Pair
  • G - Groups

网址链接

A - Lexicographic Order

签到题

#include <cstdio>
#include <iostream>
using namespace std;
int main() {string s, t;cin >> s >> t;if( s < t ) printf( "Yes\n" );else printf( "No\n" );return 0;
}

B - AtCoder Quiz

签到题

#include <cstdio>
#include <iostream>
using namespace std;
char s1[10], s2[10], s3[10];int main() {scanf( "%s %s %s", s1, s2, s3 );if( 'R' != s1[1] and 'R' != s2[1] and 'R' != s3[1] )printf( "ARC\n" );if( 'B' != s1[1] and 'B' != s2[1] and 'B' != s3[1] )printf( "ABC\n" );if( 'H' != s1[1] and 'H' != s2[1] and 'H' != s3[1] )printf( "AHC\n" );if( 'G' != s1[1] and 'G' != s2[1] and 'G' != s3[1] )printf( "AGC\n" );return 0;
}

C - Inverse of Permutation

签到题

#include <cstdio>
#define maxn 200005
int n;
int p[maxn], ans[maxn];int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &p[i] ), ans[p[i]] = i;for( int i = 1;i <= n;i ++ )printf( "%d ", ans[i] );return 0;
}

D - Cutting Woods

签到题

刚开始想歪了,打算不思考直接暴力线段树cao

后来一看1e9的长度,打扰了

再一想,直接set不也可以做到线段树的功能吗

直接把操作点扔进去,找左右最近的分割点即可

#include <set>
#include <cstdio>
using namespace std;
set < int > s;
int n, Q, c, x;int main() {scanf( "%d %d", &n, &Q );s.insert( 0 ), s.insert( n );while( Q -- ) {scanf( "%d %d", &c, &x );if( c == 1 ) s.insert( x );else {auto l = s.lower_bound( x );auto r = l; l --;printf( "%d\n", *r - *l );}}return 0;
}

E - Sorting Queries

签到题

可能会被排序操作吓到TLE

实际上转个弯就知道序列一定是前面有序后面无序的状态

那么分开存进队列即可,遇到排序就把无序的全都丢进有序队列

每个点最多被操作入队两次

复杂度只有有序队列的log罢了

这都是表面上吓唬人的

#include <queue>
#include <cstdio>
using namespace std;
priority_queue < int, vector < int >, greater < int > > q;
queue < int > New;
int Q, opt, x;int main() {scanf( "%d", &Q );while( Q -- ) {scanf( "%d", &opt );switch( opt ) {case 1 : {scanf( "%d", &x );New.push( x );break;}case 2 : {if( ! q.empty() )printf( "%d\n", q.top() ), q.pop();else printf( "%d\n", New.front() ), New.pop();break;}case 3 : {while( ! New.empty() )q.push( New.front() ), New.pop();break;}}}
}

F - Make Pair

中档题

必须要两人是好关系,并且相邻才行

果断区间dpdpdp,根据范围200200200果断猜测时间复杂度应为O(N3)/O(N3log⁡N)O(N^3)/O(N^3\log N)O(N3)/O(N3logN)

dpi,j:[i,j]dp_{i,j}:[i,j]dpi,j:[i,j]区间的人都成功配对离开的方案数,答案自然为dp1,2ndp_{1,2n}dp1,2n

考虑枚举与iii配对的是kkk,则kkk将区间[i,j][i,j][i,j]隔绝成两个互相独立的子问题,dpi+1,k−1;;dpk+1,rdp_{i+1,k-1};;dp_{k+1,r}dpi+1,k1;;dpk+1,r

定义dpi+1,i=1dp_{i+1,i}=1dpi+1,i=1

假设[i+1,k−1][i+1,k-1][i+1,k1]配对个数为x(k−1−(i+1)+1=k−i−1)x(k-1-(i+1)+1=k-i-1)x(k1(i+1)+1=ki1)[k+1,r][k+1,r][k+1,r]的配对个数为y(r−(k+1)+1=r−k)y(r-(k+1)+1=r-k)y(r(k+1)+1=rk)

dpi,j=∑k=i+1rdpi+1,k−1∗dpk+1,r∗(x+y+1y)dp_{i,j}=\sum_{k=i+1}^rdp_{i+1,k-1}*dp_{k+1,r}*\binom{x+y+1}{y}dpi,j=k=i+1rdpi+1,k1dpk+1,r(yx+y+1)

(x+y+1y)\binom{x+y+1}{y}(yx+y+1):区间[i,j][i,j][i,j]的配对次数为x+y+1x+y+1x+y+1(i,ki,ki,k的一次配对),从中选择yyy次操作右子区间

为什么不是从中选择xxx次操作左子区间?

因为左子区间的操作事关i,ki,ki,k的相邻问题,而右子区间无关

必须左子区间都操作完了才能操作(i,k)(i,k)(i,k)配对

所以说就不可能出现最后xxx次操作全都是操作左子区间,反而先操作(i,k)(i,k)(i,k)的配对,这样是错误的,那么选xxx的组合数(x+y+1x)\binom{x+y+1}{x}(xx+y+1)计算的方案数就是错误的

选择右子区间操作的轮数后,剩下的x+1x+1x+1位置就固定了,最后一个一定是(i,k)(i,k)(i,k)的配对

#include <cstdio>
#define int long long
#define mod 998244353
#define maxn 405
int fac[maxn], inv[maxn];
bool good[maxn][maxn];
bool vis[maxn][maxn];
int dp[maxn][maxn];
int n, m;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void init() {fac[0] = inv[0] = 1;for( int i = 1;i < maxn;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[maxn - 1] = qkpow( fac[maxn - 1], mod - 2 );for( int i = maxn - 2;i;i -- )inv[i] = inv[i + 1] * ( i + 1 ) % mod;
}int C( int n, int m ) {return fac[n] * inv[m] % mod * inv[n - m] % mod;
}int dfs( int l, int r ) {if( vis[l][r] ) return dp[l][r];if( l > r ) return vis[l][r] = dp[l][r] = 1;int &ans = dp[l][r];for( int i = l + 1;i <= r;i += 2 ) {if( ! good[l][i] ) continue;int x = i - l - 1 >> 1, y = r - i >> 1;ans = ( ans + dfs( l + 1, i - 1 ) * dfs( i + 1, r ) % mod * C( x + y + 1, y ) ) % mod; }vis[l][r] = 1;return ans;
}signed main() {init();scanf( "%lld %lld", &n, &m );for( int i = 1, a, b;i <= m;i ++ ) {scanf( "%lld %lld", &a, &b );good[a][b] = good[b][a] = 1;}n <<= 1;printf( "%lld\n", dfs( 1, n ) );return 0;
} 

G - Groups

简单题

dpi,j:dp_{i,j}:dpi,j:iii个数一共使用了jjj个非空集合

那么转移只会分为两种

  • iii单独成一个新集合
    • dpi,j+=dpi−1,j−1dp_{i,j}+=dp_{i-1,j-1}dpi,j+=dpi1,j1
  • iii放进前jjj个集合中的某一个
    • 集合无差别
    • 每一个取模mmm相同的数都在不同的集合
    • 前面与iii同余的个数显然为⌊i−1m⌋\lfloor\frac{i-1}{m}\rfloormi1
    • 不能放那些数所在的集合,剩下的集合都是可以放的
    • dpi,j+=dpi−1,j∗max⁡(0,j−⌊i−1m⌋)dp_{i,j}+=dp_{i-1,j}*\max(0,j-\lfloor\frac{i-1}{m}\rfloor)dpi,j+=dpi1,jmax(0,jmi1)
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 5005
int n, m;
int dp[maxn][maxn];signed main() {scanf( "%lld %lld", &n, &m );dp[0][0] = 1;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= i;j ++ )dp[i][j] = ( dp[i - 1][j - 1] + dp[i - 1][j] * max( 0ll, j - ( i - 1 ) / m ) ) % mod;for( int i = 1;i <= n;i ++ )printf( "%lld\n", dp[n][i] );return 0;
}

说实话,我觉得F G的题目分值给反了,前面竟然全是签到水题,后面的经典DP还是可以给个好评的

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

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

相关文章

微软内部全面拥抱开源流程Inner Source

微软过去几年一直是 GitHub 平台上开源贡献者最多的公司。不仅如此&#xff0c;微软还将继续拥抱开源&#xff0c;内部有一项名为 Inner Source 的计划&#xff0c;将开源开发流程引入到公司内部。事实上&#xff0c;Inner Source 已经存在于微软内部多年&#xff0c;包括更多代…

洛谷P5110:块速递推(特征根方程、光速幂)

解析 去你的搬砖生成函数&#xff0c;特征根太香了。 一开始我是用生成函数解的&#xff0c;和特征根相比有亿点点搬砖… 但是这个东西原理似乎使用一些神奇的等比差分&#xff0c;有些玄学&#xff0c;生成函数较易理解。 背下来背下来&#xff01; 就以本题为情境讲一下特征…

Product 1 Modulo N CodeForces - 1514C

Product 1 Modulo N CodeForces - 1514C 题意&#xff1a; 在[1,n-1]中选x个数&#xff0c;使得乘积mod n 1&#xff0c;求x的最大值&#xff0c;并输出所选的数 题解&#xff1a; 我们设S为所选x个数的乘积 S%n 1说明gcd(S,n)1,即所选的x个数均与n互质&#xff0c;如果不…

k8s使用helm打包chart并上传到腾讯云TencentHub

本文只涉及Helm的Chart操作&#xff0c;不会对其他知识进行过多描述。至于安装这块&#xff0c;麻烦自行百度吧&#xff0c;一大堆呢。在容器化的时代&#xff0c;我们很多应用都可以部署在docker&#xff0c;很方便&#xff0c;而再进一步&#xff0c;我们还有工具可以对docke…

数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

文章目录[ZJOI2008]骑士[IOI2008] Island[NOIP2018 提高组] 旅行 加强版CF1454E Number of Simple PathsTraffic Network in NumazuCard Game基环树的常见解法若干个基环树互相独立断环为链&#xff08;随便断一条&#xff09;环外树和环外树之间的树形DP环变链后整体可以用数据…

1090. 绿色通道

1090. 绿色通道 题意&#xff1a; n个题&#xff0c;每个题所花时间为ai&#xff0c;最多只用不超过t分钟做这个&#xff0c;肯定会有题目做不完&#xff0c;下标连续的一些空题称为一个空题段&#xff0c;问在t分钟内最长的空题段至少有多长&#xff1f; 题解&#xff1a; …

模板:BSGS(数论)

所谓 BSGS&#xff0c;就是北上广深。 &#xff08;逃&#xff09; BSGS 给出 a,b,pa,b,pa,b,p&#xff0c;请处出满足 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的最小非负正数解或者报告无解。 a,b,p≤109,gcd⁡(a,p)1a,b,p\le 10^9,\gcd(a,p)1a,b,p≤109,gcd(a,p)1 由于 …

如何在ASP.NET Core中自定义Azure Storage File Provider

主题&#xff1a;如何在ASP.NET Core中自定义Azure Storage File Provider作者&#xff1a; Lamond Lu地址: https://www.cnblogs.com/lwqlun/p/10406566.html项目源代码&#xff1a; https://github.com/lamondlu/AzureFileProvider背景ASP.NET Core是一个扩展性非常高的框架…

splay/fhq-treap 问卷调查反馈—— [JSOI2008]火星人prefix(splay),Strange Queries(fhq-treap)

文章目录[JSOI2008]火星人prefixStrange Queries[JSOI2008]火星人prefix BZOJ1014 思路很好想&#xff0c;哈希字符串即可 只是平衡树的码量大 注意因为splay加入哨兵的原因&#xff0c;每个点在平衡树内的排名比真实排名大111&#xff08;有极小值的占位&#xff09; 考虑…

AcWing 1091. 理想的正方形

AcWing 1091. 理想的正方形 题意&#xff1a; 有一个 ab 的整数组成的矩阵&#xff0c;现请你从中找出一个 nn 的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 题解&#xff1a; 前置知识&#xff1a;已经学会了一维的单调队列优化dp 在本题中要求…

美好生活从撸好代码开始

楔子 昨天晚上做了个梦&#xff0c;梦到老板对我说了一番道理&#xff0c;他说对家庭要用爱心&#xff0c;做人对社会要有包容心&#xff0c;对工作要有责任心&#xff0c;对老板要有同理心。 我深以为然。现在的老板确实太不容易了&#xff0c;尤其是作为一家承载梦想&#xf…

模板:莫比乌斯反演(数论)

文章目录前言整除分块代码积性函数线性筛狄利克雷卷积莫比乌斯反演trick所谓莫比乌斯反演&#xff0c;就是莫比乌斯进行的反演 &#xff08;逃&#xff09; 前言 在一些需要整除的式子和 gcd⁡,lcm⁡\gcd,\operatorname{lcm}gcd,lcm 等问题中发挥作用。 整除分块 整除分块是…

[TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

2021-09-07 test[TJOI2013]拯救小矮人「ICPC World Finals 2019」Hobson 的火车[TJOI2013]拯救小矮人 luogu4823 考试题目的数据加强为2e5&#xff0c;所以此题做法应为O(nlog⁡n)O(n\log n)O(nlogn)的反悔贪心 这种有多元属性&#xff0c;选择最优的问题 如果发现简单的贪心…

Dotnet全平台下APM-Trace探索

随着支撑的内部业务系统越来越多&#xff0c;向着服务化架构进化&#xff0c;在整个迭代过程中&#xff0c;会逐渐暴露出以下问题。传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高&#xff0c;传统的监控服务已经无法满足需求。终端--> Nginx --> IIS --…

生成函数全家桶

文章目录有用的式子1.&#xff08;牛顿二项式定理&#xff09;2.普通生成函数&#xff08;OGF&#xff09;常见封闭形式&#xff1a;1.2.3.4.指数生成函数&#xff08;EGF&#xff09;排列与圆排列有用的式子 1.&#xff08;牛顿二项式定理&#xff09; 我们把组合数的定义推…

2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

文章目录descriptionsolutioncodedescription 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b}&#xff0c;满足∑i1KaiN,∑i1KbiM\sum_{i1}^Ka_iN,\sum_{i1}^Kb_iM∑i1K​ai​N,∑i1K​bi​M 对于这两个数列&#xff0c;定义权值为P∏i1Kmin⁡(ai,bi)P\p…

部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub&#xff0c;今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。把Chart上传到TencentHub之后&#xff0c;我们就可以通过腾讯云的容器服务&#xff0c;直接部署Helm应用了…

Vases and Flowers HDU - 4614

Vases and Flowers HDU - 4614 题意: 一排空瓶子放花&#xff0c;操作1&#xff1a;从第x个瓶子开始放花&#xff0c;放y朵花&#xff0c;每个瓶子就一朵花&#xff0c;如果碰到已经有花的瓶子跳过这个瓶子&#xff0c;看下一个&#xff0c;当花没了&#xff0c;或者瓶子不够…

洛谷P3327:[SDOI2015]约数个数和(莫比乌斯反演)

枚举倍数的一种灵活的变形&#xff1a;g(d)∑d∣inf(i)∑i1⌊nd⌋f(i⋅d)g(d)\sum_{d|i}^nf(i)\sum_{i1}^{\lfloor\frac{n}{d}\rfloor}f(i\cdot d)g(d)∑d∣in​f(i)∑i1⌊dn​⌋​f(i⋅d) 很显然&#xff0c;但有时能发挥大作用。 其实本质还是要理解西格玛究竟是在算什么 解析…

EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言α角 与 β角关于α角 与 β角的介绍&#xff0c;请见上文 如何用EFCore Lazy Loading实现Entity Split。本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑其他本篇的程序&#xff0c;可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithE…