萌新第三次参加比赛了。。慢慢懂了一些套路。这次发挥比之前都好,比赛中做出了三道题,排名是2400多。写一下前四道题的题解:
A. New Year Garland(思维)
三种颜色的灯笼排列成一条直线,直线上任意邻近的灯笼颜色不同。
给出三种灯笼的数量,判断能否满足如上条件。
解:两种灯笼的数量之和小于数量最大的灯笼个数-1就可以满足条件。复杂度O(1)
代码略
B. Verse For Santa(前缀和)
解:第i个verse的前缀和与S比较,小于等于S的话ans=0,大于S的话减去0~i个verse中的最大值再与S比较,小于等于S的话ans=最大值的下标。复杂度O(n).
代码:
#include
#include
#include
#include
C. Stack of Presents(思维)
解:存储bi在a中对应的下标,遍历bi,每次取bi时,把bi+1,bi+2..中连续的出现在bi之前的数都放在最上面,这样这些数每次只需要动一下。复杂度O(m)
#include
#include
#include
#include
D.Santa's Bot(概率+逆元)
解:
一开始往组合数的方向想没整出来,后来看大神的代码发现就是简单的概率求和.....
做出有效决定的概率=每一个礼物被选中时为有效决定的概率之和
设p[j]为想要j礼物的人数,j礼物被选中一次且有效的概率是1/n(n个孩子选第i个)*1/ki(i孩子想要的k个礼物中选这个礼物)*p[j]/n(j礼物有效的概率),可以发现1/n可以提取,ki可以求和,这样复杂度就简化到了O(NlogMOD)
代码:
#include
#include
#include
#define MAXN 1000002
#define For(x,y) for(int x=0;x>=1;
n=n*n%MOD;
}
return s;
}
int main(){
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
long long ki,n,k,now;
cin>>n;
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
For(i,n){
cin>>k;
ki=inv(k)%MOD;
For(j,k){
cin>>now;
a[now]=(a[now]+ki)%MOD,p[now]++;
}
}
long long P=0;
For(i,MAXN)
if(p[i])
P=(P+a[i]*inv(n)%MOD*inv(n)%MOD*p[i]%MOD)%MOD;
cout<