CodeChef - CRYPCUR
AMRExchange is the latest cryptocurrency exchange that has become very popular among cryptocurrency traders.
On AMRExchange, there are N cryptocurrencies - let us denote the ith currency by Ci. Mpairs of these cryptocurrencies are tradable - one unit of currency Cx can be converted to one unit of currency Cy with risk Cxy.
Mr. X, an avid cryptocurrency collector, wants to start with 1 unit of any of the Ncryptocurrencies and perform a sequence of trades. He wants to do it in such a way that for each of the N cryptocurrencies, there was at least one point during the trading sequence during which he held one unit of that cryptocurrency.
The overall risk of the sequence of trades is the maximum risk in the sequence of trades. Minimize the overall risk with which Mr. X can achieve this. Print "Impossible" if no such sequence of trades is possible.
Input
- The first line contains a single integer T - the total number of testcases.
- Each testcase is of the following format:
- First line contains 2 space-separated integers - N and M. N denotes the number of cryptocurrencies, M denotes the number of tradable ordered cryptocurrency pairs.
- M lines follow. Each line contains 3 space-separated positive integers - Cx, Cyand Cxy. This line denotes that one unit of currency Cx can be converted into one unit of currency Cy with risk Cxy.
Output
- For each testcase, print the minimum overall risk with which Mr. X can own at least one unit of each cryptocurrency at some point in time.
- If it is not possible for Mr. X to achieve this, then print “Impossible”.
Constraints
- 1 ≤ T ≤ 5
- 1 ≤ N, M ≤ 105
- 1 ≤ Cx, Cy ≤ N
- 1 ≤ Cxy ≤ 109
Example
Input
2
3 6
1 2 1
2 3 3
3 1 3
1 3 1
3 2 1
3 2 5
4 3
1 2 1
2 3 1
2 4 1 Output
1
Impossible
Explanation
Testcase 1: Mr. X can start with cryptocurrency C1 and follow the following sequence to minimize overall risk:
- Convert C1 to C3 with risk 1.
- Convert C3 to C2 with risk 1.
The overall risk would be 1.
Testcase 2: There are a total of 6 sequences of trades are possible, and none of them satisfy our property. We list them here:
Starting with C1:
- C1 -> C2 -> C3
- C1 -> C2 -> C4
In the first sequence, Mr. X won't be able to own C4 because units of C3 cannot be converted to units of C4. Similarly, in the second sequence, Mr. X won't be able to own C3 because units of C4 cannot be converted to units of C3.
Starting with C2:
- C2 -> C3
- C2 -> C4
Starting with C3:
- C3 (cannot be converted to any other cryptocurrency)
Starting with C4:
- C4 (cannot be converted to any other cryptocurrency)
Hence, there is no possible sequence using which Mr. X can own one unit of all cryptocurrencies at some point in time.
题意
给一个有边权的图,找出最小的权值,使得以这个权值能走遍所有的点。
分析
二分权值。对于某个权值,以这个权值为基准来缩点,构建出新的简单有向图,然后求出拓扑序,检查是否可以形成链状。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include <queue>
#include <vector>
#include<bitset>
#include<map>
#include<deque>
#include<stack>
using namespace std;
typedef pair<int,int> pii;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
#define ms(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+;
const int mod = +;
#define lson l,m,2*rt
#define rson m+1,r,2*rt+1
typedef long long ll;
vector<pii> G[maxn];
vector<int> g[maxn];
int indeg[maxn];
int n,m;
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_block,scc_cnt;
stack<int> S;
void dfs(int u,int lim){
pre[u]=lowlink[u]=++dfs_block;
S.push(u);
for(int i=;i<G[u].size();i++){
if(G[u][i].Y>lim) continue;
int v=G[u][i].X;
if(!pre[v]){
dfs(v,lim);
lowlink[u]=min(lowlink[u],lowlink[v]);
}else if(!sccno[v]){
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]){
scc_cnt++;
while(){
int x=S.top();S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
return;
}
void find_scc(int n,int lim){
dfs_block=scc_cnt=;
ms(sccno,);
ms(pre,);
for(int i=;i<=n;i++){
if(!pre[i]) dfs(i,lim);
}
return;
} bool check(int mid){
ms(indeg,);
for(int i=;i<=scc_cnt;i++){
g[i].clear();
}
find_scc(n,mid);
for(int i=;i<=n;i++){
for(int j=;j<G[i].size();j++){
int u,v,w;
u=i;
v=G[i][j].X;
w=G[i][j].Y;
if(w>mid) continue;
if(sccno[u]==sccno[v]) continue;
g[sccno[u]].pb(sccno[v]);
indeg[sccno[v]]++;
}
} queue<int> que;
for(int i=;i<=scc_cnt;i++) if(indeg[i]==) que.push(i);
vector<int> topu;
while(!que.empty()){
int now=que.front();
que.pop();
topu.pb(now);
for(int i=;i<g[now].size();i++){
indeg[g[now][i]]--;
if(indeg[g[now][i]]==){
que.push(g[now][i]);
}
}
} if(topu.size()<=) return true;
for(int i=;i<topu.size()-;i++){
int now=topu[i];
bool flag=;
for(int j=;j<g[now].size();j++){
int tmp=g[now][j];
if(tmp==topu[i+]){
flag=;
break;
}
}
if(!flag){
return false;
}
}
return true;
}
void solve(){
int l=,r=1e9+;
int mid;
int ans=inf;
while(l<=r){
mid=(l+r)>>;
if(check(mid)){
r=mid-;
ans=min(mid,ans);
}else l=mid+;
}
if(ans==inf) puts("Impossible");
else printf("%d\n",ans);
} int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int t,u,v,w;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) G[i].clear();
for(int i=;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
G[u].pb(mp(v,w));
}
solve();
}
return ;
}
CodeChef - CRYPCUR的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- XMLHttpRequest.withCredentials
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials var xhr = new XMLHtt ...
- yum install 报错[Errno 14] curl#37 - Couldn't open file /mnt/repodata/repomd.xml
1.然后按照网上的一些修改,先是执行: yum cleam all 然后 yum makecache,问题还是没解决,继续报错. 其实这两条命令就是清空缓存,然后再重新缓存的意思,有时候可能有效. 2 ...
- (String)强制转换、toString()和String.valueOf()的区别
String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在java的世界里没有什么东西是没有缺点的,总有一些好的方面同时也 ...
- C# region指令和控制台清零
region指令 有的时候,为了完成一个需求,可能会写几十行.几百行.甚至几千行代码. 当代码数量非常多的时候,尽管你可以使用很详细的注释来帮助阅读,但也不太容易分清楚哪些代码在干什么事情. 因此,C ...
- 学习笔记12之通过ajax动态添加选项
- if --else的注意点
- 一个本科学生对Linux的认知
我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要的技能,无疑是纸上谈兵,一门语言的学习,需要的 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- python numpy 数组拼接
我就写一下我遇到的,更多具体的请看Python之Numpy数组拼接,组合,连接 >>> aarray([0, 1, 2], [3, 4, 5], [6, 7, ...
- 自定义git忽略规则
输入命令 >a.o git status 此时我想让git忽略这个文件的更新 输入命令 > .gitignore echo "a.o" >> .gitign ...