NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

文章目录

  • A - 2nd Greatest Distance
  • B - RGB Matching
  • C - Odd Even Sort
  • D - 1 or 2
  • E - Directed Tree
  • F - Logical Operations on Tree

NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

A - 2nd Greatest Distance

大模拟讨论yyds

将点按x,yx,yx,y分别排序

  • xxx贡献最大值的点对等于yyy贡献最大值的点对

    次小值就变成x/yx/yx/y中最大次小和次大最小一共四种组合中的最大值

  • xxx最大最小贡献点对不等于yyy最大最小点对

    • xxx最大最小更大

      yyy最大最小与xxx中次大最小和最大次小比较

    • yyy最大最小更大

      xxx最大最小与yyy中次大最小和最大次小比较

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
struct node {int x, y, id;
}h1[maxn], h2[maxn];
int n;bool cmp1( node s, node t ) {return s.x < t.x;
}bool cmp2( node s, node t ) {return s.y < t.y;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%lld %lld", &h1[i].x, &h1[i].y );h1[i].id = i;h2[i] = h1[i];}sort( h1 + 1, h1 + n + 1, cmp1 );sort( h2 + 1, h2 + n + 1, cmp2 );if( ( h1[1].id == h2[1].id && h1[n].id == h2[n].id ) || ( h1[1].id == h2[n].id && h1[n].id == h2[1].id ) )printf( "%lld\n", max( max( h1[n].x - h1[2].x, h1[n - 1].x - h1[1].x ), max( h2[n].y - h2[2].y, h2[n - 1].y - h2[1].y ) ) );else if( h1[n].x - h1[1].x < h2[n].y - h2[1].y )printf( "%lld\n", max( h1[n].x - h1[1].x, max( h2[n].y - h2[2].y, h2[n - 1].y - h2[1].y ) ) );elseprintf( "%lld\n", max( h2[n].y - h2[1].y, max( h1[n].x - h1[2].x, h1[n - 1].x - h1[1].x ) ) );return 0;
}

B - RGB Matching

显然,最后要么三种颜色的狗全是偶数条,两两配对,答案为000;要么只会恰有两种颜色的狗为奇数条

case 1

两种颜色中选择不满意值相差最小的两条狗

具体来说,枚举一种颜色的狗,再二分左右求出与该狗不满意值差距最小的狗,整体不满意值取最小值

case 2

第三颜色狗起一个中转点的作用

具体来说,分别枚举两种颜色的狗,以及在第三颜色中求出与枚举狗不满意值差距最小的狗

整体取不满意值最小,两种颜色最小再相加

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
vector < int > G[3];
int n, pos_l, pos_r;int id( char ch ) {if( ch == 'R' ) return 0;if( ch == 'B' ) return 1;if( ch == 'G' ) return 2;
}int Fabs( int x ) {return x < 0 ? -x : x;
}void work( int c, int val ) {int l = 0, r = G[c].size() - 1;pos_l = 0, pos_r = G[c].size() - 1;while( l <= r ) {int mid = ( l + r ) >> 1;if( G[c][mid] <= val ) pos_l = mid, l = mid + 1;else r = mid - 1;}l = 0, r = G[c].size() - 1;while( l <= r ) {int mid = ( l + r ) >> 1;if( G[c][mid] >= val ) pos_r = mid, r = mid - 1;else l = mid + 1;}
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= ( n << 1 );i ++ ) {char c; int a;scanf( "%lld %c", &a, &c );G[id( c )].push_back( a );}int c1 = -1, c2 = -1;for( int i = 0;i < 3;i ++ )if( G[i].size() & 1 ) {if( ~ c1 ) c2 = i;else c1 = i;}if( c1 == -1 ) return ! printf( "0\n" );else {int ans = 1e18;sort( G[c2].begin(), G[c2].end() );for( int i = 0;i < G[c1].size();i ++ ) {work( c2, G[c1][i] );ans = min( ans, min( Fabs( G[c1][i] - G[c2][pos_l] ), Fabs( G[c2][pos_r] - G[c1][i] ) ) );}int ans1 = 1e18, ans2 = 1e18, c;for( int i = 0;i < 3;i ++ )if( c1 == i || c2 == i ) continue;else c = i;if( ! G[c].size() ) goto pass;sort( G[c].begin(), G[c].end() );for( int i = 0;i < G[c1].size();i ++ ) {work( c, G[c1][i] );ans1 = min( ans1, min( Fabs( G[c1][i] - G[c][pos_l] ), Fabs( G[c][pos_r] - G[c1][i] ) ) );}for( int i = 0;i < G[c2].size();i ++ ) {work( c, G[c2][i] );ans2 = min( ans2, min( Fabs( G[c2][i] - G[c][pos_l] ), Fabs( G[c][pos_r] - G[c2][i] ) ) );}pass : printf( "%lld\n", min( ans, ans1 + ans2 ) );}return 0;
}

