【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty

传送门
这些天风也温柔,题也温柔
开车啦!

文章目录

  • A1:Add on a Tree
    • 题意翻译
    • 题解
    • 证明
    • 代码实现
  • B:Count Pairs
    • 题意翻译
    • 题解
    • 代码实现
  • C:Array Beauty
    • 题目描述
    • 题解
    • 代码实现

A1:Add on a Tree

题意翻译

给定一棵树,树上的边权初始为0,你可以在任意两个叶子之间的简单路径上的边上加上一个权值实数x。问:能否在有限次数的操作内,得到边权任意组合的树。
题目描述
Note that this is the first problem of the two similar problems. You can hack this problem only if you solve both problems.
You are given a tree with n n nodes. In the beginning, 0 is written on all edges. In one operation, you can choose any 2 distinct leaves u , v and any real number x and add x x to values written on all edges on the simple path between u and v .
For example, on the picture below you can see the result of applying two operations to the graph: adding 2 on the path from 7 to 6 , and then adding −0.5 on the path from 4 to 5 .
在这里插入图片描述
Is it true that for any configuration of real numbers written on edges, we can achieve it with a finite number of operations?
Leaf is a node of a tree of degree 1 . Simple path is a path that doesn’t contain any node twice.
输入格式
The first line contains a single integer n n ( 2≤n≤10^5) — the number of nodes.
Each of the next n−1 lines contains two integers u and v (1≤u,v≤n , u≠v ), meaning that there is an edge between nodes u and v. It is guaranteed that these edges form a tree.

输出格式
If there is a configuration of real numbers written on edges of the tree that we can’t achieve by performing the operations, output “NO”.
Otherwise, output “YES”.

You can print each letter in any case (upper or lower).
输入输出样例
输入
2
1 2
输出
YES
输入
3
1 2
2 3
输出
NO
输入
5
1 2
1 3
1 4
2 5
输出
NO
输入
6
1 2
1 3
1 4
2 5
2 6
输出
YES
说明/提示
In the first example, we can add any real x x to the value written on the only edge (1, 2)
在这里插入图片描述
In the second example, one of configurations that we can’t reach is 0 0 written on (1, 2) and 1written on(2,3) .
在这里插入图片描述
Below you can see graphs from examples 3 , 4 :
在这里插入图片描述
在这里插入图片描述

题解

首先看这个题目大意,你可能会被吓到,这题这么难?但是你想这可是CF第一题啊!
那么一定是水题,而这道题就是一个神仙结论题!!

如果有一个点只连了两条边,就一定是输出NO,没有就输出YES

我当时知道后一脸懵逼
在这里插入图片描述

证明

后来拿着数据慢慢推又发现自己脑子不行,我们还是假设未知数来推吧!
首先如果这是一条单链,我们也能将它变为一个二叉树
接下来的讨论情况是在不是单链的前提下进行的

因为是要两个叶子节点彼此间的路径全都加上或减去x,一定会经过它们的lca
所以我们要以lca来进行讨论
也可以这么理解,把它们的lca和lca的子树单独抠出来考虑,让lca成为根节点

设i点连的边数为edge
1)edge = 1,意味着i点是叶子节点,不考虑,特殊情况输出YES,如样例1
2)edge = 2,如图:
在这里插入图片描述
如果这两条边的边权要求不一样,就无法完成
因为加权或减权都要选择两个不同的叶子节点,
而lca只有这两个叶子节点,也就是说这两个点的边只能一起加一起减
自然也就组合不出不同的边权了

3)edge=3,如图:
在这里插入图片描述
因为要组合成任意边权,所以3,5,7与5,3,7本质上木有区别
所以我们就假设要满足的边权i<=j<=k
(1)i+j=k,直接i,k和j,k就能完成
(2)i+j<k,首先一三点都加上i和二三点j,k都加上j此时第三个点还差k-i-j
如果差的是奇数,
那么第一二个点就分别与他组合(k-i-j)*1.0 / 2,
再一二个点组合减去(k-i-j)*1.0/ 2即可满足
如果差的是偶数
那么第一二个点就分别与他组合(k-i-j)/ 2,
再一二个点组合减去(k-i-j)/ 2也可满足
PS:加减实数,即有理数,所以也可以加减无限循环或有限小数
(3)i+j>k,与情况二差不多,
首先一三点都加上i和二三点j,k都加上j此时第三个点多了k-i-j
如果多的是奇数,
那么第一二个点就分别与他组合减掉(k-i-j)*1.0 / 2,
再一二个点组合加上(k-i-j)*1.0/ 2即可满足
如果差的是偶数
那么第一二个点就分别与他组合减掉(k-i-j)/ 2,
再一二个点组合加上(k-i-j)/ 2也可满足

