题意:假设一个序列S有n个元素,现在有一堆约束,限制在某些连续子序列之和上,分别有符号>和<。问序列S是否存在?(看题意都看了半小时了!)

  注意所给的形式是(a,b,c,d),表示:区间之和:sum[a,a+b]<d或者sum[a,a+b]>d。而c是两个字符构成,判断前1个字符足矣。

思路:

  首先考虑要用点来表示什么,可以看到所给的是区间,也就是首尾的位置,可令sum(a)表示序列a[1...a]的和,那么表达式大概为sum(a+b)-sum(a-1)<k,由于小于号的存在,得换成小于等于号,所以表达式改为sum(a+b)-sum(a-1)<=k-1就行了。>号也是同理。所给的m个限制就被转换成边了。

  但是好像建完图后,里面有些块完全没联系啊(即不连通)?比如a[1...7]有个限制,a[4...9]也有个限制,但是这4个点压根就是两个帮派的!没有关系的哈,如果不是有交点的话,完全不会产生任何冲突的,比如sum(a[1...7])是与sum(a[4...9])没有任何联系的,因为他们的相交区间sum(a[4...7])的大小无论如何取值,只要在另外一部分另外取合适的值即可(可以为负数),不会冲突,比如sum(a[4....7])=10086,而sum(a[1...7])=0,则sum(a[1...3])=-10086即可。也可以这么说,子区间只要有一个数不同时被限制,无论如何都不会有冲突。

  再举例,a[1...7]和a[4...9]和a[1...9]这3个限制总算有联系了吧!自己画图吧,太难解释了。他们还是无法造成冲突。

  1. #include <bits/stdc++.h>
  2. #define INF 0x7f7f7f7f
  3. #define pii pair<int,int>
  4. #define LL unsigned long long
  5. using namespace std;
  6. const int N=;
  7. struct node
  8. {
  9. int from, to, cost;
  10. node(){};
  11. node(int from,int to,int cost):from(from),to(to),cost(cost){};
  12. }edge[N*N*];
  13. vector<int> vect[N];
  14. int edge_cnt;
  15.  
  16. void add_node(int from,int to,int cost)
  17. {
  18. edge[edge_cnt]=node(from,to,cost);
  19. vect[from].push_back(edge_cnt++);
  20. }
  21.  
  22. set<int> sett;
  23. int cost[N], cnt[N];
  24. bool inq[N];
  25. int spfa(int up)
  26. {
  27. memset(inq, , sizeof(inq));
  28. memset(cnt, , sizeof(cnt));
  29. memset(cost, , sizeof(cost));
  30. deque<int> que;
  31. for(set<int>::iterator it=sett.begin(); it!=sett.end(); it++) que.push_back(*it);//全部进!
  32.  
  33. while(!que.empty())
  34. {
  35. int x=que.front();que.pop_front();
  36. inq[x]=;
  37. for(int i=; i<vect[x].size(); i++)
  38. {
  39. node e=edge[vect[x][i]];
  40. if(cost[e.to]>cost[x]+e.cost)
  41. {
  42. cost[e.to]=cost[x]+e.cost;
  43. if(!inq[e.to])
  44. {
  45. inq[e.to]=;
  46. if(++cnt[e.to]>up) return false;
  47. if(!que.empty()&&cost[e.to]<cost[que.front()])//优化
  48. que.push_front(e.to);
  49. else
  50. que.push_back(e.to);
  51. }
  52. }
  53. }
  54. }
  55. return true;
  56. }
  57.  
  58. int main()
  59. {
  60. freopen("input.txt", "r", stdin);
  61. int n, m, a, b, d, L, U;
  62. char c[];
  63. while(scanf("%d", &n), n)
  64. {
  65. sett.clear();
  66. edge_cnt=;
  67. memset(edge,,sizeof(edge));
  68. for(int i=; i<=n; i++) vect[i].clear();
  69.  
  70. scanf("%d",&m);
  71. for(int i=; i<m; i++)
  72. {
  73. scanf("%d %d %s %d ", &a, &b, &c, &d);
  74. sett.insert(a-);
  75. sett.insert(a+b);
  76. if(c[]=='g') //大于
  77. {
  78. add_node( a+b, a-, -(d+));
  79. }
  80. else
  81. {
  82. add_node( a-, a+b, d-);
  83. }
  84. }
  85. if(spfa(sett.size())) puts("lamentable kingdom");
  86. else puts("successful conspiracy");
  87. }
  88. return ;
  89. }

AC代码

UVALive 5532 King(差分约束,spfa)的更多相关文章

  1. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

  2. O - Layout(差分约束 + spfa)

    O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...

  3. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  4. POJ——1364King(差分约束SPFA判负环+前向星)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11946   Accepted: 4365 Description ...

  5. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

  6. 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...

  7. (简单) POJ 3169 Layout,差分约束+SPFA。

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  8. poj Layout 差分约束+SPFA

    题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...

  9. King 差分约束 判负环

    给出n个不等式 给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki当符号为gt代表‘ ...

随机推荐

  1. HDU 4287 Intelligent IME(string,map,stl,make_pair)

    题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...

  2. POJ 2109

    #include<iostream> #include<stdio.h> #include<math.h> using namespace std; int mai ...

  3. Oracle MySQL

    http://blog.jobbole.com/46510/ http://blackproof.iteye.com/blog/1570456 http://blog.csdn.net/yzsind/ ...

  4. sql只修改第一二行数据

    update t_table set colname=*  where a=1 order by id desc limit 1,2

  5. div滚动条

    给DIV限定宽度或高度,并指定overflow样式为auto,这样当内空超出后就会自动出现滚动条了.如<div style="width:100px; height:100px; ov ...

  6. Hortworks Hadoop生态圈简介

    Hortworks 作为Apache Hadoop2.0社区的开拓者,构建了一套自己的Hadoop生态圈,包括存储数据的HDFS,资源管理框架YARN,计算模型MAPREDUCE.TEZ等,服务于数据 ...

  7. 创业者拿到融资别高兴太早,当心TS中的优先清算权

    最近创投圈的新闻读起来真是让人有些绝望啊,一家家创业公司接连宣告倒闭,其中不乏一些走在比较后面的“明星企业”,冷不丁冒出点消息,却是创始人发的公告,宣布公司资金链断裂,进入破产清算程序,或被低价并购. ...

  8. 转载网易博客:整理各大网站让网站变灰的css代码

    2013-07-21 15:06:47 北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震.震源深度13公里.各大网站将其网站变灰,本人整理了下部 ...

  9. linux查询cpu核心数

    linux怎么查询cpu核心数 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 2.由于有超线程 ...

  10. Android 音乐播放器之--错误状态下调用导致的异常

    MediaPlayer必须在合适的状态下调用合适的方法,否则会出现异常,下面列出常见错误信息和说明: 1.E/MediaPlayer(11310): stop called in state 1 调用 ...