首先,我们可以先考虑一个暴力一点的算法:

对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边。

然后如果我们能找到一个环,就说明是 unbounded,否则就是 bounded。

复杂度是 $O(n^2)$ 的,然而 $n \le 40000$ ,显然是不行的。

考虑优化。我们注意到本质不同的边有 $26$ 种,那么我们应该能省去很多不必要的边。

令 $inv(x)$ 为与类型为 $x$ 的离子匹配的离子,如 $inv(A+)=A-$。

对于在同一个分子上的两个离子 $x$ 和 $y$ ,连有向边 $x\rightarrow inv(y)$ 和 $y\rightarrow inv(x)$。

然后只要判断这个图是否有环即可。

然后这个图只有 $52$ 个点,不是想怎么搞就怎么搞嘛。。。

(感谢 HZC 的谆谆教诲)

毕竟 Gromah 太弱,再一次 WA 到死。

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define D 52 + 5 int n;
int q[D];
bool Flag[D];
bool Map[D][D];
char s[]; inline int get(char ch_1, char ch_2)
{
if (ch_1 == '') return -;
return (ch_1 - 'A') << | (ch_2 == '+');
} inline bool BFS(int S)
{
int l = , r = ;
for (int i = ; i < ; i ++) Flag[i] = ;
q[] = S, Flag[S] = ;
while (l <= r)
{
int z = q[l ++];
for (int d = ; d < ; d ++)
{
if (!Map[z][d]) continue ;
if (d == S) return ;
if (Flag[d]) continue;
q[++ r] = d, Flag[d] = ;
}
}
return ;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3953.in", "r", stdin);
freopen("3953.out", "w", stdout);
#endif scanf("%d", &n);
for (int i = ; i < n; i ++)
{
scanf("%s", s);
for (int j = ; j < ; j += )
for (int k = j + ; k < ; k += )
{
int a = get(s[j], s[j + ]), b = get(s[k], s[k + ]);
if ((!~a) || (!~b)) continue ;
Map[a][b ^ ] = ;
Map[b][a ^ ] = ;
}
}
bool ok = ;
for (int i = ; !ok && i < ; i ++)
ok = BFS(i);
puts(ok ? "unbounded" : "bounded"); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}

 

BZOJ 3953 Self-Assembly 解题报告的更多相关文章

  1. BZOJ 4619 Swap Space 解题报告

    今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...

  2. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  3. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  4. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  5. BZOJ 4341 [CF253 Printer] 解题报告

    乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...

  6. BZOJ 4036 [HAOI2015] Set 解题报告

    首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...

  7. BZOJ 3288 Mato矩阵 解题报告

    这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...

  8. BZOJ 4123 [Baltic2015] Hacker 解题报告

    首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...

  9. BZOJ 4146 [AMPPZ2014] Divisors 解题报告

    这个题感觉比较小清新... 我们记录每个数出现的次数 $T_i$. 首先依次枚举每个数字,令 $ans = ans + T_i \times (T_i - 1)$,然后枚举这个数的倍数,令 $ans ...

  10. BZOJ 3971 Матрёшка 解题报告

    很自然想到区间 DP. 设 $Dp[i][j]$ 表示把区间 $[i, j]$ 内的套娃合并成一个所需要的代价,那么有: $Dp[i][i] = 0$ $Dp[i][j] = min\{Dp[i][k ...

随机推荐

  1. spring整合quartz实现定时任务

    需求:spring+mybatis框架已经搭建好,需要实现一个定时任务. 一:导出相应的jar包 quartz-all-1.6.5.jar获取quartz-alll-1.6.6.jar spring- ...

  2. C语言中 指针和数组

    C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象.与之相反,指针用来存储单个内存地址.数组和指针不是同一种结构因此不可以互相转换.而数组变量指向了数组的第一个元素的内存地址. 一个数组变 ...

  3. uva - 10833 Supermean(二项式系数,对指数)

    模拟发现,每个元素求和时,元素的系数是二项式系数,于是ans=sum(C(n-1,i)*a[i]/2^(n-1)),但是n太大,直接求会溢出,其实double的范围还是挺大的,所以可以将组合数转化成对 ...

  4. 几种RAID技术比较

    http://book.51cto.com/art/201310/412862.htm RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力.目前服务器级别的计算机 ...

  5. ASP.NET Web Froms开发模式中实现程序集的延迟加载

    延迟加载是一个很大的诱惑,可以达到一些比较好的效果,比如: 1.在实体框架中,由于关联数据的数量和使用时机是不确定的,通过延迟加载,仅在使用的时候去执行关联数据的查询操作,减少无谓的数据查询操作,可以 ...

  6. string[] 和 arraylist互转及问题解决

    1,String 数组转成 list<String> String[] s={"1","2","3","5" ...

  7. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记2 Xcode、Auto Layout及MVC

    原文链接不知道在哪, 接着上一话来讲,上一话中讲到了MVC,那么MVC在IOS8开发中是如何应用的呢?Paul Hegarty老师给我们展示了一个计算器的Demo,首先新建一个工程,老师把AppDel ...

  8. CKRule BRMS-决策表使用说明

    决策表的编辑有2个步骤,即规则包编辑.规则数据设置和发布. 1.   规则包编辑 双击CKBoot.exe打开CKRule规则引擎编辑界面.点新建,在左侧的工程窗口中,就会出现一个新的规则包.点击根结 ...

  9. UVA - 297 Quadtrees (四分树)

    题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib& ...

  10. (转)MySQL Workbench的使用教程 (初级入门版)

    转自:http://www.cnblogs.com/yqskj/archive/2013/03/01/2938027.html MySQL Workbench 是 MySQL AB 最近释放的可视数据 ...