[AtCoder Beginner Contest 216] 题解

文章目录

  • A - Signed Difficulty
  • B - Same Name
  • C - Many Balls
  • D - Pair of Balls
  • E - Amusement Park
  • F - Max Sum Counting
  • G - 01Sequence

比赛链接

A - Signed Difficulty

签到题

#include <cstdio>
int x, y;
char c;
int main() {scanf( "%d%c%d", &x, &c, &y );if( y <= 2 ) printf( "%d-", x );else if( y >= 7 ) printf( "%d+", x );else printf("%d", x );return 0;
}

B - Same Name

签到题

#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
map < pair < string, string >, int > mp;
int n;int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {string a, b;cin >> a >> b;if( mp[make_pair( a, b )] ) return ! printf( "Yes\n" );mp[make_pair( a, b )] = 1;}printf( "No\n" );return 0;
}

C - Many Balls

简单题

发现是快速幂的逆过程

#include <cstdio>
#include <vector>
using namespace std;
#define int long long
vector < int > ans;
int n;signed main() {scanf( "%lld", &n );while( n ) {if( n & 1 ) ans.push_back( 0 );ans.push_back( 1 );n >>= 1;}for( int i = ans.size() - 1;~ i;i -- )printf( "%c", ans[i] + 'A' );return 0;
}

D - Pair of Balls

超难题!!!靠

不搞环,硬汉就搞大模拟

记录颜色两次出现位置,并带上标记,成为堆顶为000,在下面为111

当颜色两个位置都入队(成为其所在堆的堆顶)

弹出,并把堆下面一个元素标记为新的堆顶

就这么模拟,凸(艹皿艹 )

之前打的什么鬼傻逼set/map半天模拟不动,又TLEREWA

o(╥﹏╥)o _(¦3」∠)_ ┏┛墓┗┓…(((m-__-)m

#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
#define maxn 200005
struct node {int color, i, rnk, pos;node(){}node( int C, int I, int R, int P ) {color = C, i = I, rnk = R, pos = P;}
}c[maxn][2];
int n, m, cnt;
queue < node > q;
vector < int > g[maxn];
bool vis[maxn][2];int main() {scanf( "%d %d", &n, &m );for( int i = 1, k, x;i <= m;i ++ ) {scanf( "%d", &k );for( int j = 1;j <= k;j ++ ) {scanf( "%d", &x );g[i].push_back( x );if( ! vis[x][0] ) c[x][0] = node( x, i, j, 1 ), vis[x][0] = 1;else c[x][1] = node( x, i, j, 1 ), vis[x][1] = 1;}}for( int i = 1;i <= n;i ++ ) {auto ls = c[i][0];auto rs = c[i][1];vis[i][0] = vis[i][1] = 0;if( ! ls.pos and ! rs.pos ) {q.push( c[i][0] );q.push( c[i][1] );}}while( ! q.empty() ) {auto ls = q.front(); q.pop();auto rs = q.front(); q.pop();cnt ++;int nxt;if( ls.rnk ^ g[ls.i].size() ) {nxt = g[ls.i][ls.rnk];if( c[nxt][0].i == ls.i ) c[nxt][0].pos = 0;else c[nxt][1].pos = 0;if( ! c[nxt][0].pos and ! c[nxt][1].pos ) {q.push( c[nxt][0] );q.push( c[nxt][1] );}}if( rs.rnk ^ g[rs.i].size() ) {nxt = g[rs.i][rs.rnk];if( c[nxt][0].i == rs.i ) c[nxt][0].pos = 0;else c[nxt][1].pos = 0;if( ! c[nxt][0].pos and ! c[nxt][1].pos ) {q.push( c[nxt][0] );q.push( c[nxt][1] );}}}if( cnt ^ n ) printf( "No\n" );else printf( "Yes\n" );return 0;
}

E - Amusement Park

简单题

数学直接算

从大到小取,每次a[i]a[i]a[i]取到a[i+1]a[i+1]a[i+1]相同值就停,等差数列算这中间的值和

随着iii的枚举,前面全是相同的a[i]a[i]a[i],所以这等差数列算了后还要乘以一个iii的系数

#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 100005
int n, k;
int a[maxn];signed main() {scanf( "%lld %lld", &n, &k );for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );sort( a + 1, a + n + 1, []( int x, int y ) { return x > y; } );int ans = 0;for( int i = 1;i <= n;i ++ ) {int x = a[i] - a[i + 1];int sum = ( a[i] + a[i + 1] + 1 ) * x / 2;if( k <= x * i ) {x = k / i;sum = ( a[i] + a[i] - x + 1 ) * x / 2;ans += sum * i;a[i] -= k / i;k %= i;ans += a[i] * k;break;}else {ans += sum * i;k -= x * i;}}printf( "%lld\n", ans );return 0;
}

F - Max Sum Counting

简单题

凸(艹皿艹 ),傻逼背包倒DP调nm半个小时

AAA排序,枚举AiA_iAi作为最大值

接下来就是选一些数满足BjB_jBj的和不超过AiA_iAi

dpj:dp_j:dpj: 和为jjj的方案数

每次统计答案后,再转移iiiBiB_iBi的贡献

发现其实就是个简单背包

#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 5005
struct node { int a, b; }g[maxn];
int n;
int t[maxn], dp[maxn];bool cmp( node x, node y ) {return x.a < y.a;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &g[i].a );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &g[i].b );sort( g + 1, g + n + 1, cmp );int ans = 0;dp[0] = 1;for( int i = 1;i <= n;i ++ ) {for( int j = 0;j <= g[i].a - g[i].b;j ++ )ans = ( ans + dp[j] ) % mod;for( int j = maxn - 1;j >= g[i].b;j -- )dp[j] = ( dp[j] + dp[j - g[i].b] ) % mod;}printf( "%lld\n", ans );return 0;
}

