E
思考题
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,c,x,y,z,m;//将所有数据改为long long类型数据从67%直接ac
cin>>a>>b>>c>>x>>y>>z>>m;
long long rou=a+b+c;
long long s2=a*z+b*(z-x);
long long s=a*z+b*(z-x)+c*(y+z);//一个周期走过的路程
double ans=0;
if(a*z>=m)//第一阶段就可以到达
{
ans=m*1.0/z;
printf("%.10lf",ans);
}
else if(s<=0)
{
cout<<"Badeline win"<<endl;
}
else{
long long t=m;
t/=s;//走过t个周期
m=m%s;//走过t个周期剩余m距离
ans=t*(a+b+c);//之前漏掉 数据通过样例从17%提高到67%
if(a*z>=m)//第一阶段就可以到达
{
ans+=m*1.0/z;
}
else if(s2>=m) //第二个阶段到达
{
ans+=a+(m*1.0-a*z)/(z-x);
}
else if(s>=m)
{
ans+=a+b+(m-s2*1.0)/(y+z);
}
printf("%.10lf",ans);
}
return 0;
}
F
并查集
#include<iostream>
#define max 1000005//max定义成100005则会出现段错误通过吕62%
#define ll long long
using namespace std;
int fa[max];
int a[max];
//找到根节点
//初始化
void init(int n)
{
for(int i=1;i<=n;i++)
fa[i]=i;//初始化
}
//查找
int find_root(int x)
{
if(fa[x]!=x)
fa[x]=find_root(fa[x]);
return fa[x];
}
//合并
void Union(int x,int y)
{
int fx=find_root(x);
int fy=find_root(y);
if(fx==fy) return ;
fa[fy]=fx;
}
int main()
{
ll n,q;
scanf("%d%d",&n,&q);
ll r[max]={0},c[max]={0};
init(n);
for(int i=1;i<=n;i++)
{
ll x,y;
scanf("%d%d",&x,&y);
if(r[x]==0)
r[x]=i;
else
Union(r[x],i);
if(c[y]==0)
c[y]=i;
else
Union(c[y],i);
}
for(int i=1;i<=q;i++)
{
ll a,b;
scanf("%d%d",&a,&b);
if(find_root(a)==find_root(b))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
D
K
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll f[30],dp[100009];
memset(f,0,sizeof(f));//与下一行相同
memset(dp,0,sizeof(dp));//初始化与全局变量二选一,否则通过了26%
f[0]=0;
f[1]=1;
dp[0]=1;//初始化
for(int i=2;i<=25;i++)
f[i]=f[i-1]+f[i-2];
ll n,x,y;
cin>>n>>x>>y;
for(int i=x;i<=n;i++)
dp[i]+=dp[i-x];
for(int i=y;i<=n;i++)
dp[i]+=dp[i-y];
for(int i=0;i<=n;i++)
{
int ans=dp[i];
for(int j=25;j>=2;j--)
{
if(i>=f[j])
ans+=dp[i-f[j]];
}
cout<<ans<<" ";
}
return 0;
}