首页 > 其他分享 >P10559 [ICPC2024 Xi'an I] The Last Cumulonimbus Cloud 题解

P10559 [ICPC2024 Xi'an I] The Last Cumulonimbus Cloud 题解

时间:2024-08-22 22:53:28浏览次数:15  
标签:度数 Xi Last 题解 复杂度 sqrt 出边 include 定向

这种题有一个常见的根号分治做法:设 \(d\) 为度数,显然有 \(O(1)\) 修改单点,\(O(d)\) 查询邻域和 \(O(d)\) 修改邻域,\(O(1)\) 查询单点两种暴力。对度数大于 \(\sqrt n\) 的点使用前者,度数小于等于 \(\sqrt n\) 的点使用后者,可以做到 \(O(m \sqrt n)\) 的时间复杂度。

这种做法的本质让每条边是由度数小的点向度数大的点定向,查询一个点的邻域时将入边集合(提前处理)与出边集合(查询时遍历)的答案相加。因为根号分治的特性,这出边集合的大小不超过 \(O(\sqrt n)\),于是保证复杂度正确。

本题中考虑类似的定向,由于题目所给的图的特性:每个非空子图都至少有一个点的度数不超过 \(10\)。可以每次选取当前度数最小的点删去,直到把图删空,会得到删除点的顺序,每条边由先删除的点向后删除的点定向,可以保证每个点的出边不超过 \(10\) 条,复杂度正确。

当然,也有一种“启发式定向”的策略(人类智慧):以 \(p = \dfrac {d_v} {d_u + d_v}\) 为由点 \(u\) 向点 \(v\) 定向的概率,随机数操作一下,就结束了。原理是出边数量一定,我们希望让度数小的节点承担更多的出边,以此得到相对均衡的时间开销。期望复杂度正确,但常数有些大。

既然说到了均衡开销,这篇题解给出了一个美妙的做法:记录每个点被操作的次数,由次数小的向次数大的定向。复杂度非常正确,常数非常小。

这是人类智慧的代码。

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

static const int S = 1 << 21;
char buf[S], *p1, *p2;
static inline char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; }
static inline int read() {
    int x = 0;
    char ch = gc();
    while (!isdigit(ch))
        ch = gc();
    while (isdigit(ch)) {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = gc();
    }
    return x;
}

int n, m, q;
int a[300005];
int w[300005];
int deg[300005];
vector<pair<int, int>> edge;
vector<int> vec[300005];

signed main() {
    srand(time(0));
    n = read();
    m = read();
    q = read();
    for (int i = 1; i <= m; ++i) {
        int u = read(), v = read();
        ++deg[u], ++deg[v];
        edge.push_back({u, v});
    }
    for (auto [u, v] : edge)
        if ((long long)rand() * (deg[u] + deg[v]) <= (long long)deg[v] * RAND_MAX)
            vec[u].push_back(v);
        else
            vec[v].push_back(u);
    for (int i = 1; i <= n; ++i) {
        a[i] = read();
        for (auto v : vec[i])
            w[v] += a[i];
    }
    while (q--) {
        int op = read(), u = read();
        if (op == 1) {
            int x = read();
            a[u] += x;
            for (auto v : vec[u])
                w[v] += x;
        } else {
            int ans = w[u];
            for (auto v : vec[u])
                ans += a[v];
            cout << ans << '\n';
        }
    }
    cout << flush;
    return 0;
}

标签:度数,Xi,Last,题解,复杂度,sqrt,出边,include,定向
From: https://www.cnblogs.com/bluewindde/p/18374913

相关文章

  • CF1575G GCD Festival 题解
    考虑欧拉反演\[\sum\limits_{d\midn}\varphi(d)=n\]则原式可以化为\[\begin{align*}&\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(a_i,a_j)\cdot\gcd(i,j)\\=&\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(a_i,a_j)\sum\li......
  • CF163E e-Government 题解
    题目传送门前置知识AC自动机|树状数组解法一次性将所有模式串加入AC自动机,然后处理加入和删除,考虑单次操作对答案的贡献。因为模式串\(T\)在文本串\(S\)中出现的次数之和等价于\(T\)在\(S\)的所有前缀中作为后缀出现的次数之和。这就很和\(fail\)树上跳到根节......
  • [题解] permutation
    [题解]Permutation解析一眼DP或者组合。70pts场上推的DP对于\((4,2,2)\),先把所有序列枚举出来:\[\begin{split}1\\\2\\1\\\3\\1\\\4\\--\\2\\\3\\2\\\4\\3\\\4\end{split}\]可以发现,对于分割线上的部分,可以看作\((3,1,1)\)的所有序列......
  • 深入理解Elasticsearch:让搜索性能飞起来!
    Elasticsearch 概述Elasticsearch是一个基于lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。ELK技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。而Elasticsearch是一个开源的高扩展的分布式全文搜索引擎,是整个ELK技术栈的......
  • csp模拟27-金箱子(题解)
    题目链接(显然还没有找到原题)虽说我现在才学会期望dp显得不太好,但没办法,谁让我比较菜~~,之前模拟赛已经考过几道类似的题了,但都一笔带过了,这次算是正式学习了一下这类题,于是就有了这篇题解。首先看到k次方首先想到的就是我们在进行dp转移的时候不太方便,这个时候很自然的想到二项......
  • 题解:P9041 [PA2021] Fiolki 2
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的DAG,定义\(f(l,r)\)表示最多选取多少条不相交路径\((s_i,t_i)\)满足\(s_i\in[1,k],t_i\in[l,r]\),其中不能有任意一点同时在两条选出的路径上。对\(\forallx\in[0,k)\)求出有多少\([l,r]\sube(k,n]\)使得\(f(l,r)......
  • 题解:P10881「KDOI-07」能量场
    \(\text{Link}\)题意给你一个长为\(n\)的序列\(a_{1\dotsn}\),定义一条边\((u,v)\)的权值为\(a_u+a_v\)。对于一张图,定义其权值为包含的所有边的权值乘积。求所有\(n\)个点的有标号基环树的权值之和。对\(998244353\)取模。\(n\le10^3\)。思路非常厉害的题,zky倾......
  • 题解:P10698 [SNCPC2024] 最大流
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的单位网络,保证该网络不存在环。给定一个常数\(k\),设从\(1\)到\(i\)的最大流为\(f_i\),对\(\foralli\in[2,n]\)求出\(\min(f_i,k)\)。\(n\le10^5\),\(m\le2\times10^5\),\(k\le\min(n-1,50)\)。思路不相交路径,考......
  • 升级Openssh 后 最大文件打开数修改不生效,启动 UsePAM yes后 ,最大文件打开数生效但是
    感谢 博主https://blog.csdn.net/Daphnisz/article/details/124040904vi /etc/pam.d/sshd(注意不是/etc/pam.d/sshd.pam)#%PAM-1.0auth required pam_sepermit.soauthsubstackpassword-authauthincludepostlogin#Usedwithpolkittoreauthor......
  • 常见问题解决 --- 为什么我们常常发现服务器没有管理的端口
    我们在扫描一台主机全端口,发现没有开放管理端口,比如windows远程桌面或者是linux的ssh登陆。我列举一下常见的原因。常规管理方式:1.管理口不是常见的3389和22端口,而改为了高位端口号,避免被人发现。2.在管理端口上加上了安全策略导致无法直接连接,比如私钥登陆方......