G - 01Sequence

看完题目是非常板的差分约束题面感

sis_isi表示1−i1-i1i1的个数

[l,r][l,r][l,r]区间内1个数不少于xxx个,翻译约束为sr−sl−1≥xs_r-s_{l-1}\ge xsrsl1x

为了契合差分约束的≤\le

重新定义sis_isi表示1−i1-i1i0的个数

翻译约束为sr−sl−1≤r−l+1−xs_r-s_{l-1}\le r-l+1-xsrsl1rl+1x

转化到图论上,连边l−1→rl-1\rightarrow rl1r有向边的边权r−l+1−xr-l+1-xrl+1x

跑最短路即可

本题卡SPFA

差分约束

  • 为什么是≤\le约束(不等式左边为“点”,不等式右边为固定限制)

    • 首先最长路目前没有快速地算法
    • 其次符合最短路disv≤disu+wu,vdis_v\le dis_u+w_{u,v}disvdisu+wu,v的形式
  • 感觉最后求sns_nsn的最大值,应该是最长路,为什么图论上是跑最短路

    • 首先约束和sns_nsn之间是逆向关系,并不是正比于

    • 可以理解为最短路就是求出最严格的约束

    • sns_nsn的所有值都保证要满足所有的约束,自然要满足最严格的约束

    • e.g. (i,j)=x1,(j,k)=x2,(i,k)=x3,x1+x2<x3(i,j)=x_1,(j,k)=x_2,(i,k)=x_3,x_1+x_2<x_3(i,j)=x1,(j,k)=x2,(i,k)=x3,x1+x2<x3

      既要满足disj≤disi+x1;disk≤disj+x2dis_j\le dis_i+x_1;dis_k\le dis_j+x_2disjdisi+x1;diskdisj+x2

      又要满足disk≤disi+x3dis_k\le dis_i+x_3diskdisi+x3

      并且disk≤disj+x2≤disi+x1+x2≤disi+x3dis_k\le dis_j+x_2\le dis_i+x_1+x_2\le dis_i+x_3diskdisj+x2disi+x1+x2disi+x3

      根据不等式的原则,同小取小的最严格约束

      这恰好匹配最短路的过程

所以差分约束的本质是转化为最短路问题

