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得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- 原生js作用域(红宝书)
function fn(){ ; alert(a); // 2; } alert(a);//未被定义: alert(b);//全局变量:b=2: ; function fn1(){ ; functio ...
- Windows环境搭建mysql服务器
Windows环境搭建mysql服务器: 1.下载mysql-installer-community-5.7.3.0-m13.2063434697并安装 安装详细步骤>> 2.安装mys ...
- [书摘]HTTPS--From图解HTTP
1. HTTP存在的安全性风险: 1) 通信过程使用明文,容易被窃听 2) 不验证通信方的身份,可能遭遇伪装 3) 不验证通信数据包的完整性,可能遭遇篡改 2. HTTP+加密+认证+完整性保护=H ...
- linux_shell自定义命令
一.命令可执行文件所在目录 shell命令可执行文件所在目录是保存在环境变量PATH中的,终端输入如下命令查看 PATH 环境变量的内容: $ echo $PATH 我的linux输出如下: /opt ...
- PP学习笔记-业务基础
生产主数据.生产计划.生产订单与生产执行 生产模块主要子模块及功能:PP-BD 基本数据管理 PP-SFC车间订单管理 PP-MRP物料需求计划 PP-MPS主生产计划 PP-CRP能力计划 PP-I ...
- 同步工具:CountDownLatch、CyclicBarrier和Semaphore
1. CountDownLatch 1.1 功能及使用场景 一个同步工具,使得一个或多个线程等待一组线程执行完成后再执行. 使用场景:等待一些前置任务执行完成后,再执行特定的功能.比如,系统启动时,各 ...
- Django-website 程序案例系列-1 最简单的web服务器
templates:html模板文件夹下面建立文件login.html <!DOCTYPE html> <html lang="en"> <head& ...
- Luogu4782 【模板】2-SAT 问题(2-SAT)
模板.注意若x=y不一定是废话,x=0或x=0表示x必须为0.以及数组开2n. #include<iostream> #include<cstdio> #include< ...
- 浅析python日志重复输出问题
浅析python日志重复输出问题 问题起源: 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日 ...
- MT【3】只有零向量旋转不变
解答: 评:利用了零向量方向不唯一的性质.