C - Odd Even Sort

题读错做法千奇百怪错 奇数次操作只能操作奇数位置,偶数次操作只能操作偶数位置

问题不要求操作最小,只求不超过n2n^2n2(冒泡排序复杂度),想法一下子就来了,明显的构造

从最大值往最小值依次考虑(kkk),也就是只用考虑右移的操作

不难发现,如果kkk本身处于位置与操作次数恰好同奇偶,那么可以直接一直操作kkk直到位置kkk

如果不同奇偶,那么就像能否先操作一次无关的位置,再一直操作kkk

这显然是可以的,每次奇偶就让1,21,21,2位置与后面一个进行交换

当然还有位置与值已经匹配的,直接下一个哈

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 505
int T, n;
int a[maxn], b[maxn], ans[maxn * maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] ), b[i] = a[i];sort( b + 1, b + n + 1 );int cnt = 0, ip = n;for( int t = 1;t <= n * n && ip;t ++ ) {bool flag = 0;for( int i = 1;i < n;i ++ )if( a[i] > a[i + 1] ) {flag = 1;break;}if( ! flag ) break;int pos;for( int i = 1;i <= n;i ++ )if( a[i] == b[ip] ) {pos = i;break;}if( ( pos & 1 ) == ( t & 1 ) ) {while( pos < ip ) {ans[++ cnt] = pos;t ++;swap( a[pos], a[pos + 1] );pos ++;}t --;ip --;}else {flag = 1;for( int i = ( ( t & 1 ) ? 1 : 2 );i < n;i += 2 )if( a[i] > a[i + 1] ) {ans[++ cnt] = i;swap( a[i], a[i + 1] );flag = 0;break;}if( flag ) {int x = ( ( t & 1 ) ? 1 : 2 );ans[++ cnt] = x;swap( a[x], a[x + 1] );}}}printf( "%d\n", cnt );if( cnt ) {for( int i = 1;i <= cnt;i ++ )printf( "%d ", ans[i] );printf( "\n" );}}return 0;
}

D - 1 or 2

肯定是最大最小,次大次小…一一配对

a<b<c<d⇒max(a+d,b+c)≤max(a+c,b+d);min(a+c,b+d)≤min(a+d,b+c)a<b<c<d\Rightarrow max(a+d,b+c)\le max(a+c,b+d);min(a+c,b+d)\le min(a+d,b+c)a<b<c<dmax(a+d,b+c)max(a+c,b+d);min(a+c,b+d)min(a+d,b+c)

如果是一个蛋糕,不妨看做和000合并,所以只需要枚举000的个数排序顺次合并即可,O(n2)O(n^2)O(n2)

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 5005
#define int long long
vector < int > g;
int n;signed main() {scanf( "%lld", &n );for( int i = 1, x;i <= n;i ++ ) {scanf( "%lld", &x );g.push_back( x );}sort( g.begin(), g.end() );int Size = g.size(), maxx = -1e18, minn = 1e18;for( int i = 0;i < ( Size >> 1 );i ++ ) {maxx = max( g[Size - 1 - i] + g[i], maxx );minn = min( g[Size - 1 - i] + g[i], minn );}if( Size & 1 ) {maxx = max( g[Size >> 1], maxx );minn = min( g[Size >> 1], minn );}int ans = maxx - minn;for( int i = 1;i <= n;i ++ ) {g.push_back( 0 ), Size ++;for( int i = Size - 1;i;i -- )if( g[i] < g[i - 1] ) swap( g[i], g[i - 1] );else break;maxx = -1e18, minn = 1e18;for( int i = 0;i < ( Size >> 1 );i ++ ) {maxx = max( g[Size - 1 - i] + g[i], maxx );minn = min( g[Size - 1 - i] + g[i], minn );}if( Size & 1 ) {maxx = max( g[Size >> 1], maxx );minn = min( g[Size >> 1], minn );}ans = min( ans, maxx - minn );}printf( "%lld\n", ans );return 0;
} 

E - Directed Tree

套路都见过,却没有反应过来

dpi,j:idp_{i,j}:idpi,j:i 子树内不满足条件的节点数为jjj

dpu,j+k=∑j=0sizeu∑k=0sizevdpu,j×dpv,kdp_{u,j+k}=\sum_{j=0}^{size_u}\sum_{k=0}^{size_v}dp_{u,j}\times dp_{v,k}dpu,j+k=j=0sizeuk=0sizevdpu,j×dpv,k

最后容斥

ans=∑i=0n(−1)idp1,i×(n−i)!ans=\sum_{i=0}^n(-1)^idp_{1,i}\times (n-i)!ans=i=0n(1)idp1,i×(ni)!

