首页 > 其他分享 >Codeforces 839E Mother of Dragons

Codeforces 839E Mother of Dragons

时间:2024-03-01 19:24:19浏览次数:15  
标签:frac min 复杂度 Codeforces Dragons i64 return 839E 考虑

令 \(s_u\) 为点 \(u\) 分配到的权值。

结论:最后选出来有权值的肯定是一个最大团。
考虑反证,如果 \(x, y\) 间没有连边,则 \(x, y\) 的贡献是独立的,若 \(\sum\limits_{(u, x)\in E} s_u\ge \sum\limits_{(v, y) \in E} s_v\),那么就可以把 \(s_y\) 给 \(s_x\),否则把 \(s_x\) 给 \(s_y\),显然这是不劣的。

考虑最后选出来的最大团,使其收益最大的方式肯定是平均。
还是考虑反证,考虑 \(s_x\not = s_y\),那么对于 \(z\not = x, z\not = y\),贡献就是 \((s_x + s_y)s_z\),而 \(x, y\) 的贡献是 \(s_x s_y\)。
那么和不变取平均更优。

最后考虑求解最大团。
考虑直接暴搜,记 \(f_S\) 为点集为 \(S\) 的最大团大小。
那么找到 \(S\) 中最小的点 \(p\),那么就有 \(2\) 种可能,去掉点 \(p\) 或者选上点 \(p\)。
就有 \(f_{S} = \max\{f_{S - \{p\}}, f_{S\operatorname{bitand} E_p} + 1\}\),\(E_p\) 为 \(p\) 的边集。
考虑记忆化搜索,这样的复杂度是对的。

复杂度的证明:
考虑根据 \(\min\{S\}\) 来讨论。
如果 \(\min\{S\}> \frac{n}{2}\),可能有值的位就只会有后面 \(\frac{n}{2}\) 个位。有 \(O(2^\frac{n}{2})\) 种状态。
如果 \(\min\{S\}\le \frac{n}{2}\),则因为每次取的是最小的点 \(p\),选完一个点的状态这个点就会变为 \(0\),只会跟前 \(\min\{S\} - 1\) 个点的选取状态有关,最多也就会有 \(O(2^\frac{n}{2})\) 个状态。
于是用 map 存下所有状态的复杂度是对的。

时间复杂度 \(O(n^2 + 2^\frac{n}{2}n)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
std::map<i64, int> f;
i64 to[40];
int dfs(i64 s) {
    if (! s) return 0;
    if (f.count(s)) return f[s];
    int p =__builtin_ctzll(s);
    return f[s] = std::max(dfs(s ^ (1ll << p)), dfs(s & to[p]) + 1);
}
int main() {
    int n, k; scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            int x; scanf("%d", &x);
            x && (to[i] |= 1ll << j);
        }
    int c = dfs((1ll << n) - 1);
    printf("%.10lf\n", 1.0 * k * k / c * (c - 1) / 2.0);
    return 0;
}

标签:frac,min,复杂度,Codeforces,Dragons,i64,return,839E,考虑
From: https://www.cnblogs.com/rizynvu/p/18047762

相关文章

  • Codeforces 1406E Deleting Numbers
    考虑询问每个质因子及其次数最后组合得到\(n\)。注意到\(n\)最多只会有\(1\)个\(>\sqrt{n}\)的质因子。于是考虑分成\(\le\sqrt{n}\)和\(>\sqrt{n}\)来考虑。对于\(\le\sqrt{n}\)的\(p\)。考虑先\(\texttt{B}\p\),那么还剩下的\(p\)的倍数就只有\(x\)......
  • Codeforces Round 930 (Div. 2) - sol
    20240301由于笔者实力较弱,所以这只是Div2的题解。四年一次的比赛啊,还是要打。Dashboard-CodeforcesRound930(Div.2)-CodeforcesA.ShufflePartyYouaregivenanarray\(a_1,a_2,\ldots,a_n\).Initially,\(a_i=i\)foreach\(1\lei\len\).Theopera......
  • Codeforces 1446D1 Frequency Problem (Easy Version)
    考虑求出全局的众数\(A\)。那么有一个结论,就是答案区间的众数中绝对有\(A\)。考虑反证法,如果没有\(A\),\(A\)在序列中出现的个数一定\(\ge\)区间内众数的出现个数,所以可以一直往外扩展直到\(A\)出现的个数与区间内非\(A\)众数的个数持平,这样肯定更优。于是可以考虑钦......
  • Codeforces 1446D2 Frequency Problem (Hard Version)
    考虑求出全局的众数\(A\)。那么有一个结论,就是答案区间的众数中绝对有\(A\)。考虑反证法,如果没有\(A\),\(A\)在序列中出现的个数一定\(\ge\)区间内众数的出现个数,所以可以一直往外扩展直到\(A\)出现的个数与区间内非\(A\)众数的个数持平,这样肯定更优。于是可以考虑钦......
  • Codeforces 932D Tree
    首先有个动态加叶子的操作,考虑到树剖需要离线下来预处理,便考虑用倍增来维护。首先要找到\(\gea_u\)的最深的父亲\(v\),便可以先用倍增处理好长度为\(2^i\)的链上的\(\max\)。如果\(\max<a_u\),就往上跳,跳不了就是到点\(v\)了。考虑连边\(v\tou\),这仍然会是一棵树(建......
  • Codeforces 1455E Four Points
    首先确定每个点最后走到的是哪一个点。这部分可以枚举全排列。假设左上角的点为\((x_0,y_0)\),右上角的点为\((x_1,y_1)\),左下角的点为\((x_2,y_2)\),右下角的点为\((x_3,y_3)\)。令最终的点为\((x'_0,y'_0)\),以此类推。那么最终的答案就是\(\sum\limits_{i=0}^3|......
  • Codeforces 451E Devu and Flowers
    首先考虑没有\(f_i\)的限制的时候,此时可以用插板法得到方案数为\(\binom{s+n-1}{n-1}\)。考虑钦定\(f_i\)不合法,那么就相当于先在\(i\)这里选\(f_i+1\),剩下的随意分配,方案数就为\(\binom{s-(f_i+1)+n-1}{n-1}\)。算完过后能发现会算重存在\(>1\)......
  • Codeforces 1830C Hyperregular Bracket Strings
    考虑到区间的限制\([l,r]\)就是要求\([l,r]\)里的字符会在\([l,r]\)里找到匹配。假设还有个区间\([l',r']\)满足\(l\lel'\ler\ler'\),能够发现限制变成了\([l,l'),[l',r],(r,r']\)这\(3\)个区间内的字符能在对应区间内找到匹配。继续,假设\(l\lel'\le......
  • Codeforces 863E Turn Off The TV
    能发现其实就是区间加查询区间最小值。如果最小值\(>1\)则这个区间可以删掉。考虑离散化端点,先把区间表示为\([l_i,r_i)\)的形式,方便离散化端点。这样子离散化出来的端点也是\([x,y)\)的形式。对于区间加查询区间最小值,很容易用线段树维护。时间复杂度\(O(n\logn)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......