综上当叶子节点个数为3时,一定能凑出任何边权

4)当edge=4时,
(1)i+j+k=l,坑定可以满足,不多说
(2)i+j+k<l,首先i,l;j,l;k,l分别组合先让l满足,就不用再考虑l了
于是就转换成了让i,j,k三个满足边权,我们已经证明过了三个的时候一定成立
所以这个情况也一定成立
(3)i+j+k>l,与情况(2)一样,先让l满足后就不考虑l转换成三个叶子节点的情况
所以此情况也一定成立

5)以此类推edge>3的时候,就依次让edge,edge-1,edge-2满足要求,不再考虑,
最后都能转换成edge=3的情况,
所以edge>3也是一定可以组合出任意边权

所以综上所述,只有edge=2的时候会组合不出任意边权,输出NO否则YES
在这里插入图片描述
好了证明完了,这道题发挥了它该有的价值,我也心安理得了

代码实现

这是个水题,代码量自然也就不会那么ex,主要是寡人刚开始没把这个英文题意搞懂

#include <cstdio>
#define MAXN 100005
int n;
int du[MAXN];
int main() {scanf ( "%d", &n );for ( int i = 1;i < n;i ++ ) {int u, v;scanf ( "%d %d", &u, &v );du[u] ++;du[v] ++;}for ( int i = 1;i <= n;i ++ )if ( du[i] == 2 )return ! printf ( "NO" );printf ( "YES" );return 0;
}

B:Count Pairs

题意翻译

给定一个质数 p , 一个长度为 n 的序列 a1,a2,…,an和一个整数 k.
求所有数对 (i, j) (1≤i,j≤n) 中满足 (ai + aj) * (ai^2 + aj^2 ) ≡k mod p.的个数.

题目描述
You are given a prime number p , n ,integers a1, a2…an and an integer k .
Find the number of pairs of indexes (i, j)(1≤i<j≤n) for which (ai+aj)(ai^2 + aj^2) ≡k mod p .
输入格式
The first line contains integers n, p, k ( 2≤n≤3⋅10^5, 2≤p≤10^9,0≤k≤p−1 ). p is guaranteed to be prime.
The second line contains n integers a1, a2,…,a n,0≤ai≤p−1 ). It is guaranteed that all elements are different.
输出格式
Output a single integer — answer to the problem.
输入输出样例
输入
3 3 0
0 1 2
输出
1
输入
6 7 2
1 2 3 4 5 6
输出
3
说明/提示
In the first example:
(0+1)(0^2 + 1^2) = 1 ≡ 1 mod 3 .
(0+2)(0^2 + 2^2) = 8 ≡ 2 mod 3 .
(1+2)(1^2 + 2^2) = 15 ≡ 0 mod 3 .
So only 1 pair satisfies the condition.
In the second example, there are 3 3 such pairs: (1, 5) , (2, 3), (4, 6) .

题解

首先要知道,n的范围很大,这就告诉我们,时间复杂度控制在O(n),
尽管这个时间开的是4s,n^2也不是我们想要的好代码!
那么我们就要式子进行变换,而且看到同余就知道是数论,也就要用到数学
(ai + aj) * (ai^2 + aj^2 ) ≡k mod p
因为p是质数所以左右两边同时乘以(ai-aj)等式仍然成立
即(ai+aj)(ai-aj)(ai^2 + aj^2) %p ≡ k(ai-aj)%p
即(ai^2 - aj^2) (ai^ + aj^2) % p ≡ k(ai-aj) %p
即(ai^4 - aj^4)%p ≡(aik - ajk) %p
移向即:

(ai^4-aik) %p ≡ (aj^ajk)% p

我们设f(x)表示(ax^4-axk) %p,k,p都是一定的
所以我们可以在输入ai的时候就处理出每一个f(x)

之后我们只需要找到有多少个与f(x)同余的即可,(i,j)与(j,i)算一个!!
我们不能用两重循环去找因为会TLE所以我们可以sort一下,保持它的单调性,这样就可以在一重循环内进行答案计算

答案每次应该加多少呢?我们来想如果有n个同余的数
那么第一个数与后面的组合个数为n-1,第二个数与后面的组合个数为n-2,以此类推
最后一个后面没数,组合数为0
就可以列出公式0+1+2+…+n-2+n-1也就是我们的等差数列求和公式
在这里插入图片描述
好了,话不多说,屁不多放,上马!

代码实现