#include <cstdio>
#include <vector>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 2005
vector < int > G[maxn];
int n;
int fac[maxn], siz[maxn], g[maxn];
int dp[maxn][maxn];void dfs( int u ) {dp[u][0] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];dfs( v );for( int j = 0;j <= siz[u];j ++ )for( int k = 0;k <= siz[v];k ++ )g[j + k] = ( g[j + k] + dp[u][j] * dp[v][k] % mod ) % mod;siz[u] += siz[v];for( int j = 0;j <= siz[u];j ++ )dp[u][j] = g[j], g[j] = 0;}for( int i = siz[u];~ i;i -- )dp[u][i + 1] = ( dp[u][i + 1] + dp[u][i] * ( siz[u] - i ) % mod ) % mod;siz[u] ++;
}signed main() {scanf( "%lld", &n );for( int i = 2, p;i <= n;i ++ ) {scanf( "%lld", &p );G[p].push_back( i );}dfs( 1 );fac[0] = 1;for( int i = 1;i <= n;i ++ )fac[i] = fac[i - 1] * i % mod;int ans = 0;for( int i = 0;i <= n;i ++ )if( i & 1 ) ans = ( ans - dp[1][i] * fac[n - i] % mod + mod ) % mod;else ans = ( ans + dp[1][i] * fac[n - i] % mod ) % mod;printf( "%lld\n", ans );return 0;
}

F - Logical Operations on Tree

N=1N=1N=1结果显然,考虑其他情况

如果一个叶子标记为1并且与之相连的边是OR

不管其它长什么样都可以将这条边的操作放在最后一步,从而符合要求,简称好树

接下来考虑没有这种叶子,合并出新点的情况

  • 如果叶子u的标记为0,且相连边是AND,则这条边操作后,新点一定标记为0

    如果执行这条边后的树是好树,那么原来的树也一定是好树

  • 如果叶子u的标记为0,且相连边是OR,则这条边操作后,原来与叶子相连点的标记即为新点标记

    如果执行这条边后的树是好树,那么原来的树也一定是好树

  • 如果叶子u的标记为1,且相连边是AND,则这条边操作后,原来与叶子相连点的标记即为新点标记

    如果执行这条边后的树是好树,那么原来的树也一定是好树

在树上从叶子到父亲搭建,出现1 OR时剩下的点边不管是什么,一定也是好树了;否则把叶子扔掉,父亲节点可能为0/1,在树上DPDPDP

f:f:f: 子树内没有出现1 OR想要边的树个数,$g: $ 在fff所有方案数中好树的个数

ps:没有出现1 OR这种关键叶子标记1指向父亲种类,但是可以出现1 OR父亲标记1的情况,因为可能父亲的其它儿子操作时会导致父亲标记变化

