补题报告之S班暑训第二场
成绩
比赛经过
糟糕记不清了?
赛后补题+分析
Tree
简要/形式化题意
给定一棵弱连通树的子图,记一棵弱连通树的值为:给弱连通树赋边权
题解
- 树确定时,答案为
。 为从 出发可达结点中的相邻结点个数。 - 给定子图后,
个结点 个连通块。不属于 结点所在连通块的每个连通块,要么选择一个结点作为 的可达结点中的相邻结点,要么都不是。因此,这样的 个连通块对 的贡献为 。因此 的范围为 。 为 所在连通块的可达结点中的相邻结点的个数。暴力枚举即可。时间复杂度 。
AC code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,m,p,u,v,sonbase,Ans,cnt;
int flag[N];
int ksm(int a,int b,int P) {
int ans=1%P;
for(;b;b>>=1) {
if(b&1) ans=ans*a%P;
a=a*a%P;
}
return ans;
}
struct node {
int fa[N];
void cleanr(int n) {
for(int i=1;i<=n;i++) fa[i]=i;
}
int find(int x) {
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y) {
int fx=find(x),fy=find(y);
if(fx!=fy) fa[fx]=fy;
}
}BCJ;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>p;
BCJ.cleanr(n);
for(int i=1;i<=m;i++) {
cin>>u>>v;
BCJ.merge(u,v);
if(u==1) sonbase++;
}
for(int i=1;i<=n;i++) flag[BCJ.find(i)]=1;
for(int i=1;i<=n;i++) cnt+=flag[i];
for(int i=sonbase;i<=sonbase+cnt-1;i++)
Ans=max(Ans,ksm(2,n-1-i,p));
cout<<Ans;
return 0;
}
Game
简要/形式化题意
给定一个大小为
题解
- 首先,答案为:
- 即上面这个式子为
。那么有
- 时间复杂度
AC code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+10;
const int mod=1e9+7;
int T;
int n,m,k;
int a[N],dp[N][N],ans;
int ksm(int a,int b,int P) {
int ans=1%P;
for(;b;b>>=1) {
if(b&1) ans=ans*a%P;
a=a*a%P;
}
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--) {
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i];
memset(dp,0,sizeof(dp));
dp[0][0]=ksm(k,n,mod);
int inv=ksm(k,mod-2,mod);
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++) {
dp[i][j]=dp[i-1][j];
if(j>=a[i]) dp[i][j]=(dp[i][j]+dp[i-1][j-a[i]]*inv%mod)%mod;
}
cout<<dp[n][m]<<endl;
}
return 0;
}
Funciton
简要/形式化题意
二维平面上给定
题解
-
如果是一次函数,不难想到是维护一个凸包,可使用单调栈,时间复杂度
。 -
对于二次函数,即两个点为
, 。则有: , 。可以看做, 与 确定了一个一次函数。那么按照上述做法求凸包就好了。
AC code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,ans,st[N],top,cnt;
struct node {
int x,y;
}a[N],b[N];
map<pair<double,double>,int>Map;
bool cmp(node x,node y) {
return x.x<y.x||(x.x==y.x&&x.y>y.y);
}
double slope(node x,node y) {
return (y.y-x.y)*1.0/(y.x-x.x);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i].x>>a[i].y;
a[i].y-=a[i].x*a[i].x;
}
sort(a+1,a+n+1,cmp);
b[1]=a[1],cnt=1;
for(int i=2;i<=n;i++)
if(a[i].x!=a[i-1].x) b[++cnt]=a[i];
n=cnt;
for(int i=1;i<=n;i++) {
while(top>1&&slope(b[st[top-1]],b[st[top]])<=slope(b[st[top]],b[i])) top--;
st[++top]=i;
}
cout<<top-1;
return 0;
}
path
简要/形式化题意
给定
题解
-
对于
等于 。我们可以认为他们的边权都是无效的。设 。则我们可以将原图划分为 个无效集合,对他们缩点,得到的图跑 。时间复杂度 -
另一种方法是。我们推导出一个结论:
到 的最短路与 到 的最短路长度在模 意义下等价。同时 。通过 预处理出 到所有点的最短路,询问在 的时间复杂度下全部求出。 -
至此,我们可以采用根号分治,由均值不等式,我们可以的到最终的平衡复杂度为
。分解值为 。计算发现时间复杂度相对于 都是绰绰有余的。
AC code
先咕着~
考后反思
其实还行,就是没有给大样例,满级嘲讽)。
结尾
咕咕咕,代码调不出来!!!!!
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/17580188.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步