Codeforces Round 872
“和出题人坐在一个教室打比赛是一种什么体验”
讲真,这场偏难
A. LuoTianyi and the Palindrome String
诈骗,只要不是全一个就是是 \(n-1\)
证明是 \(well-known\) 的
void solve(){
string str;
cin >> str;
int n=str.length();
str=" "+str;
char c=str[1];
fp(i,2,n) {
if(str[i]!=c){
cout << n-1 << endl;
return;
}
}
cout << "-1" << endl;
}
B. LuoTianyi and the Table
挺明显的,分类讨论一下就好了
const int maxN=110;
int b[maxN*maxN],n,m;
void solve(){
n=rd(),m=rd();
fp(i,1,n*m) b[i]=rd();
sort(b+1,b+n*m+1);
int max1=b[n*m],max2=b[m*n-1];
int min1=b[1],min2=b[2];
int ans1,ans2;
//max在左上角
ans1=(max1-min1)*(max(n,m)-1)+(max1-min2)*(min(n,m)-1)+(max1-min1)*(n-1)*(m-1);
ans2=(max1-min1)*(max(n,m)-1)+(max2-min1)*(min(n,m)-1)+(max1-min1)*(n-1)*(m-1);
cout << max(ans1,ans2) << endl;
}
C. LuoTianyi and the Show
明显,我们有三种策略
- 直接全部放第一类观众
- 全部放第二类观众
- 放第三类观众,但是我们选择一个观众作为“基准”,在其左边放第一类观众,在右边放第二类观众
就是这样,一个前缀和之类的就搞定了
const int maxN=1e5+10;
int a[maxN],n,m;
int ts[maxN],pre[maxN],suf[maxN];
void solve(){
n=rd(),m=rd();
int left=0,right=0;
fp(i,1,n){
a[i]=rd();
if(a[i]>0) ts[a[i]]=1;
if(a[i]==-1) left++;
if(a[i]==-2) right++;
}
fp(i,1,m)
pre[i]=pre[i-1]+ts[i];
fd(i,m,1) suf[i]=suf[i+1]+ts[i];
int res=min(max(left,right)+pre[m],m);
fp(i,1,m){
if(!ts[i]) continue;
int ans=min(m-i,suf[i+1]+right)+min(i-1,pre[i-1]+left)+1;
res=max(ans,res);
}cout << res << endl;
memset(pre,0,sizeof(pre));
memset(suf,0,sizeof(suf));
memset(ts,0,sizeof(ts));
}
以上的题是本人场切的,下面都是抄题解
D. LuoTianyi and the Floating Islands
给定一棵 \(n\) 个结点的树,现在有 \(k(k\le n)\) 个结点上有人。
一个结点是好的当且仅当这个点到所有人的距离之和最小。
求在这 \(n\) 个点中随机取 \(k\) 个点时,好的结点的期望个数,对 \(10^9+7\) 取模。
\(n\in[3,2\cdot 1e5]\)
首先,有一个结论,就是这些好点,其一定在一条链上
然后你还发现,如果 k 是个奇数,那这个好点是一定的
这很明显
然后吧,可以想想,一条边,如果其左边分布着一半的点,右边分布着一半的点,那一定是一条“好边”
但是,有些时候好点会出现,但好边不会,怎么办呢
那根据期望的性质,我们有 \(E(x+1)=E(x)+1\)
充分证明了我的期望是白学了
(不对我好像学都没学过
那这里就好办了,给出柿子
\[\sum \tbinom{siz_i}{\frac{k}{2}} \tbinom{n-siz_i}{\frac{k}{2}}
\]
最后加上个 1 ,就可以了
const int maxN=2*1e5+10;
int fac[maxN],ifac[maxN],siz[maxN];
ll sum=0;
vector<int>g[maxN];
ll n,k;
inline ll qmi(ll x,ll p){
ll ans=1;
for(;p;p>>=1){if(p&1)(ans*=x)%=mod;(x*=x)%=mod;}
return ans;
}
void prepare(){
fac[0]=1;
fp(i,1,n)
fac[i]=(fac[i-1]*i)%mod;
ifac[n]=qmi(fac[n],mod-2);
fd(i,n-1,0)
ifac[i]=(ifac[i+1]*(i+1))%mod;
}
inline ll C(int n,int m){
if(n<m||m<0||n<0) return 0;
return (fac[n]*ifac[n-m])%mod*ifac[m]%mod;
}
void dfs(int now,int f){
siz[now]=1;
for(int x:g[now]){
if(x==f) continue;
dfs(x,now);
siz[now]+=siz[x];
}
if(f!=0)
(sum+=(C(n-siz[now],k/2)*C(siz[now],k/2))%mod)%=mod;
}
signed main(){
n=lrd(),k=lrd();
fp(i,1,n-1){
int u=rd(),v=rd();
g[u].push_back(v);
g[v].push_back(u);
}
if(k&1){
cout << 1 << endl;
return 0;
}
prepare();
dfs(1,0);
ll res=((sum*qmi(C(n,k),mod-2))%mod+1)%mod;
cout << res << endl;
return 0;
}
最后,这场div1就只有一个人 fst ,足以见得数据的强度
当然edu就不一定了
浙公网安备 33010602011771号