Codeforces Round #699 (Div. 2) 题解

文章目录

  • A. Space Navigation
  • B. New Colony
  • C. Fence Painting
  • D. AB Graph
  • E. Sorting Books
  • F. AB Tree

#699-Div.2

A. Space Navigation

对于最终位置(x,y),我们只关心那两个方向的字符是否足够即可

#include <cstdio>
#include <cstring>
#define maxn 100005
int T, n, m;
char s[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d %s", &n, &m, s + 1 );char x = n < 0 ? 'L' : 'R';char y = m < 0 ? 'D' : 'U';int len = strlen( s + 1 );int cntx = 0, cnty = 0;for( int i = 1;i <= len;i ++ ) {if( s[i] == x ) cntx ++;if( s[i] == y ) cnty ++;}if( n < 0 ) n = -n;if( m < 0 ) m = -m;if( cntx >= n && cnty >= m ) printf( "YES\n" );else printf( "NO\n" );}return 0;
}

B. New Colony

发现数据非常小,最暴力也只用滚1e51e51e5次就一定是−1-11,所以kkk那么大纯粹虾银

#include <cstdio>
#define maxn 105
int T, n, k;
int h[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &k );for( int i = 1;i <= n;i ++ )scanf( "%d", &h[i] );int ans;for( int i = 1;i <= k;i ++ ) {int pos = 1;for( int j = 2;j <= n;j ++ )if( h[pos] >= h[j] ) pos ++;else {h[pos] ++;break;}ans = pos;if( ans == n ) break;}if( ans == n ) printf( "-1\n" );else printf( "%d\n", ans );}	return 0;
}

C. Fence Painting

统计需要染色的颜色和个数,判断是否足够

对于无效的笔又必须使用,显然将之用到最后一次有效操作的木板上

这样之前的所有染色都会被覆盖掉

注意最后一次有效操作的模板查找

#include <cstdio>
#include <queue>
using namespace std;
#define maxn 100005
queue < int > q[maxn];
int T, n, m;
int a[maxn], b[maxn], c[maxn], cnt[maxn];
bool vis[maxn];int main() {scanf( "%d", &T );again :while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) {while( ! q[i].empty() ) q[i].pop();vis[i] = cnt[i] = 0;}for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );for( int i = 1;i <= n;i ++ )scanf( "%d", &b[i] ), vis[b[i]] = 1;for( int i = 1;i <= m;i ++ )scanf( "%d", &c[i] ), cnt[c[i]] ++;if( ! vis[c[m]] ) {printf( "NO\n" );goto again;}int pos;for( int i = 1;i <= n;i ++ ) {if( a[i] != b[i] ) q[b[i]].push( i );if( b[i] == c[m] && ( a[i] != b[i] || ( a[i] == b[i] && ! q[b[i]].size() ) ) ) pos = i;}for( int i = 1;i <= n;i ++ )if( q[b[i]].size() > cnt[b[i]] ) {printf( "NO\n" );goto again;}printf( "YES\n" );for( int i = 1;i <= m;i ++ )if( ! q[c[i]].empty() ) {printf( "%d ", q[c[i]].front() );q[c[i]].pop();}else printf( "%d ", pos );printf( "\n" );}return 0;
}

D. AB Graph

大讨论就是猴赛雷!!!

  • m=2k+1m=2k+1m=2k+1

    aba aaa都是回文串,由此可知不管边长什么样随便选两个点都是正确的

    在这里我们采取在(1,2)之间反复横跳

  • m=2km=2km=2k

    • 先特判一下n=2n=2n=2的情况

    • 存在Ea→b=Eb→aE_{a\rightarrow b}=E_{b\rightarrow a}Eab=Eba,那么只需要在这样一对边横跳即可,回文串只包含了一个字符

    • 一个简单的三元环所经过的路径字符一样,直接绕环走

    • 不存在那么完美的两种情况,这意味着一对边一定是ab类型的

      显然,任意三个点中一定会有至少一个点连出的两条边为ab

      (当控制另外两个点连出边一样时,第三个点的边就已确定)

      • m2=3t\frac{m}{2}=3t2m=3t,走法bab
      • m2=3t+1\frac{m}{2}=3t+12m=3t+1,走法abb
      • m2=3t+2\frac{m}{2}=3t+22m=3t+2,走法bba

