Codeforces Round #709 (Div. 2, based on Technocup 2021 Final Round) 题解

文章目录

  • A. Prison Break
  • B. Restore Modulo
  • C. Basic Diplomacy
  • D. Playlist
  • E. Skyline Photo
  • F. Useful Edges

#709 (Div. 2)

A. Prison Break

就是每个监狱破一扇门,输出a×ba\times ba×b即可

B. Restore Modulo

就是取模意义下的操作,分大小操作,随便确定两个差值,然后构造即可

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 100005
int T, n;
int a[maxn];signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );if( n == 1 ) {printf( "0\n" );continue;}int d1 = -1, d2 = -1;bool flag = 0;for( int i = 1;i < n;i ++ )if( a[i + 1] > a[i] )if( ~ d1 )if( a[i + 1] - a[i] != d1 ) {flag = 1;break;} else;else d1 = a[i + 1] - a[i];elseif( ~ d2 )if( a[i] - a[i + 1] != d2 ) {flag = 1;break;} else;else d2 = a[i] - a[i + 1];if( flag ) printf( "-1\n" );else if( d1 == -1 || d2 == -1 ) printf( "0\n" );else {int maxx = 0;for( int i = 1;i <= n;i ++ ) maxx = max( maxx, a[i] );if( d1 + d2 <= maxx ) printf( "-1\n" );else printf( "%lld %lld\n", d1 + d2, ( a[2] + d1 + d2 - a[1] ) % ( d1 + d2 ) );}}return 0;
}

C. Basic Diplomacy

贪心,对于某天有多种选择的肯定优先满足限制比较死的,比如某天就必须和某人玩

发现,只要k=1k=1k=1的条件满足,后面只要使用次数没超过一半就可以跟那个人玩

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 100005
vector < int > G[maxn];
int T, n, m;
int cnt[maxn], ans[maxn], used[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) cnt[i] = used[i] = 0;for( int i = 1;i <= m;i ++ ) G[i].clear();for( int i = 1, k;i <= m;i ++ ) {scanf( "%d", &k );for( int j = 1, x;j <= k;j ++ ) {scanf( "%d", &x );G[i].push_back( x );cnt[x] ++;}if( k == 1 ) ans[i] = G[i][0], used[G[i][0]] ++;}int lim = ( m + 1 ) >> 1;for( int i = 1;i <= m;i ++ )if( G[i].size() == 1 ) continue;else {for( int j = 0;j < G[i].size();j ++ )if( used[G[i][j]] >= lim ) continue;else {ans[i] = G[i][j];used[G[i][j]] ++;break;}}bool flag = 0;for( int i = 1;i <= n;i ++ )if( used[i] > lim ) {flag = 1;break;}if( flag ) printf( "NO\n" );else {printf( "YES\n" );for( int i = 1;i <= m;i ++ )printf( "%d ", ans[i] );printf( "\n" );}}return 0;
}

D. Playlist

想复杂了——就是分类大讨论

可以找两个质数,例如1e9+91e9+91e9+9,遇到不互质的时候就赋质数

#include <cstdio>
#include <queue>
using namespace std;
#define maxn 100005
queue < int > q, ans;
int T, n;
int a[maxn], pos[maxn];
bool vis[maxn];int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y );
}int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) vis[i] = pos[i] = 0;for( int i = 1;i <= n;i ++ ) scanf( "%d", &a[i] );for( int i = 1;i < n;i ++ )if( gcd( a[i], a[i + 1] ) == 1 )ans.push( i + 1 ), vis[i + 1] = 1, q.push( i ), pos[i] = i + 1, i ++;if( ! vis[n] && gcd( a[n], a[1] ) == 1 ) ans.push( 1 ), vis[1] = 1, q.push( n ), pos[n] = 2;while( ! q.empty() ) {int t = q.front(); q.pop();if( vis[t] ) continue;if( pos[t] == n + 1 ) pos[t] = 1;while( vis[pos[t]] )pos[t] = pos[t] == n ? 1 : pos[t] + 1;if( gcd( a[pos[t]], a[t] ) == 1 ) ans.push( pos[t] ), vis[pos[t]] = 1, q.push( t ), pos[t] ++;}printf( "%d ", ans.size() );while( ! ans.empty() ) printf( "%d ", ans.front() ), ans.pop();printf( "\n" );}return 0;
}

E. Skyline Photo

普通的DPDPDP式子:dpi=dpj+w(j+1,i)dp_i=dp_j+w(j+1,i)dpi=dpj+w(j+1,i)

w(j+1,i)w(j+1,i)w(j+1,i)事实上是单调栈更新到iii时,栈里面第一个下标大于jjj的房子的美丽度

对于栈里面的第iii个元素,管辖着区间(si−1,si](s_{i-1},s_i](si1,si],维护的是递增的单调栈

