P7293-[USACO21JAN]Sum of Distances P【统计,bfs】

正题

题目链接:https://www.luogu.com.cn/problem/P7293


题目大意

kkk张联通无向图,有kkk个人从每张图的点111出发,定义所有人的位置合为一个状态,求初始状态到达所有能到达状态的最短时间的和。

输出答案对 109+710^9+7109+7 取模。

∑n≤105,∑m≤2×105\sum n\leq 10^5,\sum m\leq 2\times 10^5n105,m2×105


解题思路

因为可以反复横跳,对于每个点我们求出到达的最短的奇数/偶数距离,记为dis1/dis2dis1/dis2dis1/dis2

那么对于一个状态(i1,i2,...,in)(i_1,i_2,...,i_n)(i1,i2,...,in)答案就是
min⁡{max⁡{dis1ij},max⁡{dis2i,j}}\min\{\ \max\{dis1_{i_j}\},\max\{dis2_{i,j}\}\ \}min{ max{dis1ij},max{dis2i,j} }

然后这个又有min⁡\minmin又有max⁡\maxmax的很难搞,但是我们有一个式子a+b=max⁡{a,b}+min⁡{a,b}a+b=\max\{a,b\}+\min\{a,b\}a+b=max{a,b}+min{a,b}(好像很废话),然后就有min⁡{a,b}=a+b−max⁡{a,b}\min\{a,b\}=a+b-\max\{a,b\}min{a,b}=a+bmax{a,b},这样就把max⁡\maxmax消掉了。

那么答案有
max⁡{dis1ij}+max⁡{dis2ij}−max⁡{dis1ij,dis2ij}\max\{dis1_{i_j}\}+\max\{dis2_{i_j}\}-\max\{dis1_{i_j},dis2_{i_j}\}max{dis1ij}+max{dis2ij}max{dis1ij,dis2ij}

然后跑出dis1,dis2dis1,dis2dis1,dis2排个序就很好统计了。

注意不能统计上无法达到的状态。