PS:代码虽然看着冗长,但本质是ctrl+c ctrl+v (#.#)

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 1005
int T, n, m;
bool flag;
char s[maxn][maxn];bool check0( int i, int j, int k ) {if( s[i][j] == 'b' && s[j][k] == 'a' && s[k][i] == 'b' ) return 1;else return 0;
}bool check1( int i, int j, int k ) {if( s[i][j] == 'b' && s[j][k] == 'b' && s[k][i] == 'a' ) return 1;else return 0;
}bool check2( int i, int j, int k ) {if( s[i][j] == 'a' && s[j][k] == 'b' && s[k][i] == 'b' ) return 1;else return 0;
}void print( int i, int j, int k ) {printf( "YES\n" );for( int p = 0;p <= ( m << 1 );p ++ ) {printf( "%d ", i );int t = i;i = j;j = k;k = t;}printf( "\n" );flag = 1;
}bool Check( int i, int j, int k ) {if( s[i][j] == s[j][k] && s[j][k] == s[k][i] ) return 1;else return 0;
}int check( int i, int j ) {for( int k = 1;k <= n;k ++ )if( s[i][j] == s[j][k] ) return k;return 0;
}void Print( int i, int j, int k ) {flag = 1;printf( "YES\n%d %d %d\n", i, j, k );
}int main() {scanf( "%d", &T );again :while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%s", s[i] + 1 );if( m & 1 ) {int now = 1;printf( "YES\n" );for( int i = 0;i <= m;i ++ ) {printf( "%d ", now );now = 3 - now;}printf( "\n" );goto again;}else {for( int i = 1;i < n;i ++ )for( int j = i + 1;j <= n;j ++ )if( s[i][j] == s[j][i] ) {printf( "YES\n" );for( int k = 0;k <= m;k ++ ) {printf( "%d ", i );swap( i, j );}printf( "\n" );goto again;}if( n == 2 ) {printf( "NO\n" );goto again;}m >>= 1;flag = 0;if( m == 1 ) {int pos;if( pos = check( 1, 2 ) ) Print( 1, 2, pos );else if( pos = check( 1, 3 ) ) Print( 1, 3, pos );else if( pos = check( 2, 1 ) ) Print( 2, 1, pos );else if( pos = check( 2, 3 ) ) Print( 2, 3, pos );else if( pos = check( 3, 1 ) ) Print( 3, 1, pos );else if( pos = check( 3, 2 ) ) Print( 3, 2, pos );}else {flag = 0;int k = m % 3;switch( k ) {case 0 : {if( Check( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check0( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check0( 1, 3, 2 ) ) print( 1, 3, 2 );else if( check0( 2, 1, 3 ) ) print( 2, 1, 3 );else if( check0( 2, 3, 1 ) ) print( 2, 3, 1 );else if( check0( 3, 1, 2 ) ) print( 3, 1, 2 );else if( check0( 3, 2, 1 ) ) print( 3, 2, 1 );break;}case 1 : {if( Check( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check1( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check1( 1, 3, 2 ) ) print( 1, 3, 2 );else if( check1( 2, 1, 3 ) ) print( 2, 1, 3 );else if( check1( 2, 3, 1 ) ) print( 2, 3, 1 );else if( check1( 3, 1, 2 ) ) print( 3, 1, 2 );else if( check1( 3, 2, 1 ) ) print( 3, 2, 1 );break;}case 2 : {if( Check( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check2( 1, 2, 3 ) ) print( 1, 2, 3 );else if( check2( 1, 3, 2 ) ) print( 1, 3, 2 );else if( check2( 2, 1, 3 ) ) print( 2, 1, 3 );else if( check2( 2, 3, 1 ) ) print( 2, 3, 1 );else if( check2( 3, 1, 2 ) ) print( 3, 1, 2 );else if( check2( 3, 2, 1 ) ) print( 3, 2, 1 );break;}}}if( ! flag ) printf( "NO\n" );}}return 0;
}

E. Sorting Books

如果直接去求操作谁,显然要考虑操作数量以及顺序问题,顺序问题一般都非常吃力不讨好

反过来从后往前考虑,去求不操的数量的最大值即可,这时候就不需要管顺序了

dpi:[i,n]dp_i:[i,n]dpi:[i,n] 最大不操次数,li,ri:il_i,r_i:ili,ri:i 值出现的最左点和最右点,cntc:cnt_c:cntc:iii位置为止ccc值出现的个数

  • 现在位置iii上的值的最左点就在iii处,那么贪心的可以选择[i,n][i,n][i,n]所有与aia_iai相同点不操作

    dprai+1+cntaidp_{r_{a_i}+1}+cnt_{a_i}dprai+1+cntai

  • 最左点不在iii处,贪心的也可以选择[i,n][i,n][i,n]所有出现的与aia_iai相同点不操作

    cntaicnt_{a_i}cntai

  • 位置iii操作

    dpi+1dp_{i+1}dpi+1

#include <cstdio>
#include <iostream>
using namespace std; 
#define maxn 500005
int n;
int a[maxn], l[maxn], r[maxn], cnt[maxn], dp[maxn];int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a[i] );if( ! l[a[i]] ) l[a[i]] = i;r[a[i]] = i;}for( int i = n;i;i -- ) {++ cnt[a[i]];dp[i] = dp[i + 1];if( i == l[a[i]] )dp[i] = max( dp[i], dp[r[a[i]] + 1] + cnt[a[i]] );elsedp[i] = max( dp[i], cnt[a[i]] );}printf( "%d\n", n - dp[1] );return 0;
}