终于本仙女没有在mod上怀疑人生了,我很欣慰

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 300005
#define LL long long
int n, p;
LL k, t;
LL result;
LL f[MAXN];
int main() {scanf ( "%d %d %lld", &n, &p, &k );for ( int i = 1;i <= n;i ++ ) {scanf ( "%lld", &t );//f[i] = ( ( LL ) pow ( t, 4 ) % p - ( t * k ) % p + p ) % p;//不要这么写,炸不炸longlong全靠运气,pow不会炸duoble会炸longlong//相同代码在luogu交有时会AC有时连样例数据都过不了//真玄学LL ip = t * t % p * t % p * t % p;f[i] = ( ip % p - ( t * k ) % p + p ) % p;}sort ( f + 1, f + n + 1 );LL cnt = 1;for ( int i = 2;i <= n;i ++ ) {if ( f[i] == f[i - 1] )cnt ++;else {result = ( result + ( ( cnt - 1 ) * cnt / 2 ) % p ) % p;cnt = 1;}}if ( cnt > 1 )result = ( result + ( ( cnt - 1 ) * cnt / 2 ) % p ) % p;printf ( "%lld", result );return 0;
}

C:Array Beauty

题目描述

我们称序列b 1 ​,b 2 ​ ,…,b n ​( n > 1 ) 的美丽值为min ​ ∣b i ​ −b j ​∣(1≤i<j≤n)
给你一个序列a 1 ​ ,a 2 ​ ,…a n ​和一个数字k,请您计算出长度为k的序列a的所有子序列的美丽值之和,由于这个值可能很大,所以输出是模998244353。
如果可以通过删除几个(可能为零或全部)元素从B中获得A,则序列A是数组B的子序列。

输入输出格式
输入格式:
第一行包含整数 ( 2≤k≤n≤1000 )。
第二行包含n个整数 a 1 ​ ,a 2 ​ ,…,a n ​ ( 0≤a i ​ ≤10^ 5 )。
输出格式:
输出一个整数 — 长度为k的序列a的所有子序列的美丽值之和 , 由于这个值可能很大,所以输出是模998244353 。

题目描述
Let’s call beauty of an array b1, b2,…,bn( n > 1) —(1≤i<j≤n) min∣bi−bj∣ .

You’re given an array a1, a2,…an and a number k . Calculate the sum of beauty over all subsequences of the array of length exactly k . As this number can be very large, output it modulo 998244353 .

A sequence a is a subsequence of an array b if a can be obtained from b by deletion of several (possibly, zero or all) elements.

输入格式
The first line contains integers n, k ( 2≤k≤n≤1000 ).
The second line contains n integers a1, a2,…,an( 0≤a i ≤10^5 ).
输出格式
Output one integer — the sum of beauty over all subsequences of the array of length exactly k . As this number can be very large, output it modulo 998244353 .
输入输出样例
输入
4 3
1 7 3 5
输出
8
输入
5 5
1 10 100 1000 10000
输出
9
说明/提示
In the first example, there are 4 subsequences of length 3 — [1, 7, 3] [1, 3, 5] , [7, 3, 5] , [1, 7, 5] , each of which has beauty 2 , so answer is 8 .

In the second example, there is only one subsequence of length 5 — the whole array, which has the beauty equal to |10-1| = 9.

题解

对于给定的数组,由于不是有序的,所有相连的值最小,而子序列也不要求是连续的,肯定要先进行排序(从小到大),得到一个有序的数组,
这样得到的子序列也是有序的。
假设一个序列的最小值为x,即a[i]−a[i−1]≥x,即所有的相连数字之差都大于等于x。

如果一个我们要找序列的值为1的个数为N,那么和就是1×N,
如果序列的的值为2的个数为M,那么和就是2×M,
但是在N个序列中肯定包含值为2的M个序列,
那么总的和就是N+2×M−M×1=N+M(M×1就是在值为1中重复的个数)(容斥思想),
这样我们就可以发现我们从小到大连续 的序列的值,就是将他们的序列个数相加。

用动态规划DP的思想
dp[i][len]
其中:i表示第i个数组加入序列,len表示此时序列的长度为len,
那么dp[i][len] 就表示第i个数字加入,长度为len的子序列的个数。

假设此时序列的最小值为x
那么对于第i个数字,如果它不加入序列,那么此时就可以表示为
dp[i][len]+=dp[i−1][len]
如果加入序列,那么我们需要找到一个位置让a[i]−a[j]≥x,1≤j≤last
dp[i][len]+=dp[last][len−1]

综上:

dp[i][len]=dp[i−1][len]+dp[last][len−1]

最后对于序列最小值为x,得到的序列个数就是dp[n][k],由于这个值和x有关,记为f(x)
那么最终的结果就是

==result=∑x=(1,10^5/(k-1))*f(x) ==

所以这道题就是一个简单 dp

在这里插入图片描述

代码实现

这里解释两个地方
1)result求解的for循环的取值范围
首先i模拟的是美丽值,那么有长度为k的序列,为了维护序列中最小的美丽值为i
最大的一个数应该是i*(k-1),因为i占第一个,所以是乘以k-1,
而且每一个a都不能超过100000,所以条件是这个序列的最后一个的值<=MAX