#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 200005
#define Pair pair < int, int >
priority_queue < Pair, vector < Pair >, greater < Pair > > q;
int n, m;
int dis[maxn];
bool vis[maxn];
vector < Pair > G[maxn];void addedge( int u, int v, int w ) {G[u].push_back( make_pair( v, w ) );
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, l, r, x;i <= m;i ++ ) {scanf( "%d %d %d", &l, &r, &x );addedge( l - 1, r, r - l + 1 - x );}for( int i = 0;i < n;i ++ ) {addedge( i, i + 1, 1 );addedge( i + 1, i, 0 );}memset( dis, 0x3f, sizeof( dis ) );dis[0] = 0; q.push( make_pair( 0, 0 ) );while( ! q.empty() ) {Pair now = q.top(); q.pop();int u = now.second;if( vis[u] or dis[u] ^ now.first ) continue;vis[u] = 1;for( auto nxt : G[u] ) {int v = nxt.first, w = nxt.second;if( dis[v] > dis[u] + w ) {dis[v] = dis[u] + w;q.push( make_pair( dis[v], v ) );}}}for( int i = 1;i <= n;i ++ )printf( "%d ", ( dis[i] - dis[i - 1] ) ^ 1 );return 0;
}

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

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

相关文章

长沙.NET技术社区正式成立

感谢大家的关注&#xff0c;请允许我冒昧的向大家汇报长沙.NET技术社区第一次交流会的会议进展情况。活动过程汇报2019年2月17日&#xff0c;继深圳&#xff0c;广州&#xff0c;西安&#xff0c;成都&#xff0c;苏州相继成立了.net社区之后&#xff0c;酝酿已久的长沙.net社区…

A Hard Problem

A Hard Problem 题意&#xff1a; 给定一个n&#xff0c;要求找到最小的正数k&#xff0c;使得在集合T中任意选K个数&#xff0c;其中存在两个不同的u和v&#xff0c;u是v的因子 题解&#xff1a; 一开始想偏了&#xff0c;往质因数方向想了&#xff0c;然后因为1e9的以内的…

hdu7207-Find different【burnside引理】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7207 题目大意 一个序列aaa&#xff0c;和它相同的序列当且仅当能通过以下操作实现相同&#xff1a; 将a1a_1a1​丢到ana_nan​&#xff0c;其余的向前移动一位。令所有ai(ai1)%ma_i(a_i1)\%mai​(ai​1)%m 对于n…

洛谷P6097:【模板】子集卷积(FWT)

解析 完全可以当一道 DP 题而不是模板来做。 首先第一个条件&#xff1a; i∣jki|jki∣jk 比较简单&#xff0c;直接上FWT板子即可。 考虑第二个条件&#xff1a;i&j0i\&j0i&j0。若设 ∣x∣|x|∣x∣ 表示二进制下 1 的个数&#xff0c;那么就有&#xff1a; ∣i∣…

Asp.NetCore轻松学-部署到 IIS 进行托管

前言经过一段时间的学习&#xff0c;终于来到了部署服务这个环节&#xff0c;.NetCore 的部署方式非常的灵活多样&#xff0c;但是其万变不离其宗&#xff0c;所有的 Asp.NetCore 程序都基于端口的侦听&#xff0c;在部署的时候仅需要配置侦听地址、端口&#xff08;一个或者多…

线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

文章目录Rmq Problem / mexBoring QueriesColorful SquaresRmq Problem / mex luogu4137 对aia_iai​建权值线段树 再加上可持久化 对于第RRR个版本的线段树&#xff0c;每个叶子xxx存的是aixa_ixai​x的所有iii中最大的小于RRR的位置iii 那么询问[L,R][L,R][L,R]就转化成…

C - Digital Path 计蒜客 - 42397 05-29

C - Digital Path 计蒜客 - 42397 题意&#xff1a; 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走&#xff0c;而且下一个位置必须比当前位置的数字大1&#xff0c;入口和出口必须数边缘元素&#xff0c;求可以有多少条路径。 题解&#xff1a; 第一反…

响应式编程知多少 | Rx.NET 了解下

1. 引言An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.ReactiveX 使用可观察数据流进行异步编程的API。 ReactiveX结合了观察者…

数据结构之trie树——First! G,电子字典,Type Printer,Nikitosh and xor

文章目录[USACO12DEC]First! G[JSOI2009]电子字典[IOI2008] Type PrinterNikitosh and xor[USACO12DEC]First! G luogu3065 考虑每一个字符串成为答案的可能 这意味着从字典树根到字符串最后一位就恰好对应重新定义的字典序 在第iii层的时候&#xff0c;想要走特定点&#…

H - Prince and Princess 计蒜客 - 42402

