Luogu 3530 [POI2012]FES-Festival
我是真的不会写差分约束啊呜呜呜……
BZOJ 2788被权限了。
首先对于第一个限制$x + 1 = y$,可以转化成$x + 1 \leq y \leq x + 1$,
所以连一条$(y, x, -1)$,再连一条$(x, y, 1)$。
第二个状态即为$x \leq y$,连边$(y, x, 0)$。
如果有负环就无解了。
发现在这个图中,每一个强连通分量都互相不干扰,我们可以缩点找出所有的强连通分量,然后找到里面的最长路$ + 1$累加到答案中去。
时间复杂度$O(能过)$。
感觉$POI$的数据挺满的,我的代码跑得挺慢的。
Code:
#include <cstdio>
#include <cstring>
using namespace std; const int N = ;
const int M = 3e5 + ; int n, m1, m2, tot = , head[N], f[N][N];
int ans = , scc = , bel[N], dfsc = , dfn[N], low[N], top = , sta[N];
int sCnt, s[N];
bool vis[N]; struct Edge {
int to, nxt;
} e[M]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMin(int &x, int y) {
if(y < x) x = y;
} inline int min(int x, int y) {
return x > y ? y : x;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline void solve() {
int res = ;
for(int i = ; i <= sCnt; i++)
for(int j = ; j <= sCnt; j++) {
int x = s[i], y = s[j];
chkMax(res, f[x][y]);
}
ans += res + ;
} void tarjan(int x) {
dfn[x] = low[x] = ++dfsc;
sta[++top] = x, vis[x] = ;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(!dfn[y]) {
tarjan(y);
low[x] = min(low[x], low[y]);
} else if(vis[y]) low[x] = min(low[x], dfn[y]);
} if(low[x] == dfn[x]) {
++scc; sCnt = ;
for(; sta[top + ] != x; --top) {
vis[sta[top]] = ;
bel[sta[top]] = scc;
s[++sCnt] = sta[top];
}
solve();
}
} int main() {
read(n), read(m1), read(m2);
memset(f, 0x3f, sizeof(f));
for(int x, y, i = ; i <= m1; i++) {
read(x), read(y);
add(x, y), add(y, x);
chkMin(f[x][y], ), chkMin(f[y][x], -);
}
for(int x, y, i = ; i <= m2; i++) {
read(x), read(y);
add(y, x);
chkMin(f[y][x], );
} for(int i = ; i <= n; i++) f[i][i] = ;
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
chkMin(f[i][j], f[i][k] + f[k][j]); for(int i = ; i <= n; i++)
if(f[i][i] < ) {
puts("NIE");
return ;
} for(int i = ; i <= n; i++)
if(!dfn[i]) tarjan(i); printf("%d\n", ans);
return ;
}
Luogu 3530 [POI2012]FES-Festival的更多相关文章
- Luogu 3537 [POI2012]SZA-Cloakroom
背包. 首先考虑将所有询问离线按照$m$从小到大排序,然后把所有物品按照$a$从小到大排序,对于每一个询问不断加入物品. 设$f_i$表示在组成容量为$i$的背包的所有方案中$b$最小的一个物品的最大 ...
- Luogu P3546 [POI2012]PRE-Prefixuffix 神奇的递推+哈希
设$f[i]$表示切掉前$i$位和后$i$位后,即剩下$s[i+1]到s[n-i]$,的公共前后缀长度.此时我们发现,$f[i-1]$相对于$f[i]$少切了两个$char$,所以有$f[i-1]\l ...
- LUOGU P3539 [POI2012]ROZ-Fibonacci Representation
传送门 解题思路 打了个表发现每次x只会被比x大的第一个fab或比x小的第一个fab表示,就直接写了个爆搜骗分,结果过了.. 代码 #include<iostream> #include& ...
- [BZOJ2788][Poi2012]Festival
2788: [Poi2012]Festival Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 187 Solved: 91[Submit][Statu ...
- [Poi2012]Festival 题解
[Poi2012]Festival 时间限制: 1 Sec 内存限制: 64 MB 题目描述 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1 ...
- [Poi2012]Festival 差分约束+tarjan
差分约束建图,发现要在每个联通块里求最长路,600,直接O(n3) floyed #include<cstdio> #include<cstring> #include< ...
- luogu P4744 [Wind Festival]Iron Man
再次感谢题解区大佬的指点 规定\(pre[i]\)表示前缀\(i\)的前缀和,\(sum[i][j]\)表示区间\([i,j]\)之和 令\(f[i][j]\)表示前i个数选出j段的最大值,\(g[i ...
- [POI2012]Festival
题目大意: 有$n$个正整数$x_1,x_2,\ldots,x_n$,再给出一些限制条件,限制条件分为两类: 1.给出$A,B$,要求满足$X_A+1=X_B$: 2.给出$C,D$,要求满足$X_C ...
- bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd
题目大意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1.给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2.给出c,d (1&l ...
随机推荐
- scnaf()读入字符串需要注意的地方
#include<iostream> #include<cstdio> using namespace std; int main() { ],cch[]; int a; ci ...
- _Meta 部分用法
model.UserInfo._meta.app_label #获取该类所在app的app名称 model.UserInfo._meta.model_name #获取该类对应表名(字符串类型) mod ...
- VSCode使用正则表达式进行内容替换
首先描述一下我要达到的目的: 1.源数据: 2.目标数据: 3.使用的正则表达式如下: (id: (\d+),) id: $2, \n order: $2,
- Memcache mutex设计模式
Memcache mutex设计模式 转自:https://timyang.net/programming/memcache-mutex/ 场景 Mutex主要用于有大量并发访问并存在cache过期的 ...
- tensorflow 学习笔记-1
http://www.jianshu.com/p/e112012a4b2d 参考的网站 -------------------------------------------------------- ...
- bzoj3597 方伯伯运椰子
有一个 DAG,有一个源点,一个汇点和很多条边,每条边有花费 $d_i$ 和最大流量 $c_i$,可以花 $b_i$ 的钱把最大流量增加 $1$,花 $a_i$ 的钱把最大流量减少 $1$ 现在要进行 ...
- UVA - 1632 Alibaba (区间dp+常数优化)
题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...
- 双向链表(Double-Linked List)
public class doubleLinkedList <Item>{ private Node first; private Node last; private int itemc ...
- java中io的详解
注:本文全篇转载于:http://blog.csdn.net/taxueyingmei/article/details/7697042,觉得讲的挺详细,就借过来看看,挺不错的文章. 先贴一张图 Jav ...
- laravel 添加自定义类 全局自定义方法 自定义常量
添加自定义类 https://blog.csdn.net/suchfool/article/details/38758367 https://blog.csdn.net/liukai6/article ...