2)为什么last是与i满足条件的最接近与i的下标
dp[i][j]是i进入序列和i不进入序列的情况数总和,
那么dp[i-1][j-1]也包含了i-1进入序列和i-1不进入序列情况的总和,
所以如果是加上dp[i-1][j-1]
也包含了i直接略过last接在前面任何一个与i满足美丽值要求的方案总数

如果不这样写,就要再用一重循环去模拟前面所有与i组合合法的j再累加

#include <cstdio>
#include <algorithm>
using namespace std;
#define mod 998244353
#define LL long long
#define MAXN 1005
#define MAX 100000
int n, k;
int a[MAXN];
LL dp[MAXN][MAXN];
LL result;int beauty ( int val ) {dp[0][0] = 1;int last = 0;for ( int i = 1;i <= n;i ++ ) {while ( a[i] - a[last + 1] >= val ) last ++;dp[i][0] = dp[i - 1][0];for ( int j = 1;j <= k;j ++ )dp[i][j] = ( dp[i - 1][j] + dp[last][j - 1] ) % mod;}return dp[n][k];
}int main() {scanf ( "%d %d", &n, &k );;for ( int i = 1;i <= n;i ++ )scanf ( "%d", &a[i] );sort ( a + 1, a + n + 1 );for ( int i = 1;i * ( k - 1 ) <= MAX;i ++ )result = ( result + beauty ( i ) ) % mod;printf ( "%lld", result );return 0;
}

好了,你左丢一个表情包,右丢一个表情包,闪现收人头!
今天的节目到此结束,有任何问题欢迎留言,也可以留下你的想法和思路
帮助博主完善这份博客小朋友。我们下期再见哦~~
在这里插入图片描述

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

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

相关文章

eShopOnContainers 知多少[5]:EventBus With RabbitMQ

1. 引言事件总线这个概念对你来说可能很陌生&#xff0c;但提到观察者&#xff08;发布-订阅&#xff09;模式&#xff0c;你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&am…

YBTOJ:数列方案(组合数学)

文章目录题目描述解析代码题目描述 解析 如果它不取等&#xff0c;那就和方程的解这道题一样了&#xff0c;但有了等号就很头疼 如何把等号去掉呢&#xff1f; 定义BiAiiB~i~A~i~iB i A i i那么我们就可以得到&#xff1a;0<B1<B2<...<Bm<mn0<B~1~<B~2~&…

【COCI 2018/2019 Round #2】Kocka

这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥&#xff0c;让我们一起&#xff0c; 开启你的模拟ex大门&#xff0c;C从入门到放弃&#xff01; 题目 题目描述 我又来了&#xff01;我又来了&#xff01; 在清晨来到儿童游乐园的时候&#xff0c;出题…

Matrix Equation

题意&#xff1a; 题目给出两个矩阵X,Y,现在有两种操作 Z X Y D X⊙Y 问是否存在一个矩阵C&#xff0c;使得ACB⊙C式子成立&#xff0c;问矩阵C能有多少个 题解&#xff1a; 这个式子在模2意义下的加法就等于异或 也就相当于 那现在有 将BC移到左边 然后将Ci,j的系数进…

eShopOnContainers 知多少[6]:持久化事件日志

1. 引言事件总线解决了微服务间如何基于集成事件进行异步通信的问题。然而只有事件总线正常运行&#xff0c;微服务之间基于事件的通信才得以运转。 而现实情况是&#xff0c;总有这样或那样的问题&#xff0c;导致事件总线不稳定或不可用&#xff0c;比如&#xff1a;网络中断…

多体问题

代码&#xff1a; function SunEarthMoon % M函数文件load planets; % 将planets.mat中的变量mass、position、velocity加载过来[sun, earth, moon] deal(18, 3, 25); % sun、earth、moon分别是18、3、25行 list [sun, earth, moon]; % 1行3列矩阵 G 6.67e-11; % gr…

【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room

