首页 > 其他分享 >CF2021E3 Digital Village (Extreme Version)

CF2021E3 Digital Village (Extreme Version)

时间:2024-10-08 12:00:06浏览次数:1  
标签:cnt int times fa Version MAXN Village include Extreme

原题链接

考虑建出 kruskal 重构树,设 \(f_{i,j}\) 为 \(i\) 子树中选了 \(j\) 个点的答案最小值。记 \(cnt_x\) 为 \(x\) 子树中有多少个关键点,\(w_x\) 为 kruskal 重构树上的权值。

转移时合并两个子树 \(f_{x,i}=\min f{u,j}+f{v_{i-j}}\),还有一种转移是 \(f_{x,i}=f_{v,i}+cnt_{u}\times w_x\),意义是所有左子树中的点都要跑到右子树中去,经过的最大的边权就是 \(w_x\)。另一侧同理。

所以实际上我们每次转移后 \(f_{x,0}\gets cnt_x\times w_{fa_x}\),然后就是 \((\min,+)\) 卷积的形式,显然有凸性,可以闵可夫斯基和优化。

我们考虑记录 \(f_{x,i}-f_{x,i+1}(i\in[0,siz_x-1])\),这个单调递减。每次手动给 \(f_{x,0}\) 赋值时相当于将最大值拿出来加上 \(cnt_x\times (w_{fa_x}-w_x)\),因为修改前的 \(f_{x,0}=f_{u,0}+f_{v,0}=cnt_x\times w_x\),所以需要取出来最大值。于是 set 启发式合并即可,时间复杂度 \(O(n\log^2 n)\)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#define ll long long
using namespace std;
const int MAXN=4e5+10;
int T,n,m,p,s[MAXN],cnt[MAXN],siz[MAXN],fa[MAXN],w[MAXN];
int u[MAXN],v[MAXN],R[MAXN];ll ans[MAXN];multiset <ll> f[MAXN];
struct node{int x,y,w;}e[MAXN];
inline bool cmp(node x,node y){return x.w<y.w;}
inline int find(int x)
    {return fa[x]==x?x:fa[x]=find(fa[x]);}
void dfs(int x,int fa=0)
{
    if(!u[x]&&!v[x])
        {f[R[x]=x].insert(cnt[x]*w[fa]),siz[x]=1;return ;}
    dfs(u[x],x),dfs(v[x],x);
    cnt[x]=cnt[u[x]]+cnt[v[x]],siz[x]=siz[u[x]]+siz[v[x]];
    if(siz[u[x]]>siz[v[x]]) swap(u[x],v[x]);
    R[x]=R[v[x]];int p=R[u[x]];
    for(auto it=f[p].begin();it!=f[p].end();++it)
        f[R[x]].insert(*it);
    f[p].clear();auto it=f[R[x]].end();--it;
    ll W=*it+1ll*cnt[x]*(w[fa]-w[x]);
    f[R[x]].erase(it);if(fa) f[R[x]].insert(W);
}
inline void work()
{
    cin>>n>>m>>p;
    for(int i=1;i<=(n<<1);++i)
        fa[i]=i,u[i]=v[i]=cnt[i]=0;
    for(int i=1;i<=p;++i)
        cin>>s[i],cnt[s[i]]=1;
    for(int i=1;i<=m;++i)
        cin>>e[i].x>>e[i].y>>e[i].w;
    sort(e+1,e+1+m,cmp);int tot=n;
    for(int i=1;i<=m;++i)
    {
        if(find(e[i].x)==find(e[i].y)) continue;
        int fax=find(e[i].x),fay=find(e[i].y);
        w[++tot]=e[i].w,fa[u[tot]=fax]=fa[v[tot]=fay]=tot;
    }
    ans[n]=0;dfs(tot);auto it=f[R[tot]].begin();
    for(int i=n-1;i;--i) ans[i]=ans[i+1]+*it,++it;
    for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
    cout<<'\n';f[R[tot]].clear();return ;
}
signed main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>T;while(T--) work();return 0;
}

标签:cnt,int,times,fa,Version,MAXN,Village,include,Extreme
From: https://www.cnblogs.com/int-R/p/18451392/CF2021E3

相关文章

  • Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oc
    Windows11version24H2&LTSC2024中文版、英文版(x64、ARM64)下载(updatedOct2024)Windows11,version24H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新Windows体验,让您与热......
  • C2. Adjust The Presentation (Hard Version)
    C2.AdjustThePresentation(HardVersion)Thisisthehardversionoftheproblem.Inthetwoversions,theconstraintson$q$andthetimelimitaredifferent.Inthisversion,$0\leqq\leq2\cdot10^5$.Youcanmakehacksonlyifalltheversions......
  • uv --- replacement of conda + pip (python version + package version install) pyt
    uvhttps://docs.astral.sh/uv/AnextremelyfastPythonpackageandprojectmanager,writteninRust. InstallingTrio'sdependencieswithawarmcache.Highlights......
  • 题解:CF2009G1 Yunli's Subarray Queries (easy version)
    题目要求\(a_i=a_{i-1}+1\),设\(b_i=a_i-i\),如果\(b_i=b_j\),那么\(i\)和\(j\)就在正确的相对位置上。这应该很好理解吧,\(a\)是一个公差为\(1\)的等差数列,下标也是一个公差为\(1\)的等差数列,对应位置相减就相等了。我们在输入\(a_i\)的时候减去\(i\),然后用滑动窗口......
  • 《Yttomp3.click - An Outstanding YouTube to MP3 Conversion Platform》
    Intoday'sdigitalera,thedemandforobtainingandconvertingaudiocontentisgrowingincreasingly.Formanymusiclovers,videocreators,andordinaryusers,beingabletoextracttheaudiofromfavoriteYouTubevideosandconvertitintoMP3for......
  • 题解:SP23875 DCEPC14A - Another Version of Inversion
    我们注意到这道题是二维的,所以要用到二维树状数组,不会的可以看一下这篇文章。这题的思路和P1908很像,按价值从大到小排序,排完序之后用树状数组维护,每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大,然后在查询当前这个数前面位置的数(是前面位......
  • 20_图解Elasticsearch内部如何基于_version进行乐观锁并发控制
    1、图解Elasticsearch内部如何基于_version进行乐观锁并发控制(1)_version元数据PUT/test_index/test_type/6{"test_field":"testtest"}{"_index":"test_index","_type":"test_type","_id":"6",&......
  • 21_上机动手实战演练基于_version进行乐观锁并发控制
    1、上机动手实战演练基于_version进行乐观锁并发控制(1)先构造一条数据出来PUT/test_index/test_type/7{"test_field":"testtest"}(2)模拟两个客户端,都获取到了同一条数据GETtest_index/test_type/7{"_index":"test_index","_type":"test_type"......
  • 22_上机动手实战演练基于external version进行乐观锁并发控制
    课程大纲1、上机动手实战演练基于externalversion进行乐观锁并发控制externalversiones提供了一个feature,就是说,你可以不用它提供的内部_version版本号来进行并发控制,可以基于你自己维护的一个版本号来进行并发控制。举个列子,加入你的数据在mysql里也有一份,然后你的应用系统......
  • CF2018E2 Complex Segments (Hard Version) 题解
    题目描述\(T\)组数据,给定\(n\)条线段\([l_i,r_i]\),称一个线段集合是复杂的,当且仅当:它可以被划分成若干个大小相等的线段组。两条线段相交当且仅当它们在同一组。求用这\(n\)条线段构成的复杂线段集合的最大值。数据范围\(1\len,\sumn\le3\cdot10^5\)。\(1\l......