[国家集训队2]Tree I

题面

https://www.luogu.org/problem/P2619

题解

注意可行解的区间性质

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ri register int
#define N 200050
#define M 400050
using namespace std;

int n,m,k,cnt;
int f[N],L[M];

struct edge {
  int u,v,l;
  int w;
} e[M];

bool cmp(int x,int y){return L[x]<L[y] || (L[x]==L[y] && e[x].w>e[y].w);}

int id[N];
bool used[N];
int findroot(int x){
  if (f[x]==x) return x;
  return f[x]=findroot(f[x]);
}

int check(int mid) {
  for (ri i=1;i<=m;i++) if (e[i].w) L[i]=e[i].l-mid; else L[i]=e[i].l;
  for (ri i=1;i<=n;i++) f[i]=i;
  for (ri i=1;i<=m;i++) used[i]=0;
  sort(id+1,id+m+1,cmp);
  int cc=0; cnt=0;
  for (ri i=1;i<=m;i++) {
    int r1=findroot(e[id[i]].u),r2=findroot(e[id[i]].v);
    if (r1==r2) continue;
    f[r1]=r2;
    cnt++;
    used[id[i]]=1;
    if (e[id[i]].w) cc++;
    if (cnt==n-1) return cc;
  }
}

int main(){
  scanf("%d %d %d",&n,&m,&k);
  for (ri i=1;i<=m;i++) {
    scanf("%d %d %d %d",&e[i].u,&e[i].v,&e[i].l,&e[i].w);
    e[i].u++;
    e[i].v++;
    e[i].w^=1;
  }
  int lb=-101,rb=101,ans;
  for (ri i=1;i<=m;i++) id[i]=i;
  while (lb<=rb) {
    int mid=(lb+rb)/2;
    if (check(mid)>=k) ans=mid,rb=mid-1; else lb=mid+1;
  }
  check(ans);
  int ret=0; cnt=0;
  for (ri i=1;i<=n;i++) f[i]=i;
  for (ri i=1;i<=m;i++) {
    int r1=findroot(e[id[i]].u),r2=findroot(e[id[i]].v);
    if (r1==r2) continue;
    f[r1]=r2;
    cnt++;
    ret+=L[id[i]];
    if (cnt==n-1) break;
  }
  cout<<ret+k*ans<<endl;
  return 0;
}

 

转载于:https://www.cnblogs.com/shxnb666/p/11275624.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后缀自动机被广泛应用于OI竞赛中,特别是在字符串相关的问题中。它是一种高效的数据结构,能够有效地解决各种字符串匹配、模式匹配和计数等问题。 首先,后缀自动机可以用于解决最长公共子串和最长公共子序列等问题。对于给定的两个字符串,可以将其加入到后缀自动机中,并通过动态规划的方式求解最长公共子串或子序列的长度。 其次,后缀自动机还可以用于解决多次询问下的子串出现次数问题。通过构建全局后缀自动机,可以在O(n)的时间复杂度内预处理字符串,并在O(m)的时间复杂度内得出任意子串的出现次数,其中n为字符串长度,m为询问总数。 另外,后缀自动机还可以用于解决包含多模式匹配的问题。通过将模式串加入到后缀自动机中,并预处理自动机的fail指针,可以在O(n)的时间复杂度内找到所有模式串在文本中的出现位置。这在处理大规模的文本匹配问题时非常有用。 此外,后缀自动机还可以进行字符串的字典序统计。通过在构建自动机时记录每个节点的信息,可以在O(n)的时间复杂度内得到字符串的字典序第k小/大的子串。 总之,后缀自动机在OI竞赛中有着广泛的应用,能够解决各种字符串相关的问题。通过巧妙地构建自动机,并充分利用其性质,可以实现高效的字符串算法,为解决复杂的字符串问题提供了有力的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值