H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主&#xff0c;有三种人&#xff0c;第一种是说真话的人(至少为1&#xff0c;因为公主是说真话的人)&#xff0c;第二种人是只会说假话的&#xff0c;第三种是胡说八道的(说的话真假都有可能)。现在给你三种人的…

模板:min-max容斥离散随机变量的几何分布(洛谷P3175:[HAOI2015]按位或)

前言 见到一道神题&#xff0c;学会两个知识点… 都是数学。 min-max容斥 给出式子&#xff1a; max⁡(S)∑T⊂S(−1)∣T∣1min⁡(T)\max(S)\sum_{T\sub S}(-1)^{|T|1}\min(T)max(S)T⊂S∑​(−1)∣T∣1min(T) min⁡(S)∑T⊂S(−1)∣T∣1max⁡(T)\min(S)\sum_{T\sub S}(-1)^…

杭电多校杂题收录

前言 和学长学弟一起打的hdu多校&#xff0c;打的很菜没啥难题收录&#xff0c;因为难的我都不会做。 正题 hdu7152-Copy 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7152 题目大意 nnn个数字的序列aaa&#xff0c;mmm次操作&#xff0c;每次将一段[l,r][l,r][l,r…

.NET Core中的验证组件FluentValidation的实战分享

今天有人问我能不能出一篇FluentValidation的教程&#xff0c;刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation&#xff0c;所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享&#xf…

笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

文章目录笛卡尔树介绍例题Largest Submatrix of All 1’s应用「POI2015」洗车 Myjnie[AGC028B] Removing BlocksSPOJ PERIODNI笛卡尔树 介绍 笛卡尔树是一种数据结构&#xff0c;每个点由两个值&#xff0c;键值key和权值val&#xff0c;组成 其键值满足二叉树性质 即点的左子…

K - Triangle 计蒜客 - 42405

K - Triangle 计蒜客 - 42405 题意&#xff1a; 给你一个三角形的三点&#xff0c;再给你三角形边上一个点&#xff0c;让你求另一个点(也要在三角形上)&#xff0c;使得平分三角形的面积 题解: 计算几何 三角形的三边ab&#xff0c;ac&#xff0c;bc 如果点p在ab上&#x…

P2508-[HAOI2008]圆上的整点【数学】

正题 题目链接:https://www.luogu.com.cn/problem/P2508 题目大意 一个在(0,0)(0,0)(0,0)的圆心&#xff0c;半径为rrr&#xff0c;求圆有多少个整点。 1≤r≤21091\leq r\leq 2\times 10^91≤r≤2109 解题思路 设这个点为(x,y)(x,y)(x,y)&#xff0c;那么有x2y2r2x^2y^2r^2…

如何为ASP.NET Core设置客户端IP白名单验证

本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式。你可以使用一下3种方式&#xff1a;使用中间件检查每个请求的远程IP地址使用Action过滤器为指定的Controller或action方法添加针对远程IP地址的检查使用IPageFilter为Razor Pages应用添加针对远程IP地…

CodeForces - 140C New Year Snowmen

CodeForces - 140C New Year Snowmen 题意&#xff1a; 现在来做雪人&#xff0c;每个雪人由三个不同大小的雪球构成&#xff1a;一个大的&#xff0c;一个中等的&#xff0c;一个小的。现在有 n 个雪球半径分别为 r1, r2, …, rn. 为了做雪人&#xff0c;三个雪球的大小必须…

洛谷P4389:付公主的背包(多项式、生成函数)

对于一些生成函数累乘的题目&#xff0c;也许可以通过求 ln⁡\lnln 转化为累加问题从而完成简化。 解析 不难写出对于单个物品 kkk 的生成函数&#xff1a; ∑i1xVi11−xVK\sum_{i1}x^{Vi}\frac{1}{1-x^{V_K}}i1∑​xVi1−xVK​1​ 那么答案的生成函数就是所有物品的函数的卷积…

数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

因为非常板&#xff0c;所以主要是代码Tyvj 1728 普通平衡树Chef and Sets[HNOI2012]永无乡Play with Chain[NOI2005]维修数列题目很水&#xff0c;所以可能会出现代码部分细节出锅&#xff0c;但确实这些代码是能过得 还请多多包涵 Tyvj 1728 普通平衡树 luogu3369 #include…