链接:https://ac.nowcoder.com/acm/contest/548/C
来源:牛客网
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
立华奏是一个刚刚开始学习 OI 的萌新。
最近,实力强大的 QingyuQingyu 当选了 IODS 9102 的出题人。众所周知, IODS 是一场极其毒瘤的比赛。为了在这次比赛中取得好的成绩,立华奏决定学习可能考到的每一个知识点。
在 QingyuQingyu 的博客中,立华奏得知这场比赛总共会考察选手 n 个知识点。此前,立华奏已经依靠自学学习了其中 k 个知识点。接下来,立华奏需要学习其他的知识点,每学习一个单独的知识点,需要消耗的时间为 TiTi 天。同时,某些知识点之间存在联系,可以加速学习的过程。经过计算,立华奏一共发现了其中 m 种联系,第 i 种联系可以表示为(Xi,Yi,Hi)(Xi,Yi,Hi),其含义为“在掌握了第 XiXi 个知识点和第 YiYi 个知识点中任意一个后,学习 HiHi 天即可掌握另一个知识点”。
留给立华奏的时间所剩无几,只有 t 天,因此,她想知道自己能不能在这 t 天内学习完成所有的知识点。
最近,实力强大的 QingyuQingyu 当选了 IODS 9102 的出题人。众所周知, IODS 是一场极其毒瘤的比赛。为了在这次比赛中取得好的成绩,立华奏决定学习可能考到的每一个知识点。
在 QingyuQingyu 的博客中,立华奏得知这场比赛总共会考察选手 n 个知识点。此前,立华奏已经依靠自学学习了其中 k 个知识点。接下来,立华奏需要学习其他的知识点,每学习一个单独的知识点,需要消耗的时间为 TiTi 天。同时,某些知识点之间存在联系,可以加速学习的过程。经过计算,立华奏一共发现了其中 m 种联系,第 i 种联系可以表示为(Xi,Yi,Hi)(Xi,Yi,Hi),其含义为“在掌握了第 XiXi 个知识点和第 YiYi 个知识点中任意一个后,学习 HiHi 天即可掌握另一个知识点”。
留给立华奏的时间所剩无几,只有 t 天,因此,她想知道自己能不能在这 t 天内学习完成所有的知识点。
输入描述:
本题输入量较大,请注意使用效率较高的读入方式
输入的第一行包含四个整数 n, m, k, t,含义见上所述。
接下来一行,包含 n 个整数,依次表示 T1,T2,⋯,TnT1,T2,⋯,Tn
接下来一行,包含 k 个整数,表示立华奏已经学习过的知识点。如果 k=0,则此处为一空行。
接下来 m 行,每行 3 个整数 Xi,Yi,HiXi,Yi,Hi,描述一种联系。
输出描述:
如果立华奏能够学习完所有的知识点,输出一行 Yes。否则输出 No
示例1
示例2
备注:
0⩽k⩽n⩽106,m⩽5×106,t⩽1018,Ti,Hi⩽103
感觉这道题完全就是面向数据编程,而且数据还有点弱,好多人贪心暴力写的,竟然过了,跑的贼快,也是醉了。
不用读入挂过不了。然后就是我结构体里面写排序竟然比写外面慢???!写里面超时了,写外面bool型的过了,队友写里面过了,外面没过,试了三种排序,有点意思,反正乱七八糟的。
建一个虚拟的节点,所有节点都和这个节点相连,然后跑最小生成树。因为有的节点是靠其他节点,有的是直接取自己的值。kruskal直接写主函数里面了。
读入挂,写n=read()的比read(n)的快。
代码:
1 //C-最小生成树-要用读入挂,然后就是排序函数写外面,写结构体里面也超时了。。。 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=6e6+10; 6 7 namespace IO{ 8 char buf[1<<15],*S,*T; 9 inline char gc(){ 10 if (S==T){ 11 T=(S=buf)+fread(buf,1,1<<15,stdin); 12 if (S==T)return EOF; 13 } 14 return *S++; 15 } 16 inline int read(){ 17 int x; bool f; char c; 18 for(f=0;(c=gc())<'0'||c>'9';f=c=='-'); 19 for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0')); 20 return f?-x:x; 21 } 22 inline long long readll(){ 23 long long x;bool f;char c; 24 for(f=0;(c=gc())<'0'||c>'9';f=c=='-'); 25 for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0')); 26 return f?-x:x; 27 } 28 } 29 using IO::read; 30 using IO::readll; 31 32 struct edge{ 33 int u,v; 34 ll w; 35 36 // friend bool operator<(edge a,edge b){ 37 // return a.w<b.w; 38 // } 39 40 }path[maxn]; 41 42 bool cmp(edge a,edge b) 43 { 44 return a.w<b.w; 45 } 46 47 int cnt=0; 48 int fa[maxn]; 49 ll cost[maxn]; 50 51 int Find(int x) 52 { 53 if(fa[x]==x) return x; 54 return fa[x]=Find(fa[x]); 55 } 56 57 int main() 58 { 59 int n,m,k; 60 ll t; 61 n=read();m=read();k=read();t=readll(); 62 for(int i=1;i<=n;i++){ 63 cost[i]=read(); 64 } 65 if(k!=0){ 66 for(int i=1;i<=k;i++){ 67 int p; 68 p=read(); 69 cost[p]=0; 70 } 71 } 72 for(int i=1;i<=n;i++){ 73 path[++cnt]=edge{0,i,cost[i]}; 74 } 75 for(int i=1;i<=m;i++){ 76 int u,v,w; 77 u=read();v=read();w=read(); 78 path[++cnt]=edge{u,v,w}; 79 } 80 // sort(path+1,path+1+n,[](edge a,edge b){return a.w<b.w;}); 81 sort(path+1,path+1+n,cmp); 82 for(int i=1;i<=n;i++){ 83 fa[i]=i; 84 } 85 ll ans=0; 86 for(int i=1;i<=cnt;i++){ 87 int fx=Find(path[i].u); 88 int fy=Find(path[i].v); 89 if(fx!=fy){ 90 fa[fx]=fa[fy]; 91 ans+=path[i].w; 92 } 93 } 94 if(ans<=t) printf("Yes "); 95 else printf("No "); 96 return 0; 97 }
。。。