传送门

题意咕咕咕


思路:

先把所有可以列车通的缩成一个点,然后用新图建立kruskalkruskalkruskal重构树。

这样就可以倒着贪心模拟了。

代码:

#include<bits/stdc++.h>
#define ri register int
#define int long long
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
    static char buf[rlen],*ib,*ob;
    (ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
    return ib==ob?-1:*ib++;
}
inline int read(){
    int ans=0;
    bool f=1;
    char ch=gc();
    while(!isdigit(ch))f^=ch=='-',ch=gc();
    while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
    return f?ans:-ans;
}
const int N=2e5+5,M=2e5+5;
int rt,anc[N],id[N],n,m,q,qry[N],a[N],val[N],pass[N];
inline int find(const int&x){return x^anc[x]?anc[x]=find(anc[x]):x;}
struct Node{int u,v,w;friend inline bool operator<(const Node&a,const Node&b){return a.w>b.w;}}g[M];
vector<int>e[N];
int dep[N],st[N][20];
void dfs(int p){
    for(ri i=1;i<20;++i)st[p][i]=st[st[p][i-1]][i-1];
    for(ri i=0,v;i<e[p].size();++i)st[v=e[p][i]][0]=p,dep[v]=dep[p]+1,dfs(v);
    if(!e[p].size())val[p]=0x3f3f3f3f;
}
inline int query(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    for(ri tmp=dep[x]-dep[y],i=19;~i;--i)if((tmp>>i)&1)x=st[x][i];
    if(x==y)return val[x];
    for(ri i=19;~i;--i)if(st[x][i]^st[y][i])x=st[x][i],y=st[y][i];
    return val[st[x][0]];
}
inline void init(){
    for(ri i=1;i<=n;++i)id[i]=i,anc[i]=i;
    for(ri x,pre=0;q;--q){
        x=read();
        if(!pre)pre=x;
        id[x]=pre;
    }
    sort(g+1,g+m+1);
    rt=n;
    for(ri i=1,fx,fy;i<=m;++i){
        fx=find(id[g[i].u]),fy=find(id[g[i].v]);
        if(fx^fy){val[++rt]=g[i].w,e[rt].push_back(fx),e[rt].push_back(fy),anc[fx]=anc[fy]=anc[rt]=rt;}
    }
    dfs(rt);
}
signed main(){
    n=read(),m=read(),q=read();
    for(ri i=1;i<=n;++i)qry[i]=read();
    for(ri i=1;i<=n;++i)a[i]=read();
    for(ri i=1;i<=m;++i)g[i].u=read(),g[i].v=read(),g[i].w=read();
    init();
    for(ri tmp,pre=0,i=n,p;i;--i){
        p=qry[i];
        if(a[p]<0)pre-=a[p];
        else pass[p]=min(a[p],pre),pre-=pass[p];
        if(i^1)tmp=query(id[p],id[qry[i-1]]);
        if(tmp!=0x3f3f3f3f)pre=min(pre,tmp);
    }
    for(ri i=1,p,tmp,pre=0;i<=n;++i){
        p=qry[i];
        if(a[p]<0)cout<<(tmp=min(-a[p],pre))<<'\n',pre-=tmp;
        else pre+=pass[p];
    }
    return 0;
}

2019.03.28 bzoj3322: [Scoi2013]摩托车交易(kruskal重构树+贪心)的更多相关文章

  1. [SCOI2013]摩托车交易 kruskal重构树(最大生成树) 倍增

    ---题面--- 题解: 这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是inf没开到LL范围.... 首先我们需要找到任意两点之间能够携带黄金的上限值,因为是在经过的道路权值中取min, ...

  2. BZOJ3322[Scoi2013]摩托车交易——最大生成树+贪心+倍增

    题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...

  3. BZOJ3322 : [Scoi2013]摩托车交易

    求出最大生成树,则两点间的最大容量为树上两点间的边权的最小值. 设$lim[i]$表示第$i$个订单的城市允许携带的黄金上限,则 $lim[i]=\min(lim[i+1],a[i]和a[i+1]点间 ...

  4. 2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)

    传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列 ...

  5. 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)

    传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...

  6. 【[SCOI2013]摩托车交易 】

    倍增什么的最慢了,常数太大了 我们可以上树剖啊 但是如果用树剖来查询树上两点之间的最小边权的话,可能只能在上一棵线段树? 那也太\(naive\)了,尽管倍增常数大,但是还是比两个\(log\)快的 ...

  7. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

  8. [学习笔记]kruskal重构树 && 并查集重构树

    Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...

  9. 洛谷P4197 Peaks (Kruskal重构树)

    读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[ ...

随机推荐

  1. ubuntu环境下安装docker遇到的坑

    ubuntu安装docker的前提条件是: 1. Linux 的内核版本在 3.10 或以上: 2. linux 内核要开启 cgroup 和 namespace 功能 可以执行命令:uname –a ...

  2. 爬虫之scrapy入门

    1.介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...

  3. MySql数据库执行insert时候报错:Column count doesn't match value count at row 1

    遇到这个问题之后,第一反应就是前后列数不等造成的,但是我检查SQL之后,发现列数是相同得,但是插入还是有问题,然后又写了简单得SQL只插入不为空得字段,执行还是报这个错,最后请教了高人,指点之后,大概 ...

  4. Hbase--知识点总结3

    Hbase知识点总结:  hbase表中为什么列族的数量不能太多? 因为当一个列族数据溢写的时候,其他列族也会发生数据溢写,但是其他列族中数据的数量还没有达到溢写的阈值,就会导致产生的小文件数量增多. ...

  5. PHP : MySQLi【面向过程】操作数据库【 连接、建库、建表、增、删、改、查、关闭】

    <?php /** *数据库操作关键函数 *mysql_connect:连接数据 *mysql_error:最后一次sql动作错误信息 *mysqli_query:执行sql语句,增删该查 *m ...

  6. css: box-sizing

    border-box 宽度包含了边框 content-box 边框不包含在内容区中,会增加到实际的宽度中

  7. git clone失败

    操作: $ git clone https://github.com/zjun615/DragListView.gitCloning into 'DragListView'...fatal: unab ...

  8. linux之egrep命令

    1.介绍 egrep工具是grep工具的扩展,相当于grep -E 2.用法 查找1个或1个以上前面的字符为例 查找0个或1个前面字符 egrep 'o?' 1.txt 匹配roo或者body egr ...

  9. SQLServer导入导出命令报错

    错误描述: SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关闭. 系统管理员可以通过使用sp_c ...

  10. 分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式

    一.用for循环实现 实验过程: 实验结果: 二.用while循环实现 实验结果: 三.用do while循环实现 实验结果: 四.用递归算法实现 实验结果: 实验心得: 此次实验中必须熟悉for循环 ...