luoguP4643 阿狸和桃子的挑战 思维



看下数据范围:

\(n \leq 14\),emmmm,状压\(dp\)的分

\(n \leq 10000, m \leq 100000\),emmmm.....???,这是什么数据范围?

再观察一下所求

点十分好控制,边非常不好控制

能不能把边转化为点呢?

把边给均分给两边的点?

诶,好像可以了.....

然后就没了.....


#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)

#define gc getchar
inline int read() {
    int p = 0, w = 1; char c = gc();
    while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }
    while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();
    return p * w;
}

int n, m;
ll val[200050];

int main() {
    n = read(); m = read();
    rep(i, 1, n) val[i] = 2 * read();
    rep(i, 1, m) {
        int u = read(), v = read(), w = read();
        val[u] += w; val[v] += w;
    }
    sort(val + 1, val + n + 1);
    ll ans = 0;
    drep(i, n, 1)
    if(!((n - i) & 1)) ans += val[i];
    else ans -= val[i];
    printf("%lld\n", ans / 2);
    return 0;
}

原文地址:https://www.cnblogs.com/reverymoon/p/10198399.html

时间: 2024-11-13 19:18:10

luoguP4643 阿狸和桃子的挑战 思维的相关文章

Bzoj2563 阿狸和桃子的游戏

Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 701  Solved: 496 Description 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的: 1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色.已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个顶点染色. 2. 为了保证公平性,节点的个数N为偶数. 3. 经过N/2轮游戏之

阿狸和桃子的游戏题解

阿狸和桃子的游戏题解 每一道代码简单的黑题都有着诡异的思想,真不知道出题者怎么想的. 而这道题的重点在于把边权转换为点权, 此题的方式是将边权w平均分给被连接的两点u和v. 若u和v都被一人选择,则他的分数较不加边权前多了w/2+w/2=w, 若被不同的人选择,分数差多了(ans1+w/2)-(ans2-w/2)=ans1-ans2 并不会对答案有什么影响. 所以,最优策略? 肯定选择点权最大的了. 排序后依次选择即可. #include<bits/stdc++.h> using namesp

bzoj 2563: 阿狸和桃子的游戏

开始写了一些东西但是后来浏览器挂了就没有存下来简直!!!!!!!!!!!!!QAQ 不想再写一遍了...总之是简单贪心. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #define MAXN 10005 7 using namespace std; 8 int n, m, a[M

【BZOJ2563】阿狸和桃子的游戏 贪心

依然加链接 #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44499259"); } 题解: PoPoQQQ大爷已经说得很详细了. http://blog.csdn.net/PoPoQQQ/article/details/44495319 代码: #include <cstdio&g

bzoj2563阿狸和桃子的游戏

题意: 一个n(偶数)点图,节点权值为w(v),边权为c(e).两人轮流将图中的顶点染色,已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个顶点染色.染完后每个人的分数为染过的点权和以及两个端点都被染的边权和.如果两人都是采用最优策略的,求最终第一个人的分数减去第二个人的分数.n≤10000,边数≤100000 题解: 本弱只能引用神犇的题解 “ 考虑先手选择每个点对答案的影响 一个点如果不选,本身对答案的贡献是-w,一个点如果选,本身对答案的贡献是w,一条边如果两个端点都不选,对答案的

BZOJ 2563 阿狸和桃子的游戏 贪心

题目大意:给定一张无向图,每个点有点权,每条边有边权,两个人轮流选择点,若一条边的两端点被选择则这条边被选择,两人都想自己的得分-对手的得分最大,求最终先手得分-后手得分 考虑先手选择每个点对答案的影响 一个点如果不选,本身对答案的贡献是-w 一个点如果选,本身对答案的贡献是w 一条边如果两个端点都不选,对答案的贡献是-c 如果两个端点中只选择一个,对答案的贡献是0 如果两个端点都选,对答案的贡献是c 那么我们先预先把所有的权值都在初始答案中减掉,然后就变成了: 一个点如果不选,本身对答案的贡献

【BZOJ】2563: 阿狸和桃子的游戏

http://www.lydsy.com/JudgeOnline/problem.php?id=2563 题意:给一个n个加权点m条加权边的无向图,两个人轮流拿走一个点,最后使先手得分-后手得分尽量大.一个人的得分等于拿到的点的点权和+边的两个端点在这个点集的边的边权和.(n<=10000, m<=100000) #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[10005], ans;

java实验三

京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352               姓名:王国伊      学号:20135207 成绩:                 指导教师:娄嘉鹏         实验日期:2015.5.8 实验密级:无           预习程度:                 实验时间:15:30~18:00 仪器组次:07          必修/选修:选修            实验序号:03 实验名称:

算法笔试

1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.   10  / \  6  14 / \ / \4  8 12 16 转换成双向链表4=6=8=10=12=14=16.  首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child of