[BZOJ2788][Poi2012]Festival

2788: [Poi2012]Festival

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 187  Solved: 91
[Submit][Status][Discuss]

Description

有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类:

1. 给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb

2. 给出c,d (1<=c,d<=n),要求满足Xc <= Xd

在满足所有限制的条件下,求集合{Xi}大小的最大值。

Input

第一行三个正整数n, m1, m2 (2<=n<=600, 1<=m1+m2<=100,000)。

接下来m1行每行两个正整数a,b (1<=a,b<=n),表示第一类限制。

接下来m2行每行两个正整数c,d (1<=c,d<=n),表示第二类限制。

Output

一个正整数,表示集合{Xi}大小的最大值。

如果无解输出NIE。

Sample Input

4 2 2

1 2

3 4

1 4

3 1

Sample Output

3

HINT

|X3=1, X1=X4=2, X2=3

这样答案为3。容易发现没有更大的方案。

Source

鸣谢 oimaster

[Submit][Status][Discuss]

此题显然是个差分约束系统,先建好图。

如果两个点不是强连通的,显然这两个点不会互相影响。

所以先tarjan缩点,如果不在一个强连通块里的不会有影响,所以只需要考虑同意连通块内的点。

求元素不同的最大值等价于连通块内的最长路+1,由于数据范围较小,floyd即可。

如果存在正环,则 无解。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 605
 4 #define M 500010
 5 using namespace std;
 6 int head[N],dfn[N],belong[N],low[N],scc;
 7 int map[N][N],q[N],top,tot,n,m1,m2,id,ans;
 8 bool vis[N];
 9 struct edge{int next,to;}e[M];
10 #define add(u,v) e[++tot]=(edge){head[u],v},head[u]=tot
11 void tarjan(int x)
12 {
13     low[x]=dfn[x]=++id;
14     q[++top]=x;vis[x]=1;
15     for(int i=head[x];i;i=e[i].next)
16     if(!dfn[e[i].to])
17     tarjan(e[i].to),low[x]=min(low[x],low[e[i].to]);
18     else if(vis[e[i].to])
19     low[x]=min(low[x],dfn[e[i].to]);
20     int now=0;
21     if(low[x]==dfn[x])
22     {
23         scc++;
24         while(now!=x)
25         {
26             now=q[top--];
27             belong[now]=scc;
28             vis[now]=0;
29         }
30     }
31 }
32 int main()
33 {
34     scanf("%d%d%d",&n,&m1,&m2);
35     for(int i=1;i<=n;i++)
36     for(int j=1;j<=n;j++)
37     if(i!=j)map[i][j]=-1e9;
38     else map[i][j]=0;
39     int x,y;
40     while(m1--)
41     {
42         scanf("%d%d",&x,&y);
43         add(x,y);
44         add(y,x);
45         map[x][y]=max(map[x][y],1);
46         map[y][x]=max(map[y][x],-1);
47     }
48     while(m2--)
49     {
50         scanf("%d%d",&x,&y);
51         add(x,y);
52         map[x][y]=max(map[x][y],0);
53     }
54     for(int i=1;i<=n;i++)
55     if(!dfn[i])tarjan(i);
56     for(int p=1;p<=scc;p++)
57     {
58         for(int k=1;k<=n;k++)if(belong[k]==p)
59         for(int i=1;i<=n;i++)if(belong[i]==p)
60         if(map[i][k]!=-1e9)
61         for(int j=1;j<=n;j++)if(belong[j]==p)
62         if(map[k][j]!=-1e9)
63         map[i][j]=max(map[i][j],map[i][k]+map[k][j]);
64         int now=0;
65         for(int i=1;i<=n;i++)if(belong[i]==p)
66         for(int j=1;j<=n;j++)if(belong[j]==p)
67         now=max(now,abs(map[i][j]));
68         ans+=now+1;
69     }
70     for(int i=1;i<=n;i++)
71     if(map[i][i]!=0)
72     return puts("NIE"),0;
73     printf("%d",ans);
74 }

时间: 2024-10-12 21:54:30

[BZOJ2788][Poi2012]Festival的相关文章

[Poi2012]Festival

[Poi2012]Festival 题目 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2. 给出c,d (1<=c,d<=n),要求满足Xc <= Xd 在满足所有限制的条件下,求集合{Xi}大小的最大值. INPUT 第一行三个正整数n, m1, m2 (2<=n<=600, 1<=m1+m2<=100,000). 接下来m1行每行两个正整

[Poi2012]Festival 变态 差分约束题

题意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2. 给出c,d (1<=c,d<=n),要求满足Xc <= Xd 在满足所有限制的条件下,求集合{Xi}大小的最大值. (自己注:求集合中不相同的的元素最多) solution (最后发现我tarjan写挂了......) 1.建图 Xa+1==Xb   ->   Xa+1<=Xb &&

bzoj2788 festival 差分约束

填坑中--链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2788 题意: 有$n$个正整数$X1,X2,...,Xn$,再给出$m1+m2$个限制条件,限制分为两类:1. 给出$a,b(1<=a,b<=n)$,要求满足$Xa + 1 = Xb$2. 给出$c,d (1<=c,d<=n)$,要求满足$Xc <= Xd$在满足所有限制的条件下,求集合${Xi}$大小的最大值. 首先看情况我们也知道是差分约束-- 但是这个差分

Bzoj 2789: [Poi2012]Letters 树状数组,逆序对

2789: [Poi2012]Letters Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 278  Solved: 185[Submit][Status][Discuss] Description 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. Input 第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度

[BZOJ2797][Poi2012]Squarks

2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status][Discuss] Description 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj.现在所有取法共n*(n-1)/2个和,要你求出X1,X2,...Xn. Input 第一行一个正整数n (3<=n<=300).第二行n*(n-1)/2

hdu 1850 Being a Good Boy in Spring Festival (尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4658    Accepted Submission(s): 2781 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买

HDU - 1850 - Being a Good Boy in Spring Festival

先上题目: Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4557    Accepted Submission(s): 2713 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场

HDU 1850 Being a Good Boy in Spring Festival 博弈

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7841    Accepted Submission(s): 4811 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买

Being a Good Boy in Spring Festival(尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 51 Accepted Submission(s): 45   Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地