BZOJ 4057: [Cerc2012]Kingdoms】的更多相关文章

状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没破产 . dp( S ) 表示 S 状态是否能够达到 , 能为 1 ( true ) , 不能为 0 ( false ) . dp( S ) =  max( dp( S ^ { x } ) , ( S & x == 0 && ∑debt > 0 ) ---------------…
状压DP #include<cstdio> #include<cstring> using namespace std; int F[1200005],A[25][25],stack[25]; int main(){ int T; scanf("%d",&T); while (T--){ int n; scanf("%d",&n); for (int i=0; i<n; i++) for (int j=0; j<n…
Link: BZOJ 4057 传送门 Solution: 一道比较基础的状压DP 看到$n<=20$,状态转移与顺序相关,就可以开心地状压了 1表示破产,0表示未破产,不断扩展破产的集合即可 Code: #include <bits/stdc++.h> using namespace std; ; *],T,n; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); ;…
4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表示在当前国家存在情况为s,1-存活,0-破产.那么起始为11111....然后枚举一个国家,判断是否可以破产,转移. 最后,扫一遍所有只有1的情况. 代码 #include<cstdio> #include<algorithm> #include<cstring> #inc…
Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 450  Solved: 187[Submit][Status][Discuss] Description 有一些王国陷入了一系列的经济危机.在很多年以前,他们私底下互相借了许多钱.现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了……现在有n个王国,对于每对王国A和B,A欠B的钱被记为d_AB(我们假设有d_BA=-d_AB成立).如果一个王国入不敷出(即需要支付超过所能获得的钱),它就可能破产…
要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序列中唯一元素的位置 p , 那我们只需检查 [ l , p - 1 ] & [ p + 1 , r ] 是否 non-boring 即可 . 如何检查 序列 [ l , r ] 呢 ? 假如从左往右或者从右往左找 , 最坏情况下是 O( n ) , 总时间复杂度会变成 O( n² ) ; 假如我们从…
Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请你判断它是不是不无聊的. Input 第一行一个正整数T,表示有T组数据.每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000.接下来一行n个不超过10^9的非负整数,表示这个序列. Output 对于每组数据输出一行,输出"non-boring&…
题意 有一些王国陷入了一系列的经济危机.在很多年以前,他们私底下互相借了许多钱.现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了--现在有n个王国,对于每对王国A和B,A欠B的钱被记为d_AB(我们假设有d_BA=-d_AB成立).如果一个王国入不敷出(即需要支付超过所能获得的钱),它就可能破产.每当一个王国破产,与它相关的所有债务关系都会被去除,无论是正是负.而王国们的破产不是一瞬间完成的,而是第一个王国破产后,接下来可能破产的王国再继续破产,直到剩下的王国经济都是稳定的.不同的结局将取…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字, 即每个子序列里至少存在一个数字只出现一次. 给定一个整数序列,请你判断它是不是不无聊的. [题解] 预处理每个元素上一次出现位置和下一个出现位置, 我们发现对于一个子序列[L,R]来说, 如果存在pre[i]<L&&nxt[i]>R那么这个子序列一定是满足条件的, 否则就不…
思路: 状压一下 就完了... f[i]表示选了的集合为i 转移的时候判一判就好了.. //By SiriusRen #include <cstdio> #include <cstring> using namespace std; ][],f[*],F; int main(){ scanf("%d",&cases); while(cases--){ scanf("%d",&n); ;i<(<<n);i++)…