12.27
CF Edu79
A.New年ガーランド
質問の意味: G、そこR、赤、緑、青の風船B、あなたは今ではない、二つの隣接する同色バルーンこと行かどうかを尋ねることができます。
アイデア:最大> 2進1がハングアップした場合。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e5+20;
struct Task{
int a,b,c;
void init(){
scanf("%d%d%d",&a,&b,&c);
}
void run(){
init();
int mx=max(a,max(b,c)),sum=a+b+c;
if (mx>sum-mx+1)
printf("No\n");
else
printf("Yes\n");
}
}t;
int main(){
int T;
scanf("%d",&T);
for(int i=1;i<=T;++i)
t.run();
return 0;
}
サンタのためにB.Verse
問題の意味:あるn個のセグメントは、それぞれが、[i]は、分、秒の最小の合計を必要と読むために起動する必要がありますが、スキップアウェイ。Q.で削除する必要が最大のフラグメントを、読み出すため?
思考: 1万偽のアルゴリズム。実際には、非常に単純な、ラインをスキップすることを、最大の選挙を、スキップ臨界点を見つけ、その後、いずれかの完了できませんでした最初の研究をスキップし、または最大の目の前に出スキップしないように。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e5+20;
struct Task{
int n,s,a[M];
int mxp=0;
void init(){
mxp=0;
scanf("%d%d",&n,&s);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
a[n+1]=0;
}
void run(){
init();
int p=1;
while(p<=n&&a[p]<=s){
s-=a[p];
if (a[p]>a[mxp])
mxp=p;
++p;
}
if (p>n||n==1)
printf("0\n");
else{
if (a[mxp]>a[p])
printf("%d\n",mxp);
else
printf("%d\n",p);
}
}
}t;
int main(){
int T;
scanf("%d",&T);
for(int i=1;i<=T;++i)
t.run();
return 0;
}
プレゼントのC.Stack
質問の意味:存在している下の番号への上からの贈り物の束は、A1、A2、続いて......。順次今、B2はB1取る、...、BNの贈り物、それぞれが両方のテイク秒を必要2K + 1は、kは本ギフト上記ターゲットの数です。しかし、それぞれが贈り物を取得した後、贈り物は、上記の順序のいずれかによってソートすることができます。今、私はある最小時間を考え出すために、すべてのプレゼントをお願いします。
アイデア:現在の贈り物を前に移動された場合、時間が1の最後の移動、それは、あなたはそれがほとんどの中で発生したときにそれを得るための方法を持っているように手配することができるようになりますので、そう、この贈り物を取る、ということも考えられますトップ。だから、直接のポインタと配列のVI、それにはアクセスされていない場合はすべてがVISクリックし、記録に回すためにコースを探して、振り返ってみます。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
#define db(x) cout<<#x<<":"<<x<<endl;
const int M=1e5+20;
struct Task{
int n,m,a[M],b[M],vis[M];
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]),vis[i]=0;
for(int i=1;i<=m;++i)
scanf("%d",&b[i]);
}
void run(){
init();
LL ans=0;
int p=1;
for(int i=1;i<=m;++i){
if (vis[b[i]])
++ans;
else{
while(p<=n&&a[p]!=b[i])
vis[a[p]]=1,++p;
ans+=2*(p-i)+1;
}
}
printf("%lld\n",ans);
}
}t;
int main(){
int T;
scanf("%d",&T);
for(int i=1;i<=T;++i)
t.run();
return 0;
}
D.Santaのボット
質問の意味: nが子供ありますが、すべての子供をk希望の贈り物を持って、それぞれの贈り物は別の番号を持っています。今、最初にランダムランダムに子供のためだけの贈り物、子供を選択した後、ランダムに贈り物を選択し、そこから子供の希望リストの後に、子を選択したアルゴリズムがあります。それが右に送信することができますがありますどのように多くの可能性を確認して下さい。
アイデアは:まず、すべての贈り物を選択することが統計的確率は、明らかに+一度遭遇を読み取る(\ \ {1} {N-FRAC} * \ FRAC {1} {K} \) 。人の後に最後の時間をランダムに各ギフト用に選択される確率は、あなたがしたいので、送信されるように選択されているので、*その子の数は、/ nとすることができます。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
const int M=1e6+20,P=998244353;
int Inv[M];
void ln_Inv(int p){
Inv[0]=Inv[1]=1;
for(int i=2;i<=1e6;i++)
Inv[i]=1LL*(p-p/i)*Inv[p%i]%p;
}
struct Task{
int n,giftnum[M],giftprob[M];
void run(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
int k;
scanf("%d",&k);
int prob=1LL*Inv[n]*Inv[k]%P;
for(int j=1;j<=k;++j){
int c;
scanf("%d",&c);
++giftnum[c];
giftprob[c]=(giftprob[c]+prob)%P;
}
}
int ans=0;
for(int i=1;i<=1e6;++i)
ans=(ans+1LL*giftprob[i]*giftnum[i]%P*Inv[n]%P)%P;
printf("%d\n",ans);
}
}t;
int main(){
ln_Inv(P);
t.run();
return 0;
}