题意:
现在有n个音符和m对共鸣关系,编号为1~n,每个音符自己有一个奏响时的优美程度,
共鸣关系(x,y,z)表示音符x和y同时奏响的额外优美程度是z,同时不奏响则为-z,其他情况为0。
音符可以选择奏响或者不奏响,不奏响的音符没有优美程度。
我们想知道最大的优美程度和是多少,我们不需要知道具体是哪些音符被奏响了,只需输出最大和即可。
数据范围:n,m<=1e5,|a[i]|,|z|<=33000
解法:
对于(x,y,z)
如果x和y都选,那么ans+=z,
如果x和y选择其中一个,那么ans+=0,
如果x和y都不选,那么ans+=-z.
实际上可以变为,一开始x和y都不选,当前ans=-z,
然后如果选择x和y中的一个,那么ans+=z,此时ans=0,
如果在选择一个,那么ans+=z,此时ans=z.
因此问题变为了每选择关系中的一个点,那么对答案造成z的贡献,
因此计算出每个点选中会造成多少贡献v,如果v>0,那么则选中,
然后这题就做完了.
code:
#define ll long long
const int maxm=1e5+5;
ll v[maxm];
class Solution {
public:
long long wwork(int n, int m, vector<int>& a, vector<vector<int> >& b) {
for(int i=0;i<n;i++){
v[i+1]=a[i];
}
ll ans=0;
for(auto i:b){
int x=i[0],y=i[1],z=i[2];
v[x]+=z;
v[y]+=z;
ans-=z;
}
for(int i=1;i<=n;i++){
if(v[i]>0){
ans+=v[i];
}
}
return ans;
}
};