时间复杂度:O(Nlog⁡N+M)O(N\log N+M)O(NlogN+M)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define mp(x,y) make_pair(x,y)
#define ll long long
using namespace std;
const ll N=2e5+10,P=1e9+7;
struct node{ll to,next;
}a[N<<2];
ll k,n,m,ans,tot,ls[N],c[N],dis[N];
vector<pair<ll,ll> >b[3];
queue<ll> q;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void bfs(){q.push(1);dis[1]=1;while(!q.empty()){ll x=q.front();q.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dis[y]<=dis[x]+1)continue;dis[y]=dis[x]+1;q.push(y);}}return;
}
void calc(ll id,ll op){ll res=0,now=0;memset(c,0,sizeof(c));for(ll i=0;i<b[id].size();i++){ll d=b[id][i].first,p=b[id][i].second;if(d+1>=dis[0])break;now+=!c[p];c[p]++;ll invn=power(c[p],P-2);if(now==k){res=1;for(int i=1;i<=k;i++)res=res*c[i]%P;}res=res*invn%P;(ans+=res*d*op%P)%=P;res=res*c[p]%P;}return;
}
signed main()
{scanf("%lld",&k);for(ll i=0;i<N;i++)dis[i]=2147483647;for(ll p=1;p<=k;p++){scanf("%lld%lld",&n,&m);for(ll i=1,x,y;i<=m;i++){scanf("%lld%lld",&x,&y);addl(x,y+n);addl(x+n,y);addl(y,x+n);addl(y+n,x);}bfs();for(ll i=1;i<=n;i++){b[0].push_back(mp(dis[i]-1,p));b[1].push_back(mp(dis[i+n]-1,p));b[2].push_back(mp(max(dis[i],dis[i+n])-1,p));}for(ll i=1;i<=2*n;i++)ls[i]=0,dis[i]=dis[0];tot=0;}sort(b[0].begin(),b[0].end());sort(b[1].begin(),b[1].end());sort(b[2].begin(),b[2].end());calc(0,1);calc(1,1);calc(2,-1);printf("%lld\n",(ans+P)%P);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板:次短路

所谓次短路&#xff0c;就是又次又短的路 &#xff08;逃&#xff09; 解析 使用两遍swap是更新sec的好方法 一定要判断是严格次短才更新sec的答案&#xff01; 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline const int …

平面切分

平面切分 问题描述 题解&#xff1a; 我对这种题极其非常不擅长。。。 另外吐槽为什么acwing的数据卡的这么死&#xff0c;蓝桥杯官网数据那么水 其实题目很简单&#xff0c;如果只有一个直线&#xff0c;那么就是两部分&#xff0c;如果是两个直线&#xff0c;这两个直线不相…

新起点!新征程!微软技术俱乐部(苏州)成立大会暨微软技术交流会

2019年1月19日&#xff0c;苏州微软将举办苏州史上最盛大的开发者聚会&#xff0c;微软技术俱乐部成立大会暨微软技术交流会。超越苹果&#xff0c;登顶世界市值第一&#xff01;云与AI两大技术支柱支撑起的微软帝国&#xff0c;正向万亿美元俱乐部挺进&#xff01;微软的改变我…

P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地&#xff0c;每个草地有不同收益&#xff0c;mmm个点是地方的点&#xff0c;现在你要放置nnn个我方的点&#xff0c;不能和敌方的点重合。 如果一个草地离最近的我方的点距离严格小于最…

模板:整除分块

所谓整除分块&#xff0c;就是按照整除的结果分块 &#xff08;逃&#xff09; 解析 一个关键的结论&#xff1a; 对于 i≤ni\le ni≤n&#xff0c;满足 ⌊nx⌋⌊ni⌋\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{n}{i}\rfloor⌊xn​⌋⌊in​⌋ 的最大的 xxx 为 ⌊n⌊ni⌋⌋\lfl…

[Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

文章目录titlesolutioncodetitle solution 一棵nnn个点的树有n−1n-1n−1条边。 一般的&#xff0c;对于森林而言则有点数-边数树的个数 那么我们将无向图随便生成一个生成树&#xff0c;形成森林。 询问的连通块的个数就变为求森林的树的个数&#xff0c;即森林的点数 n …

跨平台、跨语言应用开发工具,Elements 介绍

目录1&#xff0c;Elements 介绍2&#xff0c;Elements 版本3&#xff0c;Elements 能干嘛4&#xff0c;Elements IDES5&#xff0c;Elements 工具1&#xff0c;Elements 介绍RemObjects Elements&#xff0c;是多平台移动项目开发工具&#xff0c;是一款可以帮助开发人员在 不…

蓝桥杯--字串排序

题目&#xff1a; 小蓝的幸运数字是 &#xff0c;他想找到一个只包含小写英文字母的字符串&#xff0c;对这个串中的字符进行冒泡排序&#xff0c;正好需要 V次交换。请帮助小蓝找一个这样的字符串。如果可能找到多个&#xff0c;请告诉小蓝最短的那个。如果最短的仍然有多个&…

P4688-[Ynoi2016]掉进兔子洞【莫队,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P4688 题目大意 给出一个长度为nnn的序列aaa。 然后mmm次询问给出三个区间&#xff0c;求这三个区间构成的可重集删去交集后剩下的数字个数和。 1≤n,m≤105,1≤ai≤1091\leq n,m\leq 10^5,1\leq a_i\leq 10^91≤n,m≤105,1…

洛谷P3791:普通数学题(整除分块、前缀和)

解析 似乎位运算和易或并没有太多性质上的联系… 所以换个角度分析 考虑按照二进制进行类似数位dp 暴力枚举 i 和 j 的前k,p位与n、m相同&#xff0c;下一位比n、m小。 然后后面的东西就可以随便填 每个异或的结果都有2^(两个数都可以随便填的位数)的方案 然后乘上一个约数个…

后缀自动机(SAM)构造实现过程演示+习题集锦

文章目录后缀自动机算法实现过程模板习题洛谷后缀自动机模板题品酒大会[HEOI2015]最短不公共子串字符串蒟蒻写这篇blogblogblog主要是存一下&#xff0c;后缀自动机的详细搭建过程&#xff0c;方便以后复习 具体的某些证明&#xff0c;为什么这么做&#xff0c;正确性劈里啪啦一…

使用logdashboard进行可视化的日志追踪

本文源码在Github可以找到下载LogDashboard如果你还不了解LogDashboard请看这里。 LogDashboard 1.1版本支持请求追踪,虽然目前版本还没有发布。不过这个功能可以先睹为快效果图下载项目首先我们可以在 https://github.com/liangshiw/LogDashboard/tree/master/samples/Request…

ARC132D-Between Two Binary Strings【贪心】

正题 题目链接:https://atcoder.jp/contests/arc132/tasks/arc132_d 题目大意 给出两个恰好有nnn个111和mmm个000的字符串s,ts,ts,t&#xff0c;定义两个字符串距离为通过交换两个相邻的字符把一个变成另一个的最小步数。 对于字符串kkk如果dis(s,k)dis(k,t)dis(s,t)dis(s,k…

CodeCraft-21 and Codeforces Round #711 (Div. 2)

CodeCraft-21 and Codeforces Round #711 (Div. 2) 题号题目考点AGCD Sum签到&#xff0c;模拟BBox Fitting贪心CPlanar Reflections规律暴力&#xff08;直接乱搞就对了&#xff09;DBananas in a Microwave思维题&#xff0c;贪心ETwo Houses交互题&#xff08;未补&#xf…

模板:插头DP

所谓插头dp&#xff0c;就是使用插头的dp &#xff08;逃&#xff09; 解析 好难呀qwq 终于算是学明白了吧 推荐博客 字太多了不想打了 自己过去看吧 感觉写的非常清晰了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline …

【C#与Redis】--C# 操作 Redis

一、简介 C# 中通过 StackExchange.Redis 库可以方便地操作 Redis&#xff0c;实现高性能的数据缓存和存储。StackExchange.Redis 提供了强大的 API&#xff0c;允许开发者轻松连接、读取和写入 Redis 数据。通过使用 ConnectionMultiplexer 类&#xff0c;可以建立与 Redis 服…

ML.NET 0.9特性简介

ML.NET 0.9已于上周发布&#xff0c;距离上次0.8版本的发布只有一个多月&#xff0c;此次增加的新特性主要包括特征贡献计算&#xff0c;模型可解释性增强&#xff0c;ONNX转换对GPU的支持&#xff0c;Visual Studio ML.NET项目模板预览&#xff0c;以及API改进。特征贡献计算特…

[学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛

筛积性函数的前缀和常见积性函数公式推导狄利克雷卷积杜教筛实现常见卷积习题集Sum神犇和蒟蒻简单的数学题常见积性函数 μ\muμφφφd(n)d(n)d(n)&#xff1a;nnn的约数个数σ(n)σ(n)σ(n)&#xff1a;nnn的约数和ϵ(n)ϵ(n)ϵ(n)&#xff1a;单位元函数&#xff0c;e(n)[n1…

51nod-动物与游戏【树链剖分,线段树】

正题 题目链接:http://www.51nod.com/Contest/Problem.html#contestProblemId3957 题目大意 nnn个点的一棵树&#xff0c;第iii个节点上的动物有ai100\frac{a_i}{100}100ai​​的概率加入&#xff0c;每个加入的动物都会每秒向父节点移动。 对于第iii只动物&#xff0c;如果它…

cf 1504 F. Flip the Cards

F. Flip the Cards 题意&#xff1a; 这个题你也可以看看&#xff0c;就是一个卡片正反两个数&#xff0c;n个卡片在桌子上摆好&#xff0c;你可以任意移动卡片的位置&#xff0c;也可以翻转卡片&#xff08;翻转一次消耗1点&#xff09;&#xff0c;最终使得卡片的正面为升序…