fi=maxk=1top(maxj=sk−1+1skfj+bsk)f_i=max_{k=1}^{top}(max_{j=s_{k-1}+1}^{s_k}f_j+b_{s_k})fi=maxk=1top(maxj=sk1+1skfj+bsk)

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 300005
int n, top;
int h[maxn], b[maxn], s[maxn], g[maxn], f[maxn], dp[maxn];signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &h[i] );for( int i = 1;i <= n;i ++ )scanf( "%lld", &b[i] );g[0] = -1e18;for( int i = 1;i <= n;i ++ ) {int t = dp[i - 1];while( top && h[s[top]] > h[i] ) {t = max( t, f[top] );top --;}s[++ top] = i, f[top] = t;dp[i] = g[top] = max( g[top - 1], t + b[i] );/*(s[top-1],i]这一段被弹出的元素高度都比i高g[top-1]:把(s[top-1],i]这一段跟[1,s[top-1]]合并 答案就在比i矮的s[top-1]身上t+b[i]: (s[top-1],i]单独成段 最矮的就是i */}printf( "%lld\n", dp[n] );return 0;
}

F. Useful Edges

如果一条边(x,y,c)(x,y,c)(x,y,c)和三元组(u,v,l)(u,v,l)(u,v,l),满足disu,x+c+disv,y≤ldis_{u,x}+c+dis_{v,y}\le ldisu,x+c+disv,yl,则该边合法

目前来看是非常朴素的O(n4)O(n^4)O(n4),数据范围只能承受O(n3)O(n^3)O(n3),考虑降维(对角线想法)

disu,x+c+disv,y≤l⇔disv,y+c≤l−disu,xdis_{u,x}+c+dis_{v,y}\le l \Leftrightarrow dis_{v,y}+c\le l-dis_{u,x}disu,x+c+disv,yldisv,y+cldisu,x

只需要枚举u,x,vu,x,vu,x,v便能求出l−disu,xl-dis_{u,x}ldisu,x的最大值,再u,x,yu,x,yu,x,y找到左边满足条件的边(v,yv,yv,y同地位循环)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define int long long
#define maxn 605
pair < int, int > edge[maxn * maxn / 2];
int dis[maxn][maxn], w[maxn][maxn], l[maxn][maxn];
bool flag[maxn][maxn];
int u[maxn], v[maxn];
int n, m, Q, ans;signed main() {memset( dis, 0x3f, sizeof( dis ) );scanf( "%lld %lld", &n, &m );for( int i = 1, u, v, c;i <= m;i ++ ) {scanf( "%lld %lld %lld", &u, &v, &c );edge[i] = make_pair( u, v );w[u][v] = w[v][u] = dis[u][v]= dis[v][u] = c;}for( int i = 1;i <= n;i ++ )dis[i][i] = 0;for( int k = 1;k <= n;k ++ )for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )dis[i][j] = min( dis[i][j], dis[i][k] + dis[k][j] );scanf( "%lld", &Q );while( Q -- ) {int u, v, x;scanf( "%lld %lld %lld", &u, &v, &x );l[u][v] = l[v][u] = max( l[u][v], x );}for( int v = 1;v <= n;v ++ ) {for( int x = 1;x <= n;x ++ ) {int maxx = 0;for( int u = 1;u <= n;u ++ )maxx = max( maxx, l[u][v] - dis[u][x] );for( int y = 1;y <= n;y ++ ) {if( dis[y][v] + w[x][y] <= maxx ) flag[x][y] = flag[y][x] = 1;}}}int ans = 0;for( int i = 1;i <= m;i ++ )if( flag[edge[i].first][edge[i].second] ) ans ++;printf( "%lld\n", ans );return 0;
} 

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

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

相关文章

351E. Jeff and Permutation

351E. Jeff and Permutation 题意&#xff1a; 一个长度为n的序列&#xff0c;你可以选择一些位置&#xff0c;使其变成相反数&#xff0c;问逆序对最少是多少&#xff1f; 题解&#xff1a; 对于第i位&#xff0c;我们开始考虑他能决定的逆序对&#xff1f;对于其他任意位…

.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

众所周知在.NET下的RSA类所生成的密钥为Xml格式&#xff0c;而其他语言比如java一般使用pkcs8格式的密钥&#xff0c;JavaScript一般使用pkcs1格式。我们在开发过程中很可能遇到需要与其他语言开发的api进行对接&#xff0c;如果遇到RSA加密解密&#xff0c;我们肯定需要保证ke…

2.9模拟总结

文章目录前言题目解析序列计数&#xff08;sequence&#xff09;T2 网格选点&#xff08;grid&#xff09;T3 孤立点集&#xff08;isolated&#xff09;代码T1T2T3总结前言 180pts 3050100 rnk10 题目比较简单的一场考试。 不太满意。 T3是做过的原题&#xff0c;切了不算啥…

AtCoder Beginner Contest 203(Sponsored by Panasonic)题解

文章目录A - ChinchirorinB - AtCoder CondominiumC - Friends and Travel costsD - PondE - White PawnF - WeedABC203A - Chinchirorin 三个条件if判 #include <cstdio> int main() {int a, b, c;scanf( "%d %d %d", &a, &b, &c );if( a b ) …

AcWing 1068. 环形石子合并

