传纸条(scrip)
传纸条(scrip)
题目背景
Awson是某国际学校信竞组的一只菜鸡。每次竞赛考试都只能垫底。终于有一天,他决定不再苟活,发挥他的人脉优势,准备在一次竞赛考试时传纸条作弊。
题目描述
他预先知道了考试时机房人数N(1<=N<=10000),自己编号为1,并且由于他十分地交际,所以能够确保所有人能为他提供答案。为了传递纸条,他会开动脑筋,想出M(0<=M<=100000)种单个可行方案。每种单个方案不一定与自己有关,因为他可以间接地从别人那获得他人的答案。每种方案已知三个数据U,V,C(1<=U,V<=N;1<=C<=1000000)表示从U到V有一种可行方案,其代价为C,且方案是双向的,即U可以传纸条给V且V也可以传纸条给U。由于作弊是高风险的事情,他决定考前预谋好总的方案。他想知道:
(1)团结所有人(即每个人都能够互相联系)所需要的最小代价和。
(2)基于(1),他会给出Q(1<=Q<=10000)个询问,每个询问有三个数据OPT,X,Y(OPT=0 or 1;1<=X,Y<=N),询问有两种类型:
OPT=0时:询问X到Y的路径上单个最大代价的值;
OPT=1时:询问X到Y的路径上的总代价。
但如果不存在(1)方案,即他不能团结起所有人,那么他这场考试就又失败了,他就会无限地堕落下去,请输出”OVER!”(半角字符,不含引号),并忽略之后的询问。
由于他还有重要的事情要做,所以这个任务交给了你,怎么样,应该不难吧?
(请阅读样例及其说明以便更好地了解题意)
输入输出格式
输入格式:
第1行:两个整数N,M
第2~M+1行:每行三个整数Ui,Vi,Ci
第M+2行:一个整数Q
第M+3~M+Q+2行:每行三个整数OPTi,Xi,Yi
输出格式:
有两种情况:
若不存在(1)方案,输出共1行,第1行为”OVER!”(半角字符,不含引号);
若存在,输出共Q+1行,第1行一个整数,表示团结所有人所需要的最小代价和,第2~Q+1行每行一个整数,代表每个询问的结果。
输入输出样例
输入样例:
7 12
1 4 994
1 2 999
1 2 1
1 3 2
1 6 998
2 4 4
2 5 3
3 7 5
3 6 6
4 5 995
5 7 996
6 7 997
10
1 1 4
0 1 4
1 1 7
0 1 6
1 4 6
0 5 7
1 2 4
0 3 5
1 6 7
0 4 5
输出样例:
21
5
4
7
6
13
5
4
3
11
4
说明
样例解释:
路径1<—>4上,所有的单个方案代价分别为1,4。则对于第一组询问(1,1,4),代价和为1+4=5;对于第二组询问(0,1,4),其路径上单个最大的代价为4。
团结所有人的方案在图中用红色表示,则所需要的最小代价和为1+2+3+4+5+6=21。
其余同理。
数据规模:
30%的数据:1<=N,Q<=1000
50%的数据:1<=N,Q<=5000
100%的数据:1<=N,Q<=10000,0<=M<=10×N,所有数据保证不会超过长整型(C++中的int),保证每种单个方案的代价各不相同。
题解:
正解Kruskal+LCA
用Kruskal求出图的最小生成树,转化为有根树之后套LCA模板。
本来想强制在线的,但数据太水你会发现就算退化成链每次直接遍历都不会超时。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long lol;
lol n,m,l,mmax,ans,tot;//n<=10000;m<=100000;l<=10000
struct student{lol u,v,c;}a[];
bool cmp(const student a,const student b){return a.c<b.c;}//输入边和排序
lol head[],size=;
struct node{lol next,to,dis;}edge[];
void putin(lol from,lol to,lol dis){size++;edge[size].to=to;edge[size].next=head[from];edge[size].dis=dis;head[from]=size;}
void in(lol from,lol to,lol dis){putin(from,to,dis);putin(to,from,dis);}//建树
lol father[];
lol find(lol x){if(father[x]==x)return x;else return father[x]=find(father[x]);}//并查集
lol fa[][],vis[],depth[],dis[][],dist[][];
void dfs(lol r)
{
vis[r]=;lol i;
for(i=head[r];i!=-;i=edge[i].next)
{
lol y=edge[i].to;
if(!vis[y]){depth[y]=depth[r]+;fa[y][]=r;dist[y][]=dis[y][]=edge[i].dis;dfs(y);}
}
}
void make()
{
lol i,j,len=log2(n);
for(j=;j<=len;j++)
{
for(i=;i<=n;i++)
{
dis[i][j]=max(dis[fa[i][j-]][j-],dis[i][j-]);
dist[i][j]=dist[fa[i][j-]][j-]+dist[i][j-];
fa[i][j]=fa[fa[i][j-]][j-];
}
}
}
void RMQ(lol x,lol y)
{
mmax=;ans=;
lol i,op=log2(n);
if(depth[x]<depth[y])swap(x,y);
for(i=op;i>=;i--)
if(depth[fa[x][i]]>=depth[y])
{
mmax=max(mmax,dis[x][i]);
ans+=dist[x][i];
x=fa[x][i];
}
if(x!=y)
{
for(i=op;i>=;i--)
if(fa[x][i]!=fa[y][i])
{
mmax=max(mmax,max(dis[x][i],dis[y][i]));
ans+=dist[x][i]+dist[y][i];
x=fa[x][i];y=fa[y][i];
}
ans+=dist[x][]+dist[y][];
mmax=max(mmax,max(dis[x][],dis[y][]));
x=fa[x][];y=fa[y][];
}
return;
}
lol gi()
{
lol ans=,f=;
char i=getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans*f;
}
int main()
{
freopen("scrip.in","r",stdin);
freopen("scrip.out","w",stdout);
lol i;
n=gi();m=gi();
memset(head,-,sizeof(head));
for(i=;i<=n;i++)father[i]=i;//初始化并查集
for(i=;i<=m;i++){a[i].u=gi();a[i].v=gi();a[i].c=gi();}//输入边
sort(a+,a+m+,cmp);//排序
for(i=;i<=m;i++)
{
lol p=find(a[i].u),q=find(a[i].v);
if(p!=q){father[p]=q;in(a[i].u,a[i].v,a[i].c);tot+=a[i].c;}
}
printf("%lld\n",tot);
depth[]=;dfs();make();
l=gi();
for(i=;i<=l;i++)
{
lol s=gi(),u=gi(),v=gi();RMQ(u,v);
if(s==)printf("%lld\n",mmax);//单个最大
else if(s==)printf("%lld\n",ans);//求路径和
}
return ;
}
传纸条(scrip)的更多相关文章
- tyvj1011 传纸条
背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...
- NOIP2008 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- NOIP2008传纸条[DP]
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- NOIP2008 T3 传纸条 解题报告——S.B.S.
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- [NOIP2008] 提高组 洛谷P1006 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- nyoj 61 传纸条
点击打开链接 传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做 ...
- P1011 传纸条//dp优化改进状态表示
P1011 传纸条 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不 ...
- Wikioi 1169 传纸条
这道题是我人生第一道双线动规题,因此我觉得还是很有必要记录下来. 刚接触到这道题的时候我第一反应是单线的动规,可是下一秒我就觉得这样做可能会有问题,因为从左上角(以下简称A)到右下角(以下简称B)通过 ...
随机推荐
- PS 色调— —颜色梯度
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- django 自定义日志配置
如果不想使用 python 的 dictConfig 格式来配置 logger,可以制定自己的配置架构. LOGGING_CONFIG 配置定义了用来配置 django logger 的可调用函数,默 ...
- BZOJ1758:[WC2010]重建计划
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...
- Ubuntu Hadoop环境搭建(Hadoop2.6.5+jdk1.8.0_121)
1.JDK的安装 2.配置hosts文件(这个也要拷贝给所有slave机,scp /etc/hosts root@slave1:/etc/hosts) gedit /etc/hosts 添加: 122 ...
- Spring 源码解析之DispatcherServlet源码解析(五)
spring的整个请求流程都是围绕着DispatcherServlet进行的 类结构图 根据类的结构来说DispatcherServlet本身也是继承了HttpServlet的,所有的请求都是根据这一 ...
- win 10 无线标志都不出现
http://jingyan.baidu.com/article/e75057f2fdd2f1ebc91a89f1.html ipconfig /flushdns netsh winsock rese ...
- caffe template
http://www.cnblogs.com/ggjucheng/archive/2011/12/18/2292090.html
- IOS推流 搭建环境
效果图 iTools有点卡, 但是推到服务器倒是很快的. 推流 前言 这篇blog是iOS视频直播初窥:<喵播APP>的一个补充. 因为之前传到github上的项目中没有集成视频的推流.有 ...
- 连接带密码的access数据库
在网上找了很多都不靠谱,稀里哗啦的弄一堆连接字符串,很不优雅. 这个方法很简单: 1.在“连接”这页中,下方有“输入登录数据库的信息”用户名:admin,并在下面选择“空白密码” 2.在“所有”这页的 ...
- php使用curl带cookie访问一直失败求助
最近需要批量向织梦后台导入一些数据,但是遇到了一个头疼的问题. 环境:xampp + 别人的dede后台. 首先,利用curl发送post请求登录login.php,成功,并且保存了cookie文件. ...