最近这题解是真不想写,
正好这次不太难,就放个代码吧
1>比赛
新奇的方法,但是我不想分析
精度操作很烦人
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n;
const int N=5e4+3;
long long a[N],b[N];
long long sum[N],sq_sum[N],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
sort(a+1,a+n+1),sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+b[i],sq_sum[i]=sq_sum[i-1]+b[i]*b[i];
for(int i=1;i<=n;i++)
{
int pos=upper_bound(b+pos,b+n+1,a[i])-b-1;
ans+=a[i]*a[i]*pos +sq_sum[pos] -2*a[i]*sum[pos] ;
ans-=a[i]*a[i]*(n-pos) +(sq_sum[n]-sq_sum[pos]) -2*a[i]*(sum[n]-sum[pos]);
}
double t=ans*1.0/n;
printf("%.1lf\n",t);
return 0;
}
2>数字
乘法原理,容斥原理,dp
//dfs递归->超时
//全排列->失败
//递推->0.3s->ok!
//两种条件,本质相似,但是计数会重复(或运算)
//条件只有一个,sum相等,所以就cnt*cnt
//然后*2
//再想交集
//额......
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<ctime>
using namespace std;
int n,len;
char c[15];
const int N=1003,mod=999983;
int d[13],cnt[N][N*10];
long long ans[5];
void prepare()
{
int mx;
cnt[0][0]=1;
for(int i=1;i<=n;i++)
{
mx=i*9;
for(int j=1;j<=len;j++)
for(int k=d[j];k<=mx;k++)
cnt[i][k]=(cnt[i][k] +cnt[i-1][k-d[j]])%mod;
}
}
void work(int pos,int k)
{
int mx=k*9;
for(int i=0;i<=mx;i++) ans[pos]=(ans[pos]+1LL*cnt[k][i]*cnt[k][i]%mod)%mod;
}
int main()
{
scanf("%d%s",&n,c+1) ;
//clock_t startTime,endTime;
//startTime = clock();
len=strlen(c+1);
for(int i=1;c[i];i++) d[i]=c[i]-'0';
prepare();
work(0,n);
ans[0]<<=1;
work(1,n>>1);
work(2,n+1>>1);
printf("%lld\n",((ans[0]-ans[1]*ans[2])%mod+mod)%mod);
//endTime = clock();//计时结束
//cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
3>祖孙询问
水啊,LCA
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,rt,q;
const int N=4e4+3;
int dep[N],fa[N][17];
vector <int> g[N];
void dfs(int u,int ff)
{
fa[u][0]=ff,dep[u]=dep[ff]+1;
for(int i=1;i<17 && fa[u][i-1];i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
int sz=g[u].size() ;
for(int i=0;i<sz;i++)
if(g[u][i]!=ff) dfs(g[u][i],u);
}
void query(int u,int v)
{
if(!dep[u] || !dep[v])
{
printf("0\n");
return ;
}
int flag=2;
if(dep[u]<dep[v]) swap(u,v),flag=1;
int dis=dep[u]-dep[v];
for(int i=1,j=0;i<=dis;i<<=1,j++)
if(dis&i) u=fa[u][j];
if(u==v) printf("%d\n",flag);
else printf("0\n");
}
int main()
{
scanf("%d",&n);
int u,v;
while(n--)
{
scanf("%d%d",&u,&v);
if(v==-1) rt=u;
else g[u].push_back(v),g[v].push_back(u);
}
dfs(rt,0);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&v);
query(u,v);
}
return 0;
}
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n;
const int N=5e4+3;
long long a[N],b[N];
long long sum[N],sq_sum[N],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
sort(a+1,a+n+1),sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+b[i],sq_sum[i]=sq_sum[i-1]+b[i]*b[i];
for(int i=1;i<=n;i++)
{
int pos=upper_bound(b+pos,b+n+1,a[i])-b-1;
ans+=a[i]*a[i]*pos +sq_sum[pos] -2*a[i]*sum[pos] ;
ans-=a[i]*a[i]*(n-pos) +(sq_sum[n]-sq_sum[pos]) -2*a[i]*(sum[n]-sum[pos]);
}
double t=ans*1.0/n;
printf("%.1lf\n",t);
return 0;
}