首页 > 其他分享 >Codeforces 869D The Overdosing Ubiquity

Codeforces 869D The Overdosing Ubiquity

时间:2024-02-22 20:13:00浏览次数:26  
标签:int 869D 复杂度 Codeforces Ubiquity 320 ey id 关键点

考虑树的 \(\text{dfs}\)(根据当前节点 \(u\) 找到 \(v\) 满足存在 \((u, v)\),然后走向 \(v\) 进入更深的搜索)为和能做到 \(O(n)\) 的复杂度。
原因是没有环的情况,到每个点只有一条路径。

回到这个题,有 \(m\) 条边导致到每个点可能有多条路径了。
能发现其实还是能 \(\text{dfs}\)。
正确性是显然的。
时间复杂度可以去尝试证一个比较宽松的上界,考虑如果走完了 \(m\) 条多余边,那么剩下的可以当作一棵树来处理,就是 \(O(n)\) 的,而对于这 \(m\) 条边可以考虑枚举其顺序和其是从哪一头走又或者不走,\(O(m!3^m)\),加上枚举起点,于是时间复杂度是 \(O(n^2\times m!3^m)\)。

考虑到这个 \(m\) 很小,于是类似虚树的思想,考虑只拎出来 \(2m\) 个点到根的路径。
那么其他的非关键点到这些关键点肯定都会经过一个固定的关键点,考虑把这些点直接挂在这个关键点上即可。
正确性是因为这些点走出去肯定都要走过这个点,所以走出去后就相当于就是这个点。

时间复杂度 \(O(m^2\log^2 n\times m!3^m)\)。

#include<bits/stdc++.h>
const int mod = 1e9 + 7;
int n;
std::map<int, int> id; int idt;
int ex[4], ey[4];
std::vector<int> E[320];
int siz[320], P[320];
bool vis[320];
inline int dep(int x) {return std::__lg(x);}
inline int calc(int u) {
    int dn = dep(n), du = dep(u);
    if (dn == du) return 1;
    return ((1 << dn - du) - 1) + std::max(0, std::min(1 << dn - du, n - (u << dn - du) + 1));
}
inline void add(int u) {! id.count(u) && (id[u] = ++idt, P[idt] = u);}
void dfs1(int u, int fa) {
    for (int v : E[u]) v != fa && (siz[u] -= siz[v], dfs1(v, u), 1);
}
inline int dfs2(int u) {
    vis[u] = 1;
    int ans = siz[u];
    for (int v : E[u]) ! vis[v] && ((ans += dfs2(v)) %= mod);
    vis[u] = 0;
    return ans;
}
int main() {
    int m; scanf("%d%d", &n, &m);
    add(1);
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &ex[i], &ey[i]);
        for (int x = ex[i]; x; x >>= 1) add(x);
        for (int x = ey[i]; x; x >>= 1) add(x);
    }
    for (int i = 1; i <= idt; i++) siz[i] = calc(P[i]);
    for (int i = 2; i <= idt; i++) E[i].push_back(id[P[i] >> 1]), E[id[P[i] >> 1]].push_back(i);
    dfs1(1, 0);
    for (int i = 0; i < m; i++) E[id[ex[i]]].push_back(id[ey[i]]), E[id[ey[i]]].push_back(id[ex[i]]);
    int ans = 0;
    for (int i = 1; i <= idt; i++) (ans += 1ll * siz[i] * dfs2(i) % mod) %= mod;
    printf("%d\n", ans);
    return 0;
}

标签:int,869D,复杂度,Codeforces,Ubiquity,320,ey,id,关键点
From: https://www.cnblogs.com/rizynvu/p/18028064

相关文章

  • Codeforces 1876F - Indefinite Clownfish
    首先注意到这样一个性质:既然两个序列的平均值相同,并且又形成公差\(\pm1\)的等差数列,就必然会存在一个元素\(x\)满足\(x\)在两个序列中都出现过(否则两个序列的值域区间不交,值域区间靠后的那个显然平均值比靠前的那个大)。那么我们枚举\(x\)在两个序列中出现的位置\(p\)和......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhite#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int128;usingldb=longdouble;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;usingvii......
  • Codeforces Round 928 (Div. 4)
    CodeforcesRound928(Div.4)比赛链接A.VladandtheBestofFive思路就是统计字符A和字符B的个数,将个数多的那个输出出来Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){strings;......
  • Codeforces 1806E Tree Master
    考虑一个最基础的暴力,就是直接记忆化搜索暴力往上跳。但是能发现如果一层的节点数过多,状态数太多,就寄了。再考虑一个基础的暴力,就是直接跳。但是如果要跳的层数过多,就寄了。考虑结合一下,根号分治。对于一层内节点数\(\le\sqrt{n}\)的记录下每两个点间的答案。对于节点数......
  • Codeforces Round 928(Div. 4)
    Dashboard-CodeforcesRound928(Div.4)-Codeforces第一次参加CF,最后一道题连题都没读,下次不会就跳,菜是原罪A:找字符串中A,B数量,遍历一下最后比较即可B:判断是三角形还是正方形,题目表示除了正方形就是三角形,所以直接判断是不是正方形,用ans数组记录每一行1的个数,然后从大......
  • Codeforces Round 900 (Div. 3)
    题目A.只要k出现过就是YES#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn,k;cin>>n>>k;map<int,int>mp;for(inti=0,x;i<n;i++){cin......
  • Codeforces Round 928 (Div. 4) (小白的复盘)
    A.VladandtheBestofFive思路:给你一个长度字符串只包含A和B输出最多的字符解法:按题意来Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){strings;cin>>s;intcnt=0;fo......
  • Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)
    目录ABCDEGA统计A、B输出#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definelllonglong#definedbdouble#de......
  • Codeforces Round 928 (Div. 4)
    总结一下最近:感觉过于追求进度了,没有好好的把每题都吃透消化,然后有点依赖题解了,没有好好的思考...B.VladandShapesB题输入二维数组的时候不可以直接两个for循环然后cin,要读入char,再转为数字赋值给二维数组,因为他读入的时候不带有空格而int是要有空格的,这样子比如读000就把它......
  • Codeforces Round 924 (Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1928。终于把欠下的一堆题补上了呃呃天使骚骚共通线什么构式呃呃,一周目就想走老师线直通单身笑死我了。A签到。发现等分后重新拼接可以得到\(\frac{x}{2}\times2y\)与\(\frac{y}{2}\times2......