还好题很温柔&#xff0c;温柔得我差点没做完 文章目录A&#xff1a;Valeriy and Deque题意题解代码实现B&#xff1a;Tolik and His Uncle题目题解代码实现C&#xff1a;Serge and Dining Room题目题解代码实现A&#xff1a;Valeriy and Deque 题意 给定一个双端队列&#…

YBTOJ:比赛得分(期望)

文章目录题目描述解析代码题目描述 解析 不太难的题 显然本题在AB队员大小关系相反时其对答案的贡献互为相反数。 所以想到把B队队员sort一下后就可以二分找到大小关系相反的分界点 然后维护和与平方和两个前缀数组搞一搞即可O1求出贡献 总复杂度&#xff1a;nlognnlognnlogn …

Matlab与高等数学

曲线与曲面画图 平面 对于不同曲线的表达式&#xff0c;Matlab中有不同的绘图命令&#xff0c;主要有 plot, fplot, ezplot&#xff0c;plot3&#xff0c;polar&#xff0c; 曲面 1.2 曲面画图 曲面的一般方程是F(x,y,z)0&#xff0c;一般需要将曲面的点坐标先表示出来&…

[USACO19JAN,Platinum] Redistricting

[USACO19JAN,Platinum] Redistricting 这道题A了才知道。。并不难a&#xff01; orz 题目 内存限制&#xff1a;128 MiB 时间限制&#xff1a;1000 ms 题目描述 奶牛们的最大城市Bovinopolis正在重新划分势力范围—生活在那里的主要是两个品种的奶牛&#xff08;Holsteins和…

.NET Core + JWT令牌认证 + Vue.js 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...

DncZeus前言关于 DncZeusDncZeus Dnc Zeus"Dnc"--.Net Core 的缩写&#xff1b;"Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神话中主神专…

P5081 Tweetuzki爱取球(期望)(线性求逆元)

文章目录题目描述解析代码题目描述 解析 首先有一个很重要的引理&#xff1a; 若一件事做成的概率是p&#xff0c;则其做成需要次数的期望是1/p 为什么呢&#xff1f; 我们设做成这件事的期望次数是x 就可以列出方程&#xff1a; x1p∗0(1−p)∗xx1p*0(1-p)*xx1p∗0(1−p)∗x …

【 CF1186D,E,F】Vus the Cossack and Numbers/Vus the Cossack and a Field/Vus the Cossack and a Graph

太ex了&#xff0c;哭了哭了orz 后面两道平均一道花了我一天啊&#xff01; 文章目录D&#xff1a;Vus the Cossack and Numbers题意翻译题解代码实现E&#xff1a;Vus the Cossack and a Field题意翻译题解代码实现F:Vus the Cossack and a Graph题目暴力题解代码实现官方题解…

IdentityServer4与ocelot实现认证与客户端统一入口

关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了。ocelot与IdentityServer4组合认证博客园里也有很多&#xff0c;但大多使用ocelot内置的认证&#xff0c;而且大多都是用来认证API的&#xff0c;查找了很多资料也没看到如何认证oidc&#xff0c;所以这里…

YBTOJ:彩球抽取(期望)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;可以使用dp解决本题 设fi,j,k&#xff1a;操作i轮之后编号j的小球有k个的概率 转移和统计答案就都不难了 但是还有一个问题 不难发现这个题循环下去是可以无穷无尽的 所以限定一个i的上界&#xff08;如500000&#xf…

魔改森林

题意&#xff1a; 曾经有一道叫做迷雾森林的题目&#xff0c;然而牛牛认为地图中的障碍太多&#xff0c;实在是太难了&#xff0c;所以删去了很多点&#xff0c;出了这道题。 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n1,1)&#xff0c;终点在右上角的格点…

基于IdentityServer4 实现.NET Core的认证授权

IdentityServer4是什么&#xff1f;IdentityServer4是基于ASP.NET Core实现的认证和授权框架&#xff0c;是对OpenID Connect和OAuth 2.0协议的实现。OpenID Connect 和 OAuth2.0是什么OpenID Connect:OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth …

[COCI 2018#5]Parametriziran

这道题呢&#xff01; 算了&#xff0c;不要让这玩意儿活着祸害众生吧&#xff01;让我们来拯救苍生于苦海之中&#xff01;&#xff01; 骚话连篇ing 题目 由小写英文字母和问号组成的字符串成为参数化单词&#xff08;例如&#xff1a;??cd,bcd,??&#xff09;。如果两…

P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门 文章目录解析解析 很显然&#xff0c;让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题&#xff0c;其实第一感觉是bfs 但是状态数理论上最差可以达到815&#xff0c;&#xff08;当然基本不可能跑满&#xff09;&#xff…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…