AcWing 1068. 环形石子合并 题意&#xff1a; n堆石头围成一个圈&#xff0c;然后将相邻两堆合并成新的一堆&#xff0c;得分为新的一堆的石头数 问最高得分合最低得分 题解&#xff1a; 很简单&#xff0c;区间dp的模板题 和这个题一样 状态转移方程&#xff1a; dpmax[i]…

2.10模拟总结

文章目录前言题目解析随机减法&#xff08;calculate&#xff09;大图书馆&#xff08;bibliotheca&#xff09;子串选取 &#xff08;substr&#xff09;代码T1T2T3总结前言 200pts 4010060 rnk3 拿到牌勒嘿嘿嘿&#xff08;脑补流口水黄豆&#xff09; T3两个log想在ybt的机…

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

加分二叉树

加分二叉树 题意&#xff1a; 给你一个数的中序表达式&#xff0c;然后一颗子树的分数左子树的分数*右子树的分数根的分数 给你所有点的分数&#xff0c;让你构造出分值最大的树&#xff0c;输出前序遍历 题解&#xff1a; 区间dp问题 设dp[i][j]表示中序遍历是w[i~j]的所有…

AtCoder ZONe Energy Programming Contest 题解

文章目录A - UFO InvasionB - Sign of FriendshipC - MAD TEAMD - Message from AliensE - SneakingF - Encounter and FarewellZONe Energy Programming ContestA - UFO Invasion 太简单了。 #include <cstdio> char ch[10] { Z, O, N, e }; char s[20];int main() {…

2.11模拟总结

前言 145&#xff08;175&#xff1f;&#xff09;pts 100450&#xff08;30&#xff1f;&#xff09; rnk11&#xff08;8&#xff1f;&#xff09; 之所以有括号是因为T3莫名其妙的TLE了&#xff1f; 考后我一模一样的码再交一遍30分就到手了… 应该不是我的问题吧&#xff…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…

【学习笔记】浅谈短小可爱的左偏树(可并堆)

文章目录左偏树左偏树的合并(merge)操作例题罗马游戏[Apio2012]dispatching[JLOI2015]城池攻占[Baltic2004]sequence左偏树 左偏树是一个堆&#xff0c;而且是一个可并堆&#xff0c;所以一定有权值的限制 以小根堆为例&#xff0c;那么必须满足节点权值小于左右儿子权值&…

2.12 模拟

文章目录前言题目解析染色计划&#xff08;color&#xff09;奇度边集&#xff08;edges&#xff09;猜拳游戏&#xff08;guess&#xff09;代码T1T2LCT整体二分总结前言 120pts 期望&#xff1a;4010020160 实际&#xff1a;406020120 rnk 9 我yue了。 怎么又是不可抗力性挂…

Acwing1069. 凸多边形的划分

Acwing1069. 凸多边形的划分 题意&#xff1a; 一个N个顶点的凸多边形&#xff0c;划分成N-2个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&#xff0c;试求所有三角形的顶点权值乘积之和至少为多少。 题解&#xff1…

徐磊(Devops):一名写了十几年代码但还没写够的程序员

徐磊&#xff08;Devops 社区领袖&#xff09;【个人介绍】徐磊&#xff0c;微软MVP&#xff08;微软最有价值专家&#xff0c;大中华区域社区技术总监&#xff0c;Devops 社区领袖&#xff09;&#xff0c;从事过网管、技术支持、网络、软件开发等工作&#xff0c;一名写了十几…

加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版)

文章目录descriptionsolutioncode#3483. SGU505 Prefixes and suffixes&#xff08;询问在线版&#xff09;description 给定&#x1d45b;个字符串&#xff0c;有&#x1d45a;个询问。 每个询问给出两个字符串&#x1d460;1, &#x1d460;2&#xff0c;问&#x1d45b;个字…

AcWing 320. 能量项链

AcWing 320. 能量项链 题意&#xff1a; 题解&#xff1a; 和环形石头合并基本一样 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf("%s %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s0,w1;char c…

ERP不规范,同事两行泪

最近的很多次对外交流&#xff0c;都聊到了ERP建设的话题&#xff0c;并且无一例外的不那么让人省心&#xff0c;回想我这么多年走过的ERP坑坑路&#xff0c;在这里也写下经验和总结&#xff0c;希望能给正在或者即将走上ERP建设路的企业一些思考和帮助。导读1、几个瞎眼而普遍…

2.13模拟总结

文章目录前言题目解析最小划分&#xff08;divide&#xff09;进制路径&#xff08;base&#xff09;欧拉欧拉&#xff08;eular&#xff09;代码T1T2T3总结前言 day9 170pts 期望&#xff1a;10010020220 实际&#xff1a;701000170 rnk7 挂的分有点多qwq 分数要是得满就能拿…

Panasonic Programming Contest (AtCoder Beginner Contest 195) 题解

文章目录A - Health M DeathB - Many OrangesC - CommaD - Shipping CenterE - Lucky 7 BattleF - Coprime PresentPanasonic Programming Contest (AtCoder Beginner Contest 195)A - Health M Death 判断倍数。 #include <cstdio> int main() {int M, H;scanf( "…