2022-9-26
T1
扩散
明显可以二分答案,也可以用最小生成树去做。考试时写的最小生成树,每两个点连一条边权为这两个点的曼哈顿距离。每次找最小的距离,
代码
#include<bits/stdc++.h>
#define MAXN 60
#define int long long
using namespace std;
int n,tot=0,ans=0;
int father[MAXN];
int fa(int data)
{
if(father[data]==data)return data;
return father[data]=fa(father[data]);
}
struct point
{
int x,y;
}p[MAXN];
struct edge
{
int l,r,w;
}ed[3000];
bool cmp(const edge a,const edge b)
{
return a.w<b.w;
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&p[i].x,&p[i].y);
father[i]=i;
for(int j=1;j<i;j++)
{
ed[++tot].l=j;
ed[tot].r=i;
ed[tot].w=abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y)-1;
}
}
sort(ed+1,ed+tot+1,cmp);
int cnt=0;
for(int i=1;i<=tot;i++)
{
if(fa(ed[i].l)==fa(ed[i].r))continue;
father[fa(ed[i].l)]=father[fa(ed[i].r)];
ans=max(ans,ed[i].w/2+1);
cnt++;
if(cnt==n-1)break;
}
printf("%lld",ans);
return 0;
}
T2
树的统计
树链剖分模板题,不多赘述。
T3
佳佳的Fibonacci
问题描述:
佳佳对数学,尤其对数列十分感兴趣。在研究完
输入格式
共一行,包含两个整数
输出格式
共一行,输出
数据范围
1 ≤
思路:
看题目已经给出了递推式,数据范围很大,考虑矩阵加速递推。
易得递推式为
注意到这个递推式有点特殊,包含
如何转移
因此我们需要记录
状态矩阵为
它要转移到
可得转移矩阵为
状态矩阵初始化为
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,mod;
struct matrix
{
int mat[10][10],n,m;
matrix(int a,int b)
{
n=a,m=b;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mat[i][j]=0;
}
void set_i()
{
for(int i=1;i<=n;i++)
mat[i][i]=1;
}
matrix operator *(matrix b)
{
matrix ans(n,b.m);
for(int i=1;i<=n;i++)
for(int j=1;j<=b.m;j++)
for(int k=1;k<=m;k++)
ans.mat[i][j]=(ans.mat[i][j]+mat[i][k]*b.mat[k][j]%mod)%mod;
return ans;
}
};
matrix qpow(matrix a,int b)
{
matrix ans(a.n,a.m);
ans.set_i();
while(b)
{
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&mod);
matrix st(1,5);
st.mat[1][1]=0;st.mat[1][3]=st.mat[1][5]=0;
st.mat[1][2]=st.mat[1][4]=1;
matrix a(5,5);
a.mat[1][1]=a.mat[2][2]=a.mat[2][3]=a.mat[2][4]=a.mat[3][2]=a.mat[4][1]=a.mat[4][4]=a.mat[4][5]=a.mat[5][4]=1;
a.mat[3][4]=2;
st=st*qpow(a,n);
printf("%lld",st.mat[1][1]%mod);
return 0;
}
T4
[CQOI2009]中位数
题目描述
给出
输入格式
第一行为两个正整数
输出格式
输出一个整数,即中位数为
提示
对于
对于
对于
思路
把数组中比
代码
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
int n,b,pos,a[MAXN],ans=0,sum=0;
map<int,int> mp;
int main()
{
scanf("%d%d",&n,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==b)pos=i;
else if(a[i]<b)a[i]=-1;
else a[i]=1;
}
for(int i=pos-1;i>=1;i--)
{
sum+=a[i];
if(sum==0)ans++;
mp[sum]++;
}
sum=0;
for(int i=pos+1;i<=n;i++)
{
sum+=a[i];
if(sum==0)ans++;
ans+=mp[0-sum];
}
printf("%d",++ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】