#include <cstdio>
#include <vector>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 100005
vector < int > G[maxn];
int n;
int f[maxn], g[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void dfs( int u, int fa ) {f[u] = 2, g[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs( v, u );f[u] = ( ( f[v] * 2 - g[v] ) * f[u] % mod + mod ) % mod;g[u] = g[u] * f[v] % mod;}
}signed main() {scanf( "%lld", &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 );printf( "%lld\n", ( qkpow( 2, n * 2 - 1 ) - f[1] + g[1] + mod ) % mod );return 0;
} 

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

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

相关文章

F - Heron and His Triangle UVALive - 8206

F - Heron and His Triangle UVALive - 8206 题意&#xff1a; 给你应该n&#xff0c;然后求一个最小的t&#xff0c;问长度为t-1&#xff0c;t&#xff0c;t1所组成的三角形的面积为整数,t>n 题解&#xff1a; 这题我一开始被题目的-1给迷惑了&#xff0c;以为筛出所有…

YBTOJ:最短时间(长链剖分、线段树)

解析 不难得到最优策略&#xff1a;先尽可能的快的送死直到路径畅通无组&#xff0c;然后一口气冲到t点。 现在的难点就在于如何尽可能的快的送掉特定的次数。 不难发现&#xff0c;花费时间关于死亡次数的函数必然是一个下凸包。 设 fx,if_{x,i}fx,i​ 表示子树内距离 xxx 不…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)

文章目录descriptionsolutioncode【模板】k短路 / [SDOI2010]魔法猪学院description iPig 在假期来到了传说中的魔法猪学院&#xff0c;开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后&#xff0c;iPig 对猪世界的世界本原有了很多的了解&#xff1…

Infinite Fraction Path UVALive - 8207

Infinite Fraction Path UVALive - 8207 题意&#xff1a; 给你n个数&#xff0c;每个数在0到9之间&#xff0c;每个数的下标一次是0~n-1&#xff0c;然后他所能走到的数为(i^21)%n,i为他本身的下标&#xff0c;然后让你求走n步&#xff0c;每一步的数相连&#xff0c;形成的…

YBTOJ洛谷P4869:出现位置(线性基)

解析 关键结论&#xff1a; 若 nnn 个数组成的线性基大小为 SSS&#xff0c;则其子集异或组成的结果有 2S2^S2S 种&#xff0c;且每种结果都有 2n−S2^{n-S}2n−S 种方案。 证明&#xff1a;考虑 n−Sn-Sn−S 个没有加入线性基的元素的任意一个子集&#xff0c;其异或和为 xxx…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分&#xff0c;我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库&#xff0c;是针对Microsoft Graph开发的场景的&#xff0c;有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

2017 ICPC沈阳区域赛

2017 沈阳区域赛 题号题目难度知识点ABBP FormulaBBridgeCEmpty Convex PolygonsDDefense of the AncientsEFive-round Show HandFHeron and His Triangle铜牌题推式子思维GInfinite Fraction Path快银稳铜dfs剪枝HLegends of the Three KingdomsILittle Boxes签到题大数JNew …

YBROJ洛谷P3211:XOR和路径(线性基,期望dp)

解析 不难想到第一步利用期望线性性逐位考虑。 然后就变成求一个布尔变量的期望了&#xff0c;可以直接转化为求概率。 我一开始的想求从1出发异或和为0/1的概率&#xff0c;然而这个东西在原点1附近的转移特别别扭…老出现概率大于1的迷惑情况。 然后我就不会了 正解是反过…

切题 (problem)(线段树+最大流最小割)

切题 problemdescriptionsolutioncodedescription 在一个神秘的 JOSLFN 上&#xff0c;wzy 和 lqs2015 常年占据着切题榜的 rk1 和 rk2。现在他们在研究 如何快速造题并验题。 分工是这样的&#xff1a;有 n 个 wzy 负责造题&#xff0c;第 i 个 wzy 会造出恰好 ai 道题。有 m…

通过 Azure Pipelines 实现持续集成之docker容器化

IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps Pipeline。实现 Docker 容器化的持续集成实现的目标&#xff1a…

YBTOJ:最小数(欧拉函数)

解析 题意可以化为&#xff1a; 8∗10x−19kn08*\frac{10^x-1}{9}kn08∗910x−1​kn0 然后用 8 尽可能的消去 9n9n9n 中的2的幂次&#xff0c;随后问题转化为&#xff1a; 10x≡1(modn′)10^x\equiv 1\pmod {n}10x≡1(modn′) 然后…我就觉得这个是exbsgs了… 但其实完全不用阿…

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意&#xff1a; 现在大家决定玩一个游戏&#xff0c;指定一个整数闭区间 [a,b]&#xff0c;问这个区间内有多少个不降数。 题解&#xff1a; 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数&#xff0c;…

天下第一 txdy (LCT+双指针+线段树)

天下第一 txdydescriptionsolutioncodedescription djq_cpp 是天下第一的。 djq_cpp 给了你一个 n 个点 m 条边的无向图&#xff08;无重边自环&#xff09;&#xff0c;点标号为 1 ∼n。祂想要考考你&#xff0c; 有多少对整数对 (l, r) 满足&#xff1a; • 1 ≤l ≤r ≤n •…

Acwing 1083. Windy数

Acwing 1083. Windy数 题意&#xff1a; Windy 定义了一种 Windy 数&#xff1a;不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。 Windy 想知道&#xff0c;在 A 和 B 之间&#xff0c;包括 A 和 B&#xff0c;总共有多少个 Windy 数&#xff1f; 题解&am…

【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师

南京纳龙科技有限公司成立于2002年12月&#xff0c;隶属纳龙科技在南京成立的研发中心&#xff0c;坐落于南京市雨花台区。公司立志以守护人类心脏健康为使命&#xff0c;专注推动心电信息化技术的发展&#xff0c;为全国各级医疗机构提供心电检查、诊断一体化的解决方案。公司…

模板:k短路(可并堆)

所谓k短路&#xff0c;就是第k短的路。 &#xff08;逃&#xff09; 解析 给出一个有向图&#xff0c;求 s−ts-ts−t 的不严格第 k 短的路径。 A*算法 对于一个状态 (x,cost)(x,cost)(x,cost)&#xff0c;即到 xxx 时走过长度为 costcostcost&#xff0c;定义一个估价函数&a…

大鱼吃小鱼(fhq-treap/线段树二分+贪心)

大鱼吃小鱼descriptionsolutioncodedescription 《大鱼吃小鱼》是一款经典的儿童益智类游戏&#xff0c;在游戏中&#xff0c;玩家所操控的“大鱼”只能吃掉体积严格小于自己的“小鱼”&#xff0c;然后玩家所操控的“大鱼”的体积就会增加“小鱼”的体积这么多的量。 知名主…