经典题。

经典差分约束模型。

但是

显然这个总长是有上下界的。

直接二分总长,判断有没有负环

如果没有负环好办,有负环就不知道怎么偏了。

因为没有单调性

(如果所有没有单调性的函数图像,都知道往哪里走更优,

岂不是全都可以二分了

但是本题特殊在于,至少还是个区间!

二分左右端点。

负环记录k*mid+b的k,根据k的正负就可以知道哪个方向可能有解。

任意一个负环都可以判断的。

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define fi first
  5. #define se second
  6. #define mk(a,b) make_pair(a,b)
  7. #define numb (ch^'0')
  8. #define pb push_back
  9. #define solid const auto &
  10. #define enter cout<<endl
  11. #define pii pair<int,int>
  12. using namespace std;
  13. // #define int long long
  14. typedef long long ll;
  15. template<class T>il void rd(T &x){
  16. char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  17. for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
  18. template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
  19. template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
  20. template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
  21. namespace Modulo{
  22. const int mod=;
  23. il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
  24. il int sub(int x,int y){return ad(x,mod-y);}
  25. il int mul(int x,int y){return (ll)x*y%mod;}
  26. il void inc(int &x,int y){x=ad(x,y);}
  27. il void inc2(int &x,int y){x=mul(x,y);}
  28. il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
  29. template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
  30. template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
  31. }
  32. // using namespace Modulo;
  33. namespace Miracle{
  34. const int N=;
  35. const ll inf=1e9+;
  36. int n,m1,m2;
  37. struct node{
  38. int fr,nxt,to;
  39. int k,b;
  40. ll val(ll x){
  41. return (ll)k*x+b;
  42. }
  43. }e[N*N];
  44. int hd[N],cnt;
  45. void add(int x,int y,int k,int b){
  46. // cout<<" add "<<x<<" to "<<y<<" k "<<k<<" b "<<b<<endl;
  47. e[++cnt].nxt=hd[x];
  48. e[cnt].to=y;e[cnt].k=k;e[cnt].b=b;
  49. e[cnt].fr=x;
  50. hd[x]=cnt;
  51. }
  52. ll dis[N],pre[N];
  53. int has[N];
  54. bool vis[N];
  55. queue<int>q;
  56. int spfa(ll mid){
  57. memset(dis,0x3f,sizeof dis);
  58. dis[]=;
  59. memset(vis,,sizeof vis);
  60. while(!q.empty()) q.pop();
  61. has[]=;
  62. q.push();
  63. while(!q.empty()){
  64. int x=q.front();q.pop();vis[x]=;
  65. for(reg i=hd[x];i;i=e[i].nxt){
  66. int y=e[i].to;
  67. if(dis[y]>dis[x]+e[i].val(mid)){
  68. dis[y]=dis[x]+e[i].val(mid);
  69. pre[y]=i;
  70. has[y]=has[x]+;
  71. if(has[y]==n+){
  72. int z=y;
  73. memset(vis,,sizeof vis);
  74. do{
  75. vis[z]=;
  76. z=e[pre[z]].fr;
  77. }while(!vis[z]);
  78. int k=;
  79. int lp=z;
  80. do{
  81. k+=e[pre[z]].k;
  82. z=e[pre[z]].fr;
  83. }while(z!=lp);
  84.  
  85. if(k>){
  86. return ;
  87. }else return -;
  88. }
  89.  
  90. if(!vis[y]){
  91. vis[y]=;
  92. q.push(y);
  93. }
  94. }
  95. }
  96. }
  97. return ;
  98. }
  99. void clear(){
  100. memset(hd,,sizeof hd);cnt=;
  101. }
  102. int main(){
  103. // rd(n);rd(m);
  104. int T;
  105. rd(T);
  106. while(T--){
  107. clear();
  108. rd(n);rd(m1);rd(m2);
  109. for(reg i=;i<n;++i){
  110. add(i,i-,,-);
  111. }
  112. add(,n-,,-);
  113. int a,b,c;
  114. for(reg i=;i<=m1;++i){
  115. rd(a);rd(b);rd(c);
  116. if(a<b){
  117. add(b,a,,-c);
  118. }else{
  119. add(b,a,,-c);
  120. }
  121. }
  122. for(reg i=;i<=m2;++i){
  123. rd(a);rd(b);rd(c);
  124. if(a<b){
  125. add(a,b,,c);
  126. }else{
  127. add(a,b,-,c);
  128. }
  129. }
  130. ll L=n,R=(ll)n*inf;
  131. ll al=R+;
  132. while(L<=R){
  133. ll mid=(L+R)>>;
  134. int lp=spfa(mid);
  135. if(lp==-){
  136. R=mid-;
  137. }else if(lp==){
  138. L=mid+;
  139. }else{
  140. al=mid;R=mid-;
  141. }
  142. }
  143. L=n,R=(ll)n*inf;
  144. ll ar=n-;
  145. while(L<=R){
  146. ll mid=(L+R)>>;
  147. int lp=spfa(mid);
  148. if(lp==-){
  149. R=mid-;
  150. }else if(lp==){
  151. L=mid+;
  152. }else{
  153. ar=mid;L=mid+;
  154. }
  155. }
  156. // cout<<" al "<<al<<" ar "<<ar<<endl;
  157. if(ar<al){
  158. puts("");
  159. }else if(ar==(ll)n*inf){
  160. puts("-1");
  161. }else{
  162. printf("%lld\n",ar-al+);
  163. }
  164. }
  165. return ;
  166. }
  167.  
  168. }
  169. signed main(){
  170. Miracle::main();
  171. return ;
  172. }
  173.  
  174. /*
  175. Author: *Miracle*
  176. */

二分条件:单调性

一切可以得知最优解方向的,也都可以二分

51nod1340地铁环线的更多相关文章

  1. 题解 [51nod1340]地铁环线

    题解 [51nod1340]地铁环线 题面 解析 本文参考这篇博客 一开始看到只有120行就打算写一写, 结果一刚就是三个星期摆摆摆 本来是当查分约束入门学的. step 1 首先来考虑下如果已知总长 ...

  2. 51nod1340 地铁环线

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1340 设x为环线的长度,要判断某个特定的x是否可行,不难将题目转为差分约 ...

  3. 【51nod 1340】地铁环线

    题目 有一个地铁环线,环线中有N个站台,标号为0,1,2,...,N-1.这个环线是单行线,一共由N条有向边构成,即从0到1,1到2,..k到k+1,...,N-2到N-1,N-1到0各有一条边.定义 ...

  4. [题解] 51 nod 1340 地铁环线

    不难看出这是一道差分约束的题目. 但是如果想按照通常的题目那样去建边的话,就会发现这句话--相邻两站的距离至少是1公里--建边后就直接让整个题出现了负环(默认是按求最短路建边),没法做了. 这时我们就 ...

  5. 【51nod】1340 地铁环线

    今天头非常疼,躲在家里没去机房 反正都要颓废了,然后花了一上午研究了一下这道神题怎么做-- 题解 首先我们发现,如果我们设\(dis[i]\)为从\(0\)节点走到\(i\)节点的距离 那么题目中给出 ...

  6. 【UR #2】跳蚤公路

    [UR #2]跳蚤公路 参照yjc方法.也就是地铁环线那个题. 求每个点不在负环内的x的取值范围.然后所有1到j能到i的j的范围取交.得到答案. 每个边形如kx+b的直线,每个环也是 每个点不在负环内 ...

  7. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  8. P4005 小 Y 和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  9. 华为上机测试题(地铁换乘-java)

    PS:自己写的,自测试OK,供大家参考. /* 高级题样题:地铁换乘描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的.经过的站点名分别如下,两条线交叉的换乘点用T1.T2表示.编写 ...

随机推荐

  1. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  2. vue2.0 项目小总结

    最近做了一个vue的PC端的项目,不大,真正用到vue的东西也不是太多,逻辑处理用到了不少原生js东西. 1.图片渲染 后台返回base64格式数据,一开始绑定src,提示pic字段未定义,懵逼了好久 ...

  3. 10个Eclipse珍藏插件推荐

    1.Open Explorer 打开资源管理器插件,这是一个从Eclipse里面可以直接定位打开windows资源管理器文件的插件,这个版本的插件在最新的Eclipse版本中都能使用. 下载地址:ht ...

  4. 使用phpexcel导入excel文件种的时期数据时数据导入格式

    在使用phpexcel导入类似于 YYYY-MM-DD HH:ii:ss格式的数据时,导入成功以后会发现导入的数据其实是类似于42085.746516204格式的数据( excel在存储时间类型的数据 ...

  5. Robot Framework +钉钉通知(Dingding[钉钉] Plugin)构建通知

    1.点击钉钉个人头像进入[机器人管理] 2.添加自定义机器人 3.创建机器人,选择通知群 4.完善机器人信息 5.复制机器人token(只需要连接access_token后面token) 6.进入je ...

  6. 阿里云 消息队列mq

    使用阿里云消息队列 控制台地址:http://ons.console.aliyun.com/#/home/topic Demo: 支付消息mq工厂类: public class DfacePayCon ...

  7. C#设计模式V2(1)——单例模式

    出自:https://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计 ...

  8. setquota - 设置磁盘配额或时间限制

    SYNOPSIS(总览) setquota [ -u | -g ] filesystem-name block-soft block-hard inode-soft inode-hard name.. ...

  9. 图形设计 X11

    显示适配器驱动程序安装范例 AMD驱动加载 Intel驱动加载

  10. Educational Codeforces Round 69 E - Culture Code (最短路计数+线段树优化建图)

    题意:有n个空心物品,每个物品有外部体积outi和内部体积ini,如果ini>outj,那么j就可以套在i里面.现在我们要选出n个物品的一个子集,这个子集内的k个物品全部套在一起,且剩下的物品都 ...