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 ...
随机推荐
- java学习笔记 --- 多线程(线程安全问题——同步代码块)
1.导致出现安全问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 2.解决线程安全问题方法: 同步代码块: synchronized(对象){ 需要同步的代码; ...
- Mybatis_generator自动化生成代码
1.Run as 2.ok
- Linux命令学习(18):route命令
版权声明更新:2017-05-20博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的route命令. ...
- JS计算字符串的长度
最近项目上经常要用到计算字符串的长度的问题,有时需要按照byte进行计算长度,所以我就想在页面上用js实现,于是就到网上查了相关的资料,发现确实有很多的版本,这里给出两个比较好用的. //方法一:逐个 ...
- Sql server big data如何批量update数据
原因: 要一次性update 2千万条数据,虽然update sql很简单,但是由于一次性修改太多的数据,造成数据库log满了,就会报error: [ErrorCode: 9002, SQL Stat ...
- hihoCoder#1079(线段树+坐标离散化)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学 ...
- Python:函数变量的使用
1.上层函数不能直接使用其嵌套函数的变量: def func1(x, y): z = x + y def func2(): m = 3 z += m return z print(func1(1, 2 ...
- linux uid/euid/suid
Each UNIX process has 3 UIDs associated to it. Superuser/root is UID=0. UID Read UID. It is of the u ...
- cron job error : c queue max run limit reached
在cron job的日志中发现以下报错: ! c queue max run limit reached Wed Aug 28 12:56:00 2013 ! rescheduling a cron ...
- 12-22C#公共控件(基本功能)
在C#窗体中,公共控件的基本功能: 1.获取.设置控件的参数值: 2.事件(其实是一种特殊的方法和属性,当被其他外力触发它,就会发生,类似数据库的触发器.) 下面是基本的公共控件: 1.复选框 1)设 ...