http://acm.hdu.edu.cn/contests/contest_show.php?cid=807
凉了啊,就过了3题
最近比较忙,经常通宵到早晨,好几天没写博客了,现在终于缓过来了
1012:数学推导
solved by wyq
#include<stdio.h>
#include<math.h>
int main()
{
int T;
double g=9.8,a,b,x,y;
double horigin,vorigin,vx,vy,gx,gy,slope;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
slope=-x/a*sqrt(a*a+b*b);
horigin=-x/a*b;
vorigin=sqrt(2*g*(y-horigin));
vy=vorigin*a/sqrt(a*a+b*b);
vx=vorigin*b/sqrt(a*a+b*b);
gy=g*a/sqrt(a*a+b*b);
gx=g*b/sqrt(a*a+b*b);
double distan=0;
double t;
int times=1;
//printf("%f %f %f\n",vorigin,vx,vy);
while(true)
{
t=2.0*vy/gy;
distan+=vx*t+0.5*gx*t*t;
if(distan>slope)break;
times++;
vx+=t*gx;
//printf("%f\n",distan);
}
printf("%d\n",times);
}
return 0;
}
1001:数学题
solved by lyy
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const double pi=acos(-1.0);
int t;
double a,b;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%lf%lf",&a,&b);
double ans=b*b*2;
ans+=4.0*a*(pi*b/4.0);
ans=ans/b;
ans=ans*1e6;
ans=floor(ans);
ans/=1e6;
printf("%.6f\n",ans);
}
return 0;
}
1009:去除所有还之后dfs
solved by lyy
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,t;
int a[100005];
int b[100005];
vector<int> v[100005];
int vis[100005];
int vis2[100005];
int vis3[100005];
int ans[100005];
int s[100005];
void init()
{
for (int i=1;i<=n;i++)
{
a[i]=i;
b[i]=-1;
v[i].clear();
vis[i]=0;
vis2[i]=-1;
ans[i]=0;
s[i]=0;
}
}
void dfs(int x)
{
if (vis[x]==1) return;
vis[x]=1;
if (s[x]>0) ans[x]=1;
if (!v[x].empty())
{
if (b[x]!=-1) s[b[x]]++;
for (auto p:v[x])
{
dfs(p);
}
if (b[x]!=-1) s[b[x]]--;
}
}
int dfs2(int x,int b)
{
if (vis2[x]!=-1)
if (vis2[x]==b) return x;
else return 0;
vis2[x]=b;
if (a[x]==x) return 0;
else return dfs2(a[x],b);
}
void dfs3(int x,int r)
{
if (vis3[x]==1) return;
if (r==1) ans[x]=1;
vis3[x]=1;
for (auto p:v[x])
{
dfs3(p,ans[p]|r);
}
}
void dfs1(int x)
{
if (vis[x]==1) return;
vis[x]=1;
if (a[x]==x) return;
else dfs1(a[x]);
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
init();
for (int i=1;i<=n;i++)
{
char s[10];
int x;
scanf("%d%s",&x,s);
if (s[0]=='v')
{
a[i]=x;
}
else
{
b[i]=x;
}
}
for (int i=1;i<=n;i++)
{
if (vis2[i]==-1)
{
int x=dfs2(i,i);
if (x!=0) dfs1(x);
}
}
for (int i=1;i<=n;i++)
{
if (vis[i]==0 && a[i]!=i)
{
v[a[i]].push_back(i);
}
}
for (int i=1;i<=n;i++)
{
vis3[i]=vis[i];
}
for (int i=1;i<=n;i++)
{
if (vis[i]==0)
{
int x=i;
while (a[x]!=x && vis[a[x]]==0) x=a[x];
dfs(x);
}
}
for (int i=1;i<=n;i++)
{
if (vis3[i]==0)
{
int x=i;
while (a[x]!=x && vis3[a[x]]==0) x=a[x];
dfs3(x,ans[x]);
}
}
int sum=0;
for (int i=1;i<=n;i++)
{
sum+=ans[i];
}
printf("0 %d\n",sum);
}
return 0;
}