【BestCoder Round #22】题解、

A:没看懂题,

我猜是转化二进制,然后去掉前导和后面的0,然后反过来,再转10进制输出。

B:没看懂题,出题人卡语文都是某种生物……QAQ

C:物理题:

可以三分模拟退火神马的

但是有O(1)公式。

推导过程在代码中:

/*
输入H,V
设Vx,Vy,t,S


Vx^2+Vy^2=V^2
4.9t*t-Vx*t=H
S=Vy*t
求maxS

*/

/*
输入H,V
设Vx,Vy,t,S

Vx^2+Vy^2=V^2
4.9t*t-Vx*t=H
S=Vy*t
求maxS
*/
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int g;
double V,H;
int main()
{
//	freopen("C.in","r",stdin);
	scanf("%d",&g);
	while(g--)
	{
		scanf("%lf%lf",&H,&V);
		printf("%.2lf\n",sqrt(((V*V+9.800*H)*(V*V+9.800*H)-96.04*H*H)/96.04000));
	}
	return 0;
}

D:傻逼莫队。

式子:len!/(now[1]!*now[2]!*……*now[30000]!)

转移:

for(int i=1;i<=q;i++)
{
		while(r<query[i].r)
	{
		ans*=(++len);
		ans%=mod;
		ans*=niyuan[(++now[src[++r]])];
		ans%=mod;
	}
	while(r>query[i].r)
	{
		ans*=niyuan[(len--)];
		ans%=mod;
		ans*=(now[src[r--]]--);
		ans%=mod;
	}
	while(l<query[i].l)
	{
		ans*=niyuan[(len--)];
		ans%=mod;
		ans*=(now[src[l++]]--);
		ans%=mod;
	}
	while(l>query[i].l)
	{
		ans*=(++len);
		ans%=mod;
		ans*=niyuan[(++now[src[--l]])];
		ans%=mod;
	}
	ret[query[i].note]=ans;
}



代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 30500
#define mod 1000000007
#define LL long long 
using namespace std;
LL Ksm(int x,int y){
	LL t=x,res=1;for(;y;y>>=1,t=(LL)t*t%mod)if(y&1)res=(LL)res*t%mod;return res;
}
LL Inv(int x){
	if(!x)x=mod;
	return Ksm(x,mod-2);
}
LL niyuan[N];
void init()
{
	for(int i=0;i<=30000;i++)
	{
		niyuan[i]=Inv(i);
	}
}
struct Q
{
    int l,r,id,note;
    long long ret;
}query[N];
int n,m,q,g,block;
int src[N],cnt[N];

long long ans;
int l,r,len;
int now[N],ret[N];
int cmplr(Q a,Q b){if(a.l==b.l)return a.r<b.r;return a.l<b.l;}
int cmpid(Q a,Q b){if(a.id==b.id)return a.r<b.r;return a.id<b.id;}
int cmpno(Q a,Q b){return a.note<b.note;}
void build()
{
    int i,j,k;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;i++)scanf("%d",&src[i]);
    block=(int)sqrt(n);
    m=(n-1)/block+1;
    for(i=1;i<=q;i++)scanf("%d%d",&query[i].l,&query[i].r),query[i].note=i;
    sort(query+1,query+q+1,cmplr);
    int id=1;
    for(i=1;i<=q;i++)
    {
        while(id*block<=query[i].l)id++;
        query[i].id=id;
    }
    sort(query+1,query+q+1,cmpid);
}
void modui()
{
	r=0,l=1;ans=1ll,len=0;
	memset(now,0,sizeof(now));


<span style="white-space:pre">	</span>for(int i=1;i<=q;i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">			</span>while(r<query[i].r)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>ans*=(++len);
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">			</span>ans*=niyuan[(++now[src[++r]])];
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>while(r>query[i].r)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>ans*=niyuan[(len--)];
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">			</span>ans*=(now[src[r--]]--);
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>while(l<query[i].l)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>ans*=niyuan[(len--)];
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">			</span>ans*=(now[src[l++]]--);
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>while(l>query[i].l)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>ans*=(++len);
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">			</span>ans*=niyuan[(++now[src[--l]])];
<span style="white-space:pre">			</span>ans%=mod;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>ret[query[i].note]=ans;
<span style="white-space:pre">	</span>}
int main()
{
//	freopen("test.in","r",stdin);
	int i;
	scanf("%d",&g);
	init();
	while(g--)
	{
		build();
		modui();
		for(i=1;i<=q;i++)printf("%d\n",ret[i]);
	}
	return 0;
}



附一个样例:

input:

1
5 2
1 2 1 2 1
1 2
4 5

output:

2

2



那个,还没测完我就勇敢地发了题解。

有bug请请喷谢谢,但是思想都是对的。


复制去Google翻译 翻译结果
(R < 查询[ I] .R
{ 接送时段
* = (LEN ++) ;
= MOD 一年 ;
niyuan * = [ ++ 现在 [来源 [++ R] ] ;
= MOD 一年 ;
} 接送时段
R> 查询[ I] .R
{ 接送时段
niyuan * = [( len-- )];
= MOD 一年 ;
* = (现 [来源 [ - R] ] - ;
= MOD 一年 ;
} 接送时段
(L < 查询[ I] .L
{ 接送时段
niyuan * = [( len-- )];
= MOD 一年 ;
* = (现 [来源 [ ++ ]] - ;
= MOD 一年 ;
} 接送时段
L> 查询[ I] .L
{ 接送时段
* = (LEN ++) ;
= MOD 一年 ;
niyuan * = [ ++ 现在 [来源 [ - L ] ;
= MOD 一年 ;
} 接送时段

你可能感兴趣的:(BestCoder)