#564(DIV2)ラウンドCodeforces

#564(DIV2)ラウンドCodeforces

それが脱走して送信された当初考えていた、結果は殺されたフィールドになります。

料理は原罪であります

A

SBの質問、WAのうち、賃金をよく読んでいない質問は、コードは固執しません

B

シンプルな構造

明らかに、\(N-N- * \)マトリックスがこの順に配置してもよいです

VBUwCj.png

その後、\(N- \)サイズのように実際に従事

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N = 1e5 + 3;
inline int read(){
    int v = 0,c = 1;char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') c = -1;
        ch = getchar(); 
    }
    while(isdigit(ch)){
        v = v * 10 + ch - 48;
        ch = getchar(); 
    }
    return v * c;
}
int n,m;
int aa[N];
int main(){
    n = read();
    aa[1] = 1;
    for(int i = 1;i <= 10000;++i) aa[i] = 2 * i - 1;
    int now = 1;
    while(aa[now] < n) now++;
    printf("%d\n",now);
    for(int i = 1;i <= now;++i)
    printf("1 %d\n",i);
    int cc = 2;
    for(int i = now + 1;i <= n;++i)
    printf("%d %d\n",cc,now),cc++;
    return 0;
}

C

提案を送信し、時間以上のカード、非常に話題と考えます

まず第一に、答えは確かではありません以上(nは-2 * \)\一つずつそして、最悪の場合は、我々は非ブランクがあなたの手にカードを保存しなければならないとショット

我々は2つの戦略を持っています

1:直接は彼のカードを果たし、その後の終わり満たすためにチームを必要とする\(1 \)を、我々はタッチので、もし渡すことができ、私たちの手の中に次のカードを始め、連続フィールドの終わりに。尾は、我々が文を直接見ることができ、連続したサブセグメントを持っていた、Ruoguoは、明らかにこれが最適解であることができます

2:尻尾が上記の条件を満たしていない場合は、我々は何に接続方法や連続フィールドを持っていない、我々は一度に再生するために、カードを保存されています

私たちは、セット(\ P_I)\を表し\(私は\)キュー内の位置のナンバープレートを(キュー内とはみなさない\(0 \)すべての私たちであれば、その後、)\(P_I \)は、時間のチームの頭(セットになって\(T \)遊び

まず必要なの\(\ MAX_ {I = T } ^ NPI - (I - 1)== p_i-(I - 1)\)

\(p_i-は、(i - 1) \) 最も困難を理解するところです。

私たちは挿入理解\(私は- 1 \)回は、対象の唯一のいくつかのステップがある場合、\(私は\)から抜け出すためには、(デフォルトの時間は、私たちがしている私たちがしている\(1-I - 1 \ ) )

言い換えれば、私は手があることを確認します( - 1 \ 1-I \ ) 、その後、少なくとも完成プラグイン\ - (I 1 \)の前にタッチ\は(私は\)を挿入しなければならない1) - (I p_i-(\ \)の時間は、私の手ので\(1-I-1 \)これは)一度だけカウント貢献(または部分的に重複していません

この時間は、我々が持っていなかった場合でも、\を(私は- 1 \)どのようにしますか?

この問題が発生したかどうかは関係ありません- \を({1 I} P_は \) である必要があります\(P_I \)後に、我々は最大値を取得し、\(P_ {I + 1} \)の寄与が明らかに大きいです

したがって、答えは\(N + MAX_が{i = 1} ^ np_i-I + 1 \)

#include<cstdio>
#include<cctype>
#include<iostream>
using namespace std;
const int N = 2e5 + 3;
int p[N];
int a[N];
int b[N];
int book[N];
int n;
inline bool check(){
    for(int i = 1;i <=  n;++i) if(book[i] == 0) return false;
    return true;    
}
int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;++i) scanf("%d",&a[i]),book[a[i]] = 1;
    for(int i = 1;i <= n;++i) scanf("%d",&b[i]),p[b[i]] = i;
//  bool flag = 0;
    int now = n;
    while(now >= 2 && b[now - 1] != 0 && b[now - 1] == b[now] - 1) now--;
//  cout << now << endl;
    int t = 1;
    if(b[now] == 1){
        for(int i = 1;i <= b[n];++i) book[i] = 1;
        for(int i = b[n] + 1;i <= n;++i){
            if(!book[i]){break;}
            book[b[t]] = 1;
            t++;
        //  cout << t << endl;
        }
        if(check()){
            printf("%d\n",now - 1);
            return 0;   
        }
    }
//  cout << flag << endl;
//  cout << t << endl;
    //  cout << "GG";
        int ans = 0;
        for(int i = 1;i <= n;++i)
            ans = max(ans,p[i] - i + 1);
        printf("%d\n",ans + n);
    return 0;   
}

D

まず、私たちは一人一人のサブツリーが円の連続弧でなければならないことがわかったので、木、互いに独立して、すべての子供が、その後、私たちは考える(DP \)\拠出を求めて

私たちはで固定し、聞かせて\は(のf_i \)で表さ\(私は\)答えは、今の時間です

\(のf_i =(son_i + [I] =ルート])!\ prod_ {son_iにj個の\} F_J \)

\(Nf_ ANS = {ルート} \)

何故

ツリーは、互いの製品のように、独立して、総答えは、関連するサブツリーに答えなければならない、とするので一つ一つの子について考えてみて、それらの相対的な順序に制限はありませんので、

そして、その階乗息子の関係の数ではなく、現在の親ノードが配置に参加するために、今あります。

そして今、そこに\(N \)の位置は置くことができます

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N = 3e5 + 3;
const LL mod = 998244353;
vector <int> G[N];
LL ans = 0;
int son[N];
LL dp[N];
LL inv[N];
inline int read(){
    int v = 0,c = 1;char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') c = -1;
        ch = getchar(); 
    }
    while(isdigit(ch)){
        v = v * 10 + ch - 48;
        ch = getchar(); 
    }
    return v * c;
}
int n;
inline void dfs(int x,int f){
    dp[x] = 1;
    for(int i = 0;i < (int)G[x].size();++i){
        int y = G[x][i];
        if(y == f) continue;
        dfs(y,x);   
        son[x]++; 
    }
    int w = (x != 1) ? son[x] + 1: son[x];
    for(int i = 0;i < (int)G[x].size();++i){
        int y = G[x][i];
        if(y == f) continue;
        dp[x] = dp[x] * dp[y] % mod;
    }
    dp[x] = dp[x] * inv[w] % mod;
}
int main(){
    inv[0] = 1;
    

    n = read();for(int i = 1;i <= n;++i) inv[i] = inv[i - 1] * i % mod;
    for(int i = 1;i < n;++i){
        int x = read(),y = read();
        G[x].push_back(y);
        G[y].push_back(x);  
    }
    dfs(1,0);
    printf("%I64d\n",dp[1] * n % mod);
    return 0;
}

おすすめ

転載: www.cnblogs.com/wyxdrqc/p/10990378.html