Codeforces Round #703 (Div. 2) 题解

文章目录

  • A. Shifting Stacks
  • B. Eastern Exhibition
  • C. Guessing the Greatest
  • D. Max Median
  • E. Paired Payment
  • F. Pairs of Paths

#703 (Div. 2)

A. Shifting Stacks

从左往右构造递增0,1,2...,如果这样都不能递增就肯定无解

雷区:不能用等差数列算个数,因为这个移动必须是左到右的不能逆,hack: 0 0 3 AC:NO WA:YES

B. Eastern Exhibition

以前考试遇到过的相似度百分之九十五,横纵坐标拆开分别取中位数即可;偶数个点中位数是一段区间

#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 1005
int T, n;
int x[maxn], y[maxn];signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld %lld", &x[i], &y[i] );sort( x + 1, x + n + 1 );sort( y + 1, y + n + 1 );if( n & 1 ) printf( "1\n" );else {int l = n >> 1, r = l + 1;printf( "%lld\n", ( x[r] - x[l] + 1 ) * ( y[r] - y[l] + 1 ) );}}return 0;
}

C. Guessing the Greatest

第一次询问整个序列确定次大值,然后再一次询问判断最大值是在左边还是右边

之后就是二分位置与次大值进行询问,找到最大值

煞笔二分再次死亡

#include <cstdio>
int n;int print( int l, int r ) {if( l >= r ) return -1;printf( "? %d %d\n", l, r );fflush( stdout );int pos;scanf( "%d", &pos );return pos;
}int main() {scanf( "%d", &n );int pos = print( 1, n );if( pos > 1 && print( 1, pos ) == pos ) {int l = 1, r = pos;while( l < r ) {int mid = ( l + r + 1 ) >> 1;if( print( mid, pos ) == pos ) l = mid;else r = mid - 1;}printf( "! %d\n", l );fflush( stdout );}else {int l = pos, r = n;while( l < r ) {int mid = ( l + r ) >> 1;if( print( pos, mid ) == pos ) r = mid;else l = mid + 1;}printf( "! %d\n", l );fflush( stdout );}return 0;
}

D. Max Median

二分最后的答案,将原数组转换为大于等于111小于−1-11,看有无一段长度大于等于kkk的区间和为

对于第iii个位置,有0,1,2,...,i−k0,1,2,...,i-k0,1,2,...,ik种选择,用前缀和最小值优化即可做到O(nlogn)O(nlogn)O(nlogn)

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 200005
int n, k, ans;
int a[maxn], b[maxn], minn[maxn];bool check( int x ) {for( int i = 1;i <= n;i ++ )if( a[i] >= x ) b[i] = 1;else b[i] = -1;for( int i = 1;i <= n;i ++ )b[i] += b[i - 1];for( int i = 1;i <= n;i ++ )minn[i] = min( minn[i - 1], b[i] );for( int i = k;i <= n;i ++ )if( b[i] > minn[i - k] ) return 1;return 0;
}int main() {scanf( "%d %d", &n, &k );for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );int l = 1, r = n;while( l <= r ) {int mid = ( l + r ) >> 1;if( check( mid ) ) ans = mid, l = mid + 1;else r = mid - 1;}printf( "%d\n", ans );return 0;
}

E. Paired Payment

如果可以一条一条边地走,就是一个dijkstra板子

但必须两条两条走,也就是说这一次走的边产生的贡献与上一条边边权挂钩

再观察边权范围,只有505050,小得离谱;很有可能就是从这里入手

不妨把上一条边权是多少带着dijkstra

disi,jdis_{i,j}disi,j表示走到iii点上一条的边权为jjj的最短路

最后为什么是disi,0dis_{i,0}disi,0,这是为了dijkstra的正确性,disi,0dis_{i,0}disi,0含义比较特殊,表示iii为结束点(第二条边的入点)

#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define int long long
#define maxn 200005
struct node {int u, lst, d;node(){}node( int U, int Lst, int D ) {u = U, lst = Lst, d = D;}bool operator < ( node t ) const {return d > t.d;}
};
int n, m;
priority_queue < node > q;
vector < pair < int, int > > G[maxn];
int dis[maxn][55];signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1, u, v, w;i <= m;i ++ ) {scanf( "%lld %lld %lld", &u, &v, &w );G[u].push_back( make_pair( v, w ) );G[v].push_back( make_pair( u, w ) );}memset( dis, 0x3f, sizeof( dis ) );dis[1][0] = 0;q.push( node( 1, 0, 0 ) );while( ! q.empty() ) {node t = q.top(); q.pop();int u = t.u, lst = t.lst;if( dis[u][lst] < t.d ) continue;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;int nxt = lst ? 0 : w;if( dis[v][nxt] > dis[u][lst] + 2 * lst * w + w * w )q.push( node( v, nxt, dis[v][nxt] = dis[u][lst] + 2 * lst * w + w * w ) );}}for( int i = 1;i <= n;i ++ )if( dis[i][0] >= 0x3f3f3f3f ) printf( "-1 " );else printf( "%lld ", dis[i][0] );return 0;
}

F. Pairs of Paths

事实上,只有两种情况

case 1: 两条路径相交于一条路径的lcalcalca

case 2: 两条路径拥有公共的lcalcalca

这意味着,符合条件的答案一定是交于某个lcalcalca

