UVALive 5532 King(差分约束,spfa)
题意:假设一个序列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个限制总算有联系了吧!自己画图吧,太难解释了。他们还是无法造成冲突。
- #include <bits/stdc++.h>
- #define INF 0x7f7f7f7f
- #define pii pair<int,int>
- #define LL unsigned long long
- using namespace std;
- const int N=;
- struct node
- {
- int from, to, cost;
- node(){};
- node(int from,int to,int cost):from(from),to(to),cost(cost){};
- }edge[N*N*];
- vector<int> vect[N];
- int edge_cnt;
- void add_node(int from,int to,int cost)
- {
- edge[edge_cnt]=node(from,to,cost);
- vect[from].push_back(edge_cnt++);
- }
- set<int> sett;
- int cost[N], cnt[N];
- bool inq[N];
- int spfa(int up)
- {
- memset(inq, , sizeof(inq));
- memset(cnt, , sizeof(cnt));
- memset(cost, , sizeof(cost));
- deque<int> que;
- for(set<int>::iterator it=sett.begin(); it!=sett.end(); it++) que.push_back(*it);//全部进!
- while(!que.empty())
- {
- int x=que.front();que.pop_front();
- inq[x]=;
- for(int i=; i<vect[x].size(); i++)
- {
- node e=edge[vect[x][i]];
- if(cost[e.to]>cost[x]+e.cost)
- {
- cost[e.to]=cost[x]+e.cost;
- if(!inq[e.to])
- {
- inq[e.to]=;
- if(++cnt[e.to]>up) return false;
- if(!que.empty()&&cost[e.to]<cost[que.front()])//优化
- que.push_front(e.to);
- else
- que.push_back(e.to);
- }
- }
- }
- }
- return true;
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- int n, m, a, b, d, L, U;
- char c[];
- while(scanf("%d", &n), n)
- {
- sett.clear();
- edge_cnt=;
- memset(edge,,sizeof(edge));
- for(int i=; i<=n; i++) vect[i].clear();
- scanf("%d",&m);
- for(int i=; i<m; i++)
- {
- scanf("%d %d %s %d ", &a, &b, &c, &d);
- sett.insert(a-);
- sett.insert(a+b);
- if(c[]=='g') //大于
- {
- add_node( a+b, a-, -(d+));
- }
- else
- {
- add_node( a-, a+b, d-);
- }
- }
- if(spfa(sett.size())) puts("lamentable kingdom");
- else puts("successful conspiracy");
- }
- return ;
- }
AC代码
UVALive 5532 King(差分约束,spfa)的更多相关文章
- 【poj3169】【差分约束+spfa】
题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...
- O - Layout(差分约束 + spfa)
O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...
- POJ——1364King(差分约束SPFA判负环+前向星)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11946 Accepted: 4365 Description ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...
- (简单) POJ 3169 Layout,差分约束+SPFA。
Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...
- poj Layout 差分约束+SPFA
题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...
- King 差分约束 判负环
给出n个不等式 给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki当符号为gt代表‘ ...
随机推荐
- HDU 4287 Intelligent IME(string,map,stl,make_pair)
题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...
- POJ 2109
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int mai ...
- Oracle MySQL
http://blog.jobbole.com/46510/ http://blackproof.iteye.com/blog/1570456 http://blog.csdn.net/yzsind/ ...
- sql只修改第一二行数据
update t_table set colname=* where a=1 order by id desc limit 1,2
- div滚动条
给DIV限定宽度或高度,并指定overflow样式为auto,这样当内空超出后就会自动出现滚动条了.如<div style="width:100px; height:100px; ov ...
- Hortworks Hadoop生态圈简介
Hortworks 作为Apache Hadoop2.0社区的开拓者,构建了一套自己的Hadoop生态圈,包括存储数据的HDFS,资源管理框架YARN,计算模型MAPREDUCE.TEZ等,服务于数据 ...
- 创业者拿到融资别高兴太早,当心TS中的优先清算权
最近创投圈的新闻读起来真是让人有些绝望啊,一家家创业公司接连宣告倒闭,其中不乏一些走在比较后面的“明星企业”,冷不丁冒出点消息,却是创始人发的公告,宣布公司资金链断裂,进入破产清算程序,或被低价并购. ...
- 转载网易博客:整理各大网站让网站变灰的css代码
2013-07-21 15:06:47 北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震.震源深度13公里.各大网站将其网站变灰,本人整理了下部 ...
- linux查询cpu核心数
linux怎么查询cpu核心数 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 2.由于有超线程 ...
- Android 音乐播放器之--错误状态下调用导致的异常
MediaPlayer必须在合适的状态下调用合适的方法,否则会出现异常,下面列出常见错误信息和说明: 1.E/MediaPlayer(11310): stop called in state 1 调用 ...