F. AB Tree

  • 每层点赋一样的,可以使答案最优

    可以把每一层看成物品,物品的价值就是这一层的点数,跑一个01背包

    如果存在一组物品使得它们的和恰好为xxx,那么就直接输出层数即可

  • 非要修改的话,修改单层的叶子结点,可以使答案最优

    先找到叶子节点最多的一层,试图通过改当前层的叶子节点的状态来弥补DPDPDP状态

在此基础上,需要套用bitset优化即可卡过去

#include <cstdio>
#include <vector>
#include <bitset>
#include <iostream>
using namespace std;
#define maxn 100005
#define maxk 3000
vector < int > G[maxn], D[maxn];
int n, x, m;
int dep[maxn], num[maxn], id[maxn], w[maxn], leaf_cnt[maxn];
bool vis[maxn];
bitset < maxn > f[maxk];void dfs1( int u, int fa ) {dep[u] = dep[fa] + 1;m = max( m, dep[u] );num[dep[u]] ++;if( G[u].size() == 1 ) leaf_cnt[dep[u]] ++;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs1( v, u );}
}void dfs2( int x, int y ) {if( ! x ) return;for( int i = 0;i < D[x].size();i ++ ) {if( w[x] > y || f[x - 1][y] ) break;y -= w[x];vis[D[x][i]] = 1;}dfs2( x - 1, y );
}int main() {scanf( "%d %d", &n, &x );for( int i = 2, fa;i <= n;i ++ ) {scanf( "%d", &fa );G[fa].push_back( i );G[i].push_back( fa );}dfs1( 1, 0 );int tot = 0;for( int i = 1;i <= n;i ++ ) {//merge depth i who has the same nodes in numbersif( ! id[num[i]] ) {id[num[i]] = ++ tot;w[tot] = num[i];D[tot].push_back( i );}else D[id[num[i]]].push_back( i );}f[0][0] = 1;for( int i = 1;i <= tot;i ++ ) {f[i] = f[i - 1];int siz = D[i].size();for( int j = 1;j <= siz;j <<= 1 ) {siz -= j;f[i] |= f[i] << j * w[i];}if( siz ) f[i] |= f[i] << siz * w[i];}if( f[tot][x] ) {printf( "%d\n", m );dfs2( tot, x );for( int i = 1;i <= n;i ++ )if( vis[dep[i]] ) printf( "a" );else printf( "b" );}else {printf( "%d\n", m + 1 );int ans;for( int i = x;~ i;i -- )if( f[tot][i] ) {ans = i;break;}dfs2( tot, ans );int pos = -1;for( int i = 1;i <= m;i ++ )if( ! vis[i] && leaf_cnt[i] >= x - ans ) {pos = i;break;}for( int i = 1;i <= n;i ++ )if( dep[i] == pos && G[i].size() == 1 ) {if( ans == x ) printf( "b" );else printf( "a" ), ans ++;}else {if( vis[dep[i]] ) printf( "a" );else printf( "b" );}}return 0;
}

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

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

相关文章

洛谷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;等等…

Codeforces Round #724 (Div. 2) 题解

文章目录A. Omkar and Bad StoryB. Prinzessin der VerurteilungC. Diluc and KaeyaD. Omkar and MediansE. Omkar and ForestF. Omkar and Akmar#724-Div.2A. Omkar and Bad Story 直接set暴力加值&#xff0c;加满300300300个为止 #include <cstdio> #include <se…

2015沈阳区域赛

2015沈阳vj链接 题号题目知识点难度APattern StringBBazinga贪心签到题CMinimum Cut-CutDPagodas裴蜀定理签到题EEfficient TreeFFrogs欧拉函数银牌题GGame of Flying CircusHChessboardITriple二维线段树稳银快金JJohn’s FencesKKykneion asmaLNumber LinkMMeeting最短路&am…

模板:Prufer序列

所谓 Prufer 序列&#xff0c;就是 Prufer 发明的序列。 &#xff08;逃&#xff09; 前言 优雅的神奇魔术。 看名字很高大难&#xff0c;但实际上是高大清&#xff08;小清新&#xff09;。 很简单的建立起树与序列之间的双射&#xff0c;且这个序列的性质非常良好&#xff…

【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

介绍系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在微服务的应用中&#xff0c;统一的认证授权是必不可少的组件&#xff0c;本文将介绍微服务中网关和子服务如何使用统一的权限认证主要介绍内容为&#xff1a;1、子服务如何实现和网关相同的鉴权方式2、接口…

Codeforces Round #725 (Div. 3) 题解

文章目录A. Stone GameB. Friends and CandiesC. Number of PairsD. Another Problem About Dividing NumbersE. Funny SubstringsF. Interesting FunctionG. Gift Set#725-Div.3A. Stone Game 先找到最大值最小值的位置&#xff0c;然后有三种选取&#xff08;两边中走一边/两…