对于每一条路径都定义一个三元组(a,b,lca)(a,b,lca)(a,b,lca),其中a,ba,ba,b分别表示两个端点的树根,如果端点是lcalcalca,那么重新给个编号(因为这时候要判定为不同)

case1:lcalcalca排序,aaa严格递减排序后,用桶存储之前信息,然后每次加S−cntbS-cnt_bScntb,然后再把cnta++,cntb++cnt_a++,cnt_b++cnta++,cntb++

case2: 另一个lcalcalca一定是这个交点lcalcalca的祖先,用树状数组记录

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 600005
#define int long long
struct node{int u, v, tu, tv, lca;
}MS[maxn];
vector < int > G[maxn];
int n, m, T, cnt;
int dep[maxn], l[maxn], r[maxn], tree[maxn], tot[maxn];
int f[maxn][20];bool cmp( node x, node y ) {if( dep[x.lca] == dep[y.lca] )if( x.lca == y.lca ) return x.tu > y.tu;else return x.lca < y.lca;elsereturn dep[x.lca] < dep[y.lca];
}void dfs( int u, int fa ) {dep[u] = dep[fa] + 1, f[u][0] = fa;for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];l[u] = ++ cnt;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs( v, u );}r[u] = cnt;
}int lca( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 19;~ i;i -- )if( dep[f[u][i]] >= dep[v] )u = f[u][i];if( u == v ) return u;for( int i = 19;~ i;i -- )if( f[u][i] != f[v][i] )u = f[u][i], v = f[v][i];return f[u][0];
}int get_top( int u, int lca ) {if( u == lca ) return ++ T;for( int i = 19;~ i;i -- )if( dep[f[u][i]] > dep[lca] )u = f[u][i];return u;
}int lowbit( int x ) {return x & ( -x );
}void add( int x ) {for( int i = x;i <= n;i += lowbit( i ) )tree[i] ++;
}int ask( int x ) {int ans = 0;for( int i = x;i;i -= lowbit( i ) )ans += tree[i];return ans;
}signed main() {scanf( "%lld", &n ); T = n;for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 1, 0 );scanf( "%lld", &m );for( int i = 1;i <= m;i ++ ) {scanf( "%lld %lld", &MS[i].u, &MS[i].v );MS[i].lca = lca( MS[i].u, MS[i].v );MS[i].tu = get_top( MS[i].u, MS[i].lca );MS[i].tv = get_top( MS[i].v, MS[i].lca );if( MS[i].tu > MS[i].tv ) {swap( MS[i].tu, MS[i].tv );swap( MS[i].u, MS[i].v );}}sort( MS + 1, MS + m + 1, cmp );int ans = 0;for( int i = 1, j;i <= m;i = j + 1 ) { j = i;while( j < m && MS[j + 1].lca == MS[i].lca ) j ++;cnt = 0;for( int s = i, t;s <= j;s = t + 1 ) {t = s;while( t < j && MS[t + 1].tu == MS[s].tu ) t ++;for( int k = s;k <= t;k ++ )ans += cnt - tot[MS[k].tv];for( int k = s;k <= t;k ++ )tot[MS[k].tv] ++, tot[MS[k].tu] ++;cnt += ( t - s + 1 );}for( int k = i;k <= j;k ++ )tot[MS[k].tu] = tot[MS[k].tv] = 0;for( int k = i;k <= j;k ++ ) {ans += ask( r[MS[k].lca] ) - ask( l[MS[k].lca] - 1 );if( MS[k].tu <= n ) ans -= ask( r[MS[k].tu] ) - ask( l[MS[k].tu] - 1 );if( MS[k].tv <= n )ans -= ask( r[MS[k].tv] ) - ask( l[MS[k].tv] - 1 );} for( int k = i;k <= j;k ++ )add( l[MS[k].u] ), add( l[MS[k].v] );}printf( "%lld\n", ans );return 0;
}

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

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

相关文章

AGAGA XOOORRR CodeForces - 1516B

AGAGA XOOORRR CodeForces - 1516B 题意&#xff1a; 给定一个长度为n的序列&#xff0c;对其进行若干次操作&#xff0c;每次操作将某相邻两数变为他们的异或和&#xff08;操作后序列长度减一&#xff09;。问是否可以经过若干次操作&#xff0c;得到一个长度至少为2且所有…

2.8模拟总结

前言 80pts 303020 rnk10 三个暴力分… T2拿虚树玩了半天结果假了qwq 乍一看似乎都挺可做的。 但是一道都做不出来 &#xff08;觉得写考场过程有点流水账&#xff0c;不写了&#xff0c;一些想说的写在对应题目里吧&#xff09; 题目解析 T1 三角查找&#xff08;triangle&…

如何在ASP.NET Core中使用JSON Patch

原文&#xff1a; JSON Patch With ASP.NET Core作者&#xff1a;.NET Core Tutorials译文&#xff1a;如何在ASP.NET Core中使用JSON Patch地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10433615.html译者&#xff1a;Lamond LuJSON Patch是一种使用API显式更新文档的方…

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

文章目录A. Prison BreakB. Restore ModuloC. Basic DiplomacyD. PlaylistE. Skyline PhotoF. Useful Edges#709 (Div. 2)A. Prison Break 就是每个监狱破一扇门&#xff0c;输出aba\times bab即可 B. Restore Modulo 就是取模意义下的操作&#xff0c;分大小操作&#xff0…

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;个字…