链接:https://ac.nowcoder.com/acm/contest/10325/B 来源:牛客网
现在有n个音符和m对共鸣关系,编号为1~n, 每个音符自己有一个奏响时的优美程度, 共鸣关系(x,y,z)表示音符x和y同时奏响的额外优美程度是 z,同时不奏响则为 -z,其他情况为0。 音符可以选择奏响或者不奏响,不奏响的音符没有优美程度。 我们想知道最大的优美程度和是多少,我们不需要知道具体是哪些音符被奏响了,只需输出最大和即可。
共鸣关系可能有重复,其共鸣效果也会重复叠加。
示例1
输入
2,1,[-10,-10],[[1,2,5]]
返回值
-5
备注:
数据包括两个数n,m,一个长度为n的数组a[],
表示每个音符奏响时的优美程度(a[0]表示第一个音符),
一个第一维长度为m的二维数组,描述m组共鸣关系。
输出一个整数表示答案。
n,m<=100000,所有的优美程度和额外优美程度的绝对值<=33000
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @param m int整型
* @param a int整型vector
* @param b int整型vector<vector<>>
* @return long长整型
*/
long long wwork(int n, int m, vector<int>& a, vector<vector<int> >& b) {
// write code here
// 初始为都没有奏响,收益是 -z
long long ans = 0;
vector<long long> delta(n, 0);
for(int i = 0; i < m; ++i)
{
ans -= b[i][2]; // 都没有响 -z
delta[b[i][0]-1] += b[i][2];//响一个的话 +z,跟上面的-z抵消为0
delta[b[i][1]-1] += b[i][2];//同时响的话,为z
}
for(int i = 0; i < n; i++)
{
if(a[i]+delta[i] > 0)//收益为正
ans += a[i]+delta[i];
}
return ans;
}
};