传纸条(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)通过 ...
随机推荐
- Java之类加载器(Class Loader)
JVM默认有三个类加载器: Bootstrap Loader Bootstrap Loader通常有C编写,贴近底层操作系统.是JVM启动后,第一个创建的类加载器. Extended Loader E ...
- 「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树
题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低.低成本的运输是 F ...
- ACM学习历程—HDU4725 The Shortest Path in Nya Graph(SPFA && 优先队列)
Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...
- x264源代码分析-转
相关说明: 1. 使用版本: x264-cvs-2004-05-11 2. 这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置 ...
- BZOJ2467五角形生成树——数学
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2467 可以得出只需在每个五角形中去掉任意一条边,在某个五角形中去掉包括内边的两条边即可. 代码 ...
- Mysql 创建存储过程 更新表
DELIMITER // use protocoldb// drop procedure if exists sp_protocol_Update// create procedure sp_prot ...
- Oracle的case 用法
1.测试表declare @stuinfo table(id int, sname nvarchar(20), ///小组名称 gender varchar(1), //小组性别 sgroup int ...
- jquery中attr() & prop() 的区别与其实现方法
$(function(){ $('#check').attr('checked'); // undefind ???一头雾水 }) 在jquery中 attr 本来就是用来设置或者获取属性的,可是上面 ...
- 怎么在docker容器的mysql的编码格式变为utf8
第一个方法: 1. 编辑MySql的配置文件 MySql的配置文件Windows下一般在系统目录下或者在MySql的安装目录下名字叫my.ini,可以搜索,Linux下一般是/etc/my.cnf ...
- SSE优化指令集编译错误: inlining failed in call to always_inline 'xxx': target specific option mismatch xxx
在用QtCreator编译SSE优化指令的时候,出现了如下错误, inlining failed in call to always_inline '__m128i _mm_packus_epi32( ...