T1
MIND
据题意,得
\[\sum_{i-1}^{n}{\frac{1}{n}\times\frac{1}{2^{\lceil\log_2\lceil\frac{k}{i}\rceil\rceil}}} \]其中\(\log_2\)可调用C++内置函数,\(2\)的阶乘可以用位运算.
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,o,p) for(ll i=o;i<=p;++i)
#define pr(i,o,p) for(ll i=o;i>=p;--i)
const ll MAXN=1e5+5;
ll n,k;
double ans;
int main()
{
scanf("%lld%lld",&n,&k);
rp(i,1,n)
{
ll t=ceil(1.0*log2(ceil(1.0*k/i)));
ans+=1.0/n*1.0/(1<<t);
}
printf("%.12lf\n",ans);
return 0;
}
T2
MIND
\[\begin{cases} 奇+奇=偶\\ 奇+偶=奇\\ 偶+偶=偶\\ \end{cases} \Rightarrow 每个点只需要考虑邻接的点 \]
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,o,p) for(ll i=o;i<=p;++i)
#define pr(i,o,p) for(ll i=o;i>=p;--i)
const ll MAXN=1e5+5;
ll n;
bool hve[MAXN];
int vis[MAXN]; // -1:white 0:none 1:black
ll sum,en[MAXN<<1],hd[MAXN],lt[MAXN<<1],vl[MAXN<<1];
void add(ll u,ll v,ll w){en[++sum]=v,vl[sum]=w,lt[sum]=hd[u],hd[u]=sum;}
int main()
{
scanf("%lld",&n);
rp(i,1,n-1)
{
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
queue<ll> q;
q.push(1);
hve[1]=1;
vis[1]=1;
while(!q.empty())
{
ll u=q.front();
q.pop();
for(ll i=hd[u],v,w;i&&(v=en[i])&&(w=vl[i]);i=lt[i])
{
if(!hve[v]&&(hve[v]=1))
q.push(v);
if(w&1)
vis[v]=-vis[u];
else
vis[v]=vis[u];
}
}
rp(i,1,n)
printf("%d\n",(vis[i]==1?1:0));
return 0;
}
T3
MIND
同T2,统计连通块的数量.
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,o,p) for(ll i=o;i<=p;++i)
#define pr(i,o,p) for(ll i=o;i>=p;--i)
const ll MAXN=1e5+5;
ll n,m;
ll X[MAXN],Y[MAXN],Z[MAXN];
ll sum,en[MAXN<<1],hd[MAXN],lt[MAXN<<1];
ll d[MAXN],ans;
void add(ll u,ll v){en[++sum]=v,lt[sum]=hd[u],hd[u]=sum;}
void dfs(ll x)
{
d[x]=1;
for(ll i=hd[x],y;i&&(y=en[i]);i=lt[i])
if(!d[y]) dfs(y);
}
int main()
{
scanf("%lld%lld",&n,&m);
rp(i,1,m)
{
scanf("%lld%lld%lld",&X[i],&Y[i],&Z[i]);
if(X[i]>Y[i]){ll t=X[i];X[i]=Y[i];Y[i]=t;}
add(X[i],Y[i]);
add(Y[i],X[i]);
}
rp(i,1,n)
if(!d[i])
++ans,dfs(i);
printf("%lld\n",ans);
return 0;
}
T4
MIND
简单思考一下,分情况讨论.
- 若\(k>2^{m}-1\),无解输出\(-1\)
- 若\(m=1\)
- 若\(k=1\),无解输出\(-1\)
- 有解输出\(0 \: 0 \: 1 \: 1\)
- 形如\(1\:,2\:,3\:,\dotsb,2^{m}-1,\:k\:,2^{m}-1, \: 2^{m}-2, \dotsb, 3\:,2\:,1\:,k\),一定符合题目要求
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,o,p) for(ll i=o;i<=p;++i)
#define pr(i,o,p) for(ll i=o;i>=p;--i)
const ll MAXM=17,MAXK=1e9,MAXN=(1<<17)+5;
ll m,k;
ll n;
int main()
{
scanf("%lld%lld",&m,&k);
n=(1<<m)-1;
if(k>n) printf("-1\n");
else if(m==1)
{
if(k==1) printf("-1"),0;
else printf("0 0 1 1\n"),0;
}
else
{
rp(i,0,n) if(i!=k) printf("%lld ",i);
printf("%lld ",k);
pr(i,n,0) if(i!=k) printf("%lld ",i);
printf("%lld ",k);
}
return 0;
}
结尾
这次题目都很简单,好像欢乐赛,成绩是\(rank\:3\)。T3赛时想到了,但是自以为地又改错了。(TT)
下次继续加油吧。
标签:总结,rp,20230309,ll,long,MAXN,printf,模拟,define From: https://www.cnblogs.com/Wang-Holmes/p/17353843.html