Codeforces Round #727 (Div. 2) 题解

文章目录

  • A. Contest Start
  • B. Love Song
  • C. Stable Groups
  • D. PriceFixed
  • E. Game with Cards
  • F. Strange Array

#727-Div.2

A. Contest Start

数学题,分类讨论

  • 一般的,一段区间[l,r][l,r][l,r]会对后面固定人数造成影响,假设是kkk
  • 最后kkk个人,因为自己后面的人数不够kkk,所以贡献总和是k×(k−1)2\frac{k\times(k-1)}{2}2k×(k1)

显然固定人数为tx\frac{t}{x}xt

#include <cstdio>
#define int long long
int T, n, x, t;signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld %lld", &n, &x, &t );int k = t / x;if( n < k ) printf( "%lld\n", n * ( n - 1 ) / 2 );else printf( "%lld\n", ( n - k ) * k + ( k - 1 ) * k / 2 );}return 0;
}

B. Love Song

前缀和统计[l,r][l,r][l,r]区间内每个字符的个数×\times×字符在字母表的排位

#include <cstdio>
#define maxn 100005
int n, Q;
char s[maxn];
int cnt[maxn][26];int main() {scanf( "%d %d %s", &n, &Q, s + 1 );for( int i = 1;i <= n;i ++ ) {for( int j = 0;j < 26;j ++ )cnt[i][j] = cnt[i - 1][j];cnt[i][s[i] - 'a'] ++;}while( Q -- ) {int l, r;scanf( "%d %d", &l, &r );int ans = 0;for( int i = 0;i < 26;i ++ )ans += ( i + 1 ) * ( cnt[r][i] - cnt[l - 1][i] );printf( "%d\n", ans );}return 0;
}

C. Stable Groups

贪心。

排个序,把能放在一起的放在一起,然后记录相邻组之间需要的“桥”的个数,用优先队列存储

显然,需要越少越先满足,留下更多的kkk满足后面

#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
priority_queue < int, vector < int >, greater < int > > q;
int n, k, x;
int a[maxn];signed main() {scanf( "%lld %lld %lld", &n, &k, &x );for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );sort( a + 1, a + n + 1 );int cnt = 1;for( int i = 1;i < n;i ++ )if( a[i + 1] - a[i] > x ) {cnt ++;q.push( ( a[i + 1] - a[i] - 1 ) / x );}while( ! q.empty() ) {if( q.top() <= k ) k -= q.top(), cnt --, q.pop();else break;}printf( "%lld\n", cnt );return 0;
}

D. PriceFixed

贪心模拟,按bbb排序

用最难满足的购买尽可能触碰易满足的bbb

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

E. Game with Cards

Li,j:L_{i,j}:Li,j: 左手为第iii个数,右手为第jjj个数,i<ji<ji<j,是否合法

Ri,j:R_{i,j}:Ri,j: 右手为第iii个数,左手为第jjj个数,i<ji<ji<j,是否合法

显然有暴力的n2n^2n2转移
Li,j=[ai∈[al,j,ar,j⋂aj∈[bl,j,br,j]]={Li,j−1i≠j−1∑k=1j−2Rk,j−1i=j−1Ri,j=[ai∈[bl,j,br,j⋂aj∈[al,j,ar,j]]={Ri,j−1i≠j−1∑k=1j−2Lk,j−1i=j−1L_{i,j}=\bigg[a_i\in [a_{l,j},a_{r,j}\bigcap a_j\in[b_{l,j},b_{r,j}]\bigg]=\begin{cases}L_{i,j-1}&&&&&i≠j-1\\\sum_{k=1}^{j-2}R_{k,j-1}&&&&&i=j-1\end{cases}\\R_{i,j}=\bigg[a_i\in [b_{l,j},b_{r,j}\bigcap a_j\in[a_{l,j},a_{r,j}]\bigg]=\begin{cases}R_{i,j-1}&&&&&i≠j-1\\\sum_{k=1}^{j-2}L_{k,j-1}&&&&&i=j-1\end{cases}\\ Li,j=[ai[al,j,ar,jaj[bl,j,br,j]]={Li,j1k=1j2Rk,j1i=j1i=j1Ri,j=[ai[bl,j,br,jaj[al,j,ar,j]]={Ri,j1k=1j2Lk,j1i=j1i=j1
显然是可以用线段树维护成logloglog

#include <cstdio>
#define maxn 100005
int n, m;struct SegMentTree {struct node {int l, r, tag, id, s;}t[maxn * 30];int cnt = 0, root;#define lson t[now].l#define rson t[now].rvoid pushdown( int now ) {if( t[now].tag ) {t[lson].s = t[rson].s = 0;t[lson].tag = t[rson].tag = t[now].tag;t[now].tag = 0;}	}void clear( int now, int l, int r, int L, int R ) {if( r < L || R < l ) return;if( ! now ) return;if( L <= l && r <= R ) {t[now].s = 0;t[now].tag = 1;return;}pushdown( now );int mid = ( l + r ) >> 1;clear( lson, l, mid, L, R );clear( rson, mid + 1, r, L, R );t[now].s = t[lson].s | t[rson].s;}void insert( int &now, int l, int r, int pos, int id ) {if( ! now ) now = ++ cnt;if( l == r ) {t[now].s = 1;t[now].id = id;return;}pushdown( now );int mid = ( l + r ) >> 1;if( pos <= mid ) insert( lson, l, mid, pos, id );else insert( rson, mid + 1, r, pos, id );t[now].s = t[lson].s | t[rson].s;}int query( int now = 1, int l = 0, int r = m ) {if( l == r ) return t[now].id;pushdown( now );int mid = ( l + r ) >> 1;if( t[lson].s ) return query( lson, l, mid );else return query( rson, mid + 1, r );}bool check() { return t[1].s; }}L, R;struct read {int x, L_rangel, L_ranger, R_rangel, R_ranger;read(){}read( int X, int AL, int AR, int BL, int BR ) {x = X, L_rangel = AL, L_ranger = AR, R_rangel = BL, R_ranger = BR;}
}MS[maxn];int ansl[maxn], ansr[maxn], ans[maxn];
bool ChooseL[maxn], ChooseR[maxn];int main() {scanf( "%d %d", &n, &m );L.insert( L.root, 0, m, 0, 0 );R.insert( R.root, 0, m, 0, 0 );for( int i = 1, x, L_rangel, L_ranger, R_rangel, R_ranger;i <= n;i ++ ) {scanf( "%d %d %d %d %d", &x, &L_rangel, &L_ranger, &R_rangel, &R_ranger );MS[i] = read( x, L_rangel, L_ranger, R_rangel, R_ranger );bool l_ok = L.check(), r_ok = R.check();if( l_ok ) ansl[i] = L.query();else ansl[i] = -1;if( r_ok ) ansr[i] = R.query();else ansr[i] = -1;if( L_rangel <= x && x <= L_ranger ) {//x is included in L->[l,r] which is suitable for request of option 0R.clear( R.root, 0, m, 0, R_rangel - 1 );R.clear( R.root, 0, m, R_ranger + 1, m );if( i > 1 && R_rangel <= MS[i - 1].x && MS[i - 1].x <= R_ranger && l_ok )R.insert( R.root, 0, m, MS[i - 1].x, i - 1 ), ChooseR[i] = 1;//however we must also sure that the number we keep on right hand is also included in R->[l,r] //only both are acceptable can we do option 0 truly}else R.clear( R.root, 0, m, 0, m );//otherwise the whole array of L should be clearedif( R_rangel <= x && x <= R_ranger ) {L.clear( L.root, 0, m, 0, L_rangel - 1 );L.clear( L.root, 0, m, L_ranger + 1, m );if( i > 1 && L_rangel <= MS[i - 1].x && MS[i - 1].x <= L_ranger && r_ok )L.insert( L.root, 0, m, MS[i - 1].x, i - 1 ), ChooseL[i] = 1;}else L.clear( L.root, 0, m, 0, m );}if( L.check() || R.check() ) {//backward print(END -> BEGIN)printf( "Yes\n" );int pos = n, lim, f;if( L.check() ) lim = L.query(), f = 0;else lim = R.query(), f = 1;while( pos ) {if( f ) {//this option choose 0(replace left)ans[pos] = 0;if( pos > lim + 1 ) goto out;else f ^= 1, lim = ansl[pos];}else {//this option choose 1(replace right)ans[pos] = 1;if( pos > lim + 1 ) goto out;else f ^= 1, lim = ansr[pos];}out : pos --;}for( int i = 1;i <= n;i ++ )printf( "%d ", ans[i] );}else printf( "No\n" );return 0;
}

F. Strange Array

连着两题线段树好,很好!

定义S1:[l,r]S_1:[l,r]S1:[l,r] 中小于aia_iai的个数,S2:[l,r]S_2:[l,r]S2:[l,r] 中等于aia_iai的个数,S3:[l,r]S_3:[l,r]S3:[l,r] 中大于aia_iai的个数

显然位置iii的奇怪度为
max⁡{S1+S2−⌈S1+S3+S2+12⌉⌈S1+S3+S2+12⌉−(S1+1)\max\begin{cases} S_1+S_2-\lceil\frac{S_1+S_3+S_2+1}{2}\rceil\\ \lceil\frac{S_1+S_3+S_2+1}{2}\rceil-(S_1+1) \end{cases} max{S1+S22S1+S3+S2+12S1+S3+S2+1(S1+1)
发现:同时在比aia_iai大和比aia_iai小的数中扔掉若干个相同的数,答案并不会发生变化

如此说来有用的只有二者的差,S1S2S3

如果aia_iai放在S2S_2S2的第一位,我们则非常希望max{S3},min{S1}max\{S_3\},min\{S_1\}max{S3},min{S1}这样中位数才会远离S2S_2S2的第一位

如果aia_iai放在S2S_2S2的倒数第一位,我们则非常希望min{S3},max{S1}min\{S_3\},max\{S_1\}min{S3},max{S1}

显然可以线段树维护查询了,将小于等于aia_iai的标记为−1-11

对于若干个相同的aia_iai位置,先查再改是一种情况,改了再查是另一种情况

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200005
struct node {int maxx, minn, lazy;
}t[maxn << 2];
vector < int > s[maxn];
int n;
int ans[maxn];void pushdown( int num ) {t[num << 1].maxx += t[num].lazy;t[num << 1].minn += t[num].lazy;t[num << 1].lazy += t[num].lazy;t[num << 1 | 1].maxx += t[num].lazy;t[num << 1 | 1].minn += t[num].lazy;t[num << 1 | 1].lazy += t[num].lazy;t[num].lazy = 0;
}void modify( int num, int l, int r, int L, int R, int val ) {if( L <= l && r <= R ) {t[num].lazy += val;t[num].maxx += val;t[num].minn += val;return;}pushdown( num );int mid = ( l + r ) >> 1;if( L <= mid ) modify( num << 1, l, mid, L, R, val );if( mid < R ) modify( num << 1 | 1, mid + 1, r, L, R, val );t[num].maxx = max( t[num << 1].maxx, t[num << 1 | 1].maxx );t[num].minn = min( t[num << 1].minn, t[num << 1 | 1].minn );
}int query_max( int num, int l, int r, int L, int R ) {if( L > R ) return 0; if( R < l || r < L ) return -1e9;if( L <= l && r <= R ) return t[num].maxx;pushdown( num );int mid = ( l + r ) >> 1;return max( query_max( num << 1, l, mid, L, R ), query_max( num << 1 | 1, mid + 1, r, L, R ) );
}int query_min( int num, int l, int r, int L, int R ) {if( L > R ) return 0;if( R < l || r < L ) return 1e9;if( L <= l && r <= R ) return t[num].minn;pushdown( num );int mid = ( l + r ) >> 1;return min( query_min( num << 1, l, mid, L, R ), query_min( num << 1 | 1, mid + 1, r, L, R ) );
}int main() {scanf( "%d", &n );for( int i = 1, x;i <= n;i ++ ) {scanf( "%d", &x );s[x].push_back( i );modify( 1, 1, n, i, n, -1 );}for( int i = 1;i <= n;i ++ ) {for( int j = 0;j < s[i].size();j ++ ) {//放在众多相同的最后一个->后面的尽量少前面的尽量多 int k = s[i][j];int l = max( 0, query_max( 1, 1, n, 1, k - 1 ) );//compare with 0 means just choosing k itselfint r = query_min( 1, 1, n, k, n );ans[k] = max( ans[k], ( l - r + 2 ) / 2 - 1 );}for( int j = 0;j < s[i].size();j ++ )modify( 1, 1, n, s[i][j], n, 2 );//抵消掉之前i对[i,n]造成的-1影响 然后再变成1后的影响 所以一次性加2 for( int j = 0;j < s[i].size();j ++ ) {//放在众多相同的第一个->后面的尽量多前面的尽量少 int k = s[i][j];int l = min( 0, query_min( 1, 1, n, 1, k - 1 ) );int r = query_max( 1, 1, n, k, n );ans[k] = max( ans[k], ( r - l ) - ( r - l + 2 ) / 2 );}}for( int i = 1;i <= n;i ++ )printf( "%d ", ans[i] );return 0;
}

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

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

相关文章

潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?

三喜临门一 喜今天真是个好日子&#xff0c;“流浪太阳”又回来了&#xff0c;阴雨绵绵长恨无期&#xff0c;今天苏州终于天晴&#xff0c;于是心情大好&#xff01;都说好心情会带来好运气&#xff0c;冥冥感觉要写点啥了&#xff0c;果不其然今天还有另外两喜。大早起来得…

G List it all

传送 题意&#xff1a; 题解&#xff1a; 我们来考虑以下样例&#xff1a;1&#xff0c;1&#xff0c;2 我们先考虑1的贡献&#xff1a;如图(图中只花了) 2&#xff01;表示还剩两个空位&#xff0c;还有两个数未填入&#xff0c;所以是2&#xff01;个 对于n个数重复&#x…

洛谷P4727:图的同构计数(Polya引理)(dfs)

解析 《关于我想了半天 dp 结果看题解 dfs 就行这回事》 我就说 gcd⁡\gcdgcd 这玩意 dp 个锤子啊… 拆分数的增长速度远没有想像中那么大&#xff0c;事实上&#xff0c;n60n60n60 也就 1e6 左右。 据题解说&#xff0c;这玩意的增长速度仅有 O(enn)O(\frac{e^{\sqrt n}}{n})…

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

一、前言在非静态页面的项目开发中&#xff0c;必定会涉及到对于数据库的访问&#xff0c;最开始呢&#xff0c;我们使用 Ado.Net&#xff0c;通过编写 SQL 帮助类帮我们实现对于数据库的快速访问&#xff0c;后来&#xff0c;ORM&#xff08;Object Relational Mapping&#x…

Codeforces Round #699 (Div. 2) 题解

文章目录A. Space NavigationB. New ColonyC. Fence PaintingD. AB GraphE. Sorting BooksF. AB Tree#699-Div.2A. Space Navigation 对于最终位置(x,y)&#xff0c;我们只关心那两个方向的字符是否足够即可 #include <cstdio> #include <cstring> #define maxn …

洛谷P4271:New Barns P(倍增)(LCT)(直径)

解析 倍增真香 关键性质&#xff1a;树上距离一个点最远的点必定是直径两端点其一。 本题限制好&#xff0c;要求少动态维护倍增数组暴力维护直径即可。 如果每次合并的是两棵树&#xff0c;而不是一棵树加一个点&#xff0c;可以先离线下来&#xff0c;照样能做。 如果每次强…

HDU 5510 Bazinga

HDU 5510 Bazinga 题意&#xff1a; 依次给你n个字符串&#xff0c;让你找到编号最大的字符串&#xff0c;存在一个比他编号小的字符串且不是其子串 题解&#xff1a; string中有find查找功能&#xff0c; 思路是用一个vector来存之前所有字符串&#xff0c;数组book用来表…

微软发布 Visual Studio 2019年第二季度路线图

微软近日发布了 Visual Studio 2019 年第二季度的路线图&#xff0c;路线图介绍了目前 VS 致力于在 VS 2019 发布的一些重要功能。官方表示&#xff0c;Visual Studio 2019 将继续按照 Visual Studio 发行周期流程提供更新&#xff0c;也就是约每 6 周推出一次次要更新&#xf…

Educational Codeforces Round 107 (Rated for Div. 2) 题解

文章目录A. Review SiteB. GCD LengthC. Yet Another Card DeckD. Min Cost StringE. Colorings and DominoesF. ChainwordG. Chips on a BoardEducational-Round-107A. Review Site 都给了两台机子&#xff0c;直接把所有只会投②的扔到一台&#xff0c;其余的全是另一台 就…

李争——一个骨子里是极客的程序员

我的业余作品《IT 英雄传》&#xff0c;聚焦身边的英雄&#xff0c;以文字采访的形式记录奇人趣事&#xff0c;笑看风云变幻。所写的人都是我见过面且比较熟悉的&#xff0c;绝大部分都是交往很久的&#xff0c;其中为了避嫌&#xff0c;我很少写微软同事&#xff0c;但今天这一…

Pagodas HDU - 5512

Pagodas HDU - 5512 题意&#xff1a; 一开始给你两个数a和b&#xff0c;你可以得到c通过&#xff0c;cab&#xff0c;或者ca-b&#xff0c;你所能得到的数的范围是1~n&#xff0c;两个人轮流操作&#xff0c;当有一方无法操作时&#xff0c;另一方获胜 题解&#xff1a; c…

期望学习笔记

前言 突然发现自己没有系统学过期望。 做一本通的时候是从二分图开始听的课&#xff0c;dp这一章只是四处搜题解而已。 做期望题基本都是靠玄学和《感性理解》 都是很简单的东西&#xff0c;但系统很重要&#xff0c;该补的还是要补的。 期望的基本性质 E(c)cE(c)cE(c)cE(cx)…

仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读

网络上关于这方面的博文有些偏理论&#xff0c;有些通篇代码&#xff0c;都不能深入浅出。本文用图文并茂的方式&#xff0c;配上行云流水般的代码&#xff0c;非要摆清楚这个问题。相关代码已提交至码云&#xff08;点击这里下载&#xff09;。事务是现代关系型数据库的核心之…

[AtCoder Regular Contest 123] 题解

文章目录A - Arithmetic SequenceB - Increasing TriplesC - 1, 2, 3 - DecompositionD - Inc, Dec - DecompositionE - TrainingF - Insert AdditionARC123A - Arithmetic Sequence 大讨论 只能111&#xff0c;先固定中间的数&#xff0c;看两边加谁&#xff0c;如果都是加负…

2.5:模拟总结

文章目录前言考场题目解析T1T2T3总结代码T1T2T3前言 50pts 30020 rnk19 … 把1000ms看成10s我也真是个人才。 T3自然溢出50带模数T成20有点离谱。 但倒没有因为WA失分。 就是菜罢了 考场 这次时间管理还是比较合理的。 乍看三题觉得T1似乎是个伞兵题 这离线下来可持久化数组…

Meeting HDU - 5521

Meeting HDU - 5521 题意&#xff1a; 一共有n个点&#xff0c;有m个块&#xff0c;每个块内有Si个点&#xff0c;块内点彼此到达费用为wi&#xff0c;两个人分别位于1和n号块&#xff0c;两者同时出发问最短时间遇到是多少&#xff1f;在哪些地方可以遇到&#xff1f; ΣSi&…

2.6模拟总结

前言 45pts 4500 rnk 34 写了200分&#xff0c;挂了155分 好哇&#xff01; 考场 这次状态还真是挺不错的。 开考&#xff0c;先看题。 T1期望&#xff0c;乍一看看不出来啥&#xff0c;似乎挺难的。 T2乍一看特别可做。 T3脑子里只有模拟退火 先去看T2。 被这种类似的题惯…

牛客IOI周赛26-提高组(逆序对,对序列,未曾设想的道路) 题解

文章目录逆序对对序列未曾设想的道路牛客IOI周赛26-提高组逆序对 这种套路之前已经见过几次了&#xff0c;肯定不是模拟操作数列 opt 1 对于i∈[1,l)⋃(r,n]i∈[1,l)\bigcup(r,n]i∈[1,l)⋃(r,n] 逆序对是不影响的 对于i∈(l,r)i∈(l,r)i∈(l,r) 与l/rl/rl/r的情况会反转&…

Frogs HDU - 5514

Frogs HDU - 5514 题意&#xff1a; 有n个青蛙&#xff0c;第 i 个青蛙每次只能够跳 ai​步&#xff0c;现在有m个石头围成一圈&#xff0c;编号为0到m−1&#xff0c;现在青蛙可以围着这个石头组成的圆跳无限次&#xff0c;每跳一次就会占领这个石头&#xff0c;可以无限占领…

Docker最全教程之树莓派和Docker(十六)

前言树莓派&#xff08;Raspberry Pi&#xff09;是一台卡片电脑&#xff08;只有信用卡大小&#xff09;&#xff0c;我们可以使用树莓派做很多事情&#xff0c;比如智能家居的中控、航空器、BT下载器、挖矿机、智能机器人、小型服务器&#xff08;花生壳网站&#xff09;等等…