题意

有 \(n\) 个变量,有两种限制,分别有 \(m_1,m_2\) 种。限制如下:

  • \(a_x+1=a_y\)
  • \(a_x\le a_y\)

求 \(\{x_i\}\) 集合的大小。\(n\le 600,m_1+m_2\le 10^5\) 。

分析

求集合大小其实就是最多有多少个变量不相同。看到这种变量的加减约束问题,首先想到了差分约束。

建边,若 \(a_x+1=a_y\) ,那么 \(a_x+1\ge a_y,a_y-1\ge a_x\) ,所以连边 \((x,y,1),(y,x,-1)\) 。

若 \(a_x\le a_y\) 那么连边 \((y,x,0)\) 。

先考虑一些特殊的情况。若出现非0的环,就说明出现了矛盾,排除掉这种情况。

对这个图缩环,那么形成了一个DAG,其中的边权值都为0,否则一定有一条跟它反向的边,那么就出现了一个新的环,与DAG定义不符。

那么每一个新点所代表的不同强连通分量之间的点的取值是不影响的。我们只需要考虑每一个的最多取值,全部加起来即可,因为总可以构造出不冲突的方案。

在一个强连通块中走出一条路径,就对应着一组可能的解。从第一个点开始标号,经过边权为1就加一,经过边权为-1就减一,经过边权为0就不变,这样我们得到的解一定是合法的,因为我们满足了所有的要求,而且我们已经排除了正权回路,即不会出现任何矛盾。同时我们得到的解一定是这条路径上从小到大标号中最优的,因为标号必定是连续的。同时,所有的解都能够在图上找到一条路径与之对应。

若这条路径的开头或结尾是-1,那么我们去掉这个,答案变优了,称这个操作为一次优化,那么对于一条路径,不断地优化,然后除去开头就是\((1,-1)\) 和结尾为 \((-1,1)\) 的,这样答案要么变优,要么不变。

最终我们得到了一条路径,这条路径是某两个点间的最短路,它的权值最大。这个权值的意义其实是终点减去起点的值的最大值。由于边权只有 \(\{-1,0,1\}\) ,所以每一个都会被取到。

综上,一个强连通块中的最多取值就是最短路中最长的+1 。

代码

发现之前的Tarjan写的不太对,ins[x] 数组应该在弹栈的时候标记为 false ,而不是退出dfs的时候。

#include<bits/stdc++.h>
using namespace std;
inline char nchar() {
static const int bufl=1<<20;
static char buf[bufl],*a,*b;
return a==b && (b=(a=buf)+fread(buf,1,bufl,stdin),a==b)?EOF:*a++;
}
inline int read() {
int x=0,f=1;
char c=nchar();
for (;!isdigit(c);c=nchar()) if (c=='-') f=-1;
for (;isdigit(c);c=nchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=605;
int n,d[maxn][maxn],col[maxn],cs=0,inf,ans[maxn];
int dfn[maxn],low[maxn],sta[maxn],top=0,dfx=0;
bool ins[maxn],mp[maxn][maxn];
inline void Max(int &x,int y) {x=max(x,y);}
inline void Min(int &x,int y) {x=min(x,y);}
void tarjan(int x) {
dfn[x]=low[x]=++dfx;
sta[++top]=x;
ins[x]=true;
for (int i=1;i<=n;++i) if (i!=x && mp[x][i]) {
if (!dfn[i]) tarjan(i),Min(low[x],low[i]); else
if (ins[i]) Min(low[x],dfn[i]);
}
if (dfn[x]==low[x]) {
++cs;
int v;
do col[v=sta[top--]]=cs,ins[v]=false; while (v!=x);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
n=read();
memset(d,0x3f,sizeof d);
inf=d[0][0];
for (int i=1;i<=n;++i) d[i][i]=0;
int m1=read(),m2=read();
while (m1--) {
int x=read(),y=read();
Min(d[x][y],1);
Min(d[y][x],-1);
mp[x][y]=mp[y][x]=true;
}
while (m2--) {
int x=read(),y=read();
Min(d[y][x],0);
mp[y][x]=true;
}
for (int k=1;k<=n;++k) for (int i=1;i<=n;++i) if (d[i][k]!=inf) for (int j=1;j<=n;++j) if (d[k][j]!=inf) Min(d[i][j],d[i][k]+d[k][j]);
for (int i=1;i<=n;++i) if (d[i][i]<0) puts("NIE"),exit(0);
for (int i=1;i<=n;++i) if (!dfn[i]) tarjan(i);
fill(ans+1,ans+cs+1,1);
for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) if (i!=j && col[i]==col[j]) Max(ans[col[i]],d[i][j]+1);
printf("%d\n",accumulate(ans+1,ans+cs+1,0));
return 0;
}

bzoj2788-Festival的更多相关文章

  1. [BZOJ2788][Poi2012]Festival

    2788: [Poi2012]Festival Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 91[Submit][Statu ...

  2. 【bzoj2788】Festival

    Portal --> bzoj2788 Description 有\(n\)个正整数\(X_1,X_2,...,X_n\),再给出\(m1+m2\)个限制条件,限制分为两类: 1.给出\(a,b ...

  3. HDU1850 Being a Good Boy in Spring Festival(博弈)

    Being a Good Boy in Spring Festival Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I ...

  4. hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)

    题意:Nimm Game 思路:Nimm Game #include<iostream> #include<stdio.h> using namespace std; int ...

  5. UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)

    Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...

  6. reading words in your computer and changing to female voice, linux festival text2wave saving wav files

    on a brand new linux PC, e.g. ubuntu 14.04 amd64 To hear voice sudo apt-get install festival -y then ...

  7. 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 ...

  8. Being a Good Boy in Spring Festival(杭电1850)(尼姆博弈)

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  9. 「AtCoder Grand018B」Sports Festival(暴力)

    题目链接B - Sports Festival 题意 n(1~300)个人m(1~300)个活动,\(A_{ij}\)表示i第j喜欢的活动,每个人选择在举办的活动里最喜欢的,因此可以通过选择一些活动来 ...

  10. HDU 1850 Being a Good Boy in Spring Festival (Nim博弈)

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

随机推荐

  1. 20155334 实验三 敏捷开发与XP实践

    实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验报告,实验报告以 ...

  2. 【LG3237】[HNOI2014]米特运输

    题面 洛谷 题解 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include < ...

  3. 【LG3206】[HNOI2010]城市建设

    [LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\) ...

  4. 【LG4585】[FJOI2015]火星商店问题

    [LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...

  5. AWVS11提取规则文件

    在这里给大家分享一个获取AWVS规则文件的思路.  目前我提取的是17年4月份的扫描规则.   后面如果规则更新,可以自行提取 官网:   https://www.acunetix.com/vulne ...

  6. 第七篇 Postman+Node.js+Newman+Jenkins实现自动化测试

    今天终于不咋忙了,学习整理一下一直想做却没实现的事儿,这事已经折磨团队半年之久了.因为项目是B端业务的测试,测试过程中需要生产大量的测试数据,而且都是跨多个系统的测试,对于后置流程的测试,这些同学往往 ...

  7. jenkins升级为2.134

    由于前面装的jenkins版本为2.130版本,昨天(2018.7.26)发现了两个jenkins的漏洞,影响范围为:Jenkins weekly 2.132 以及更早的版本.Jenkins LTS ...

  8. QSS 样式示例:QTreeWidget, QComboBox,QSlider,QSpinBox

    目录 Image 填充整个控件的区域 QTreeWidget QSpinbox 的上翻下翻按钮和箭头 QComboBox 的设置,大坑 QSlider 最近需要对一个软件加上Qt界面和 的样式,第一次 ...

  9. PRML学习笔记第一章

    [转] PRML笔记 - 1.1介绍 模式识别的目标 自动从数据中发现潜在规律,以利用这些规律做后续操作,如数据分类等. 模型选择和参数调节 类似的一族规律通常可以以一种模型的形式为表达,选择合适模型 ...

  10. 亚马逊AWS业务副总裁:如何在基础设施上降成本

    腾讯科技 林靖东 11月17日编译 亚马逊Amazon Web Services业务的副总裁.著名工程师詹姆斯汉密尔顿(James Hamilton)在AWS re:Invent大会上解释了公司是如何 ...