#67ラウンド教育Codeforces

これは.......人qwqのFSTの何百Dの本当に悲劇的な問題である.........

トピックへのリンク:私を突きます

ステッカーやおもちゃ

卵のみおもちゃ、または単にステッカー、またはその両方があるかもしれません。あなたの卵、おもちゃ、ステッカーの数を与え、あなたは内部の各卵の特定の状況を知らない。今、あなたは、少なくとも最悪のケースを求めますどのように多くの卵は、少なくともおもちゃやステッカー。取得するには、決裂していない
引き出しの原理を?何も言うこと。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define MAXN 200010
using namespace std;
int n,m,T,a,b;
 
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&a,&b);
        int ans=max(n-a+1,n-b+1);
        cout<<ans<<endl;
    }
    return 0;
}

Bレターショップ

あなたの文字列sを付け、その後、(文字列t)の数を尋ね、あなたがトンを綴ることができ、少なくとも秒長いプレフィックスのを取る再結合後にする必要があるたびに尋ねた。
ちょうどそれ大丈夫QAQについて書きます

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define MAXN 200010
using namespace std;
int n,m;
int cnt[26],pos[26][MAXN],cur_cnt[26];
char s[MAXN],cur[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
    {
        cnt[s[i]-'a']++;
        pos[s[i]-'a'][cnt[s[i]-'a']]=i;
    }
    scanf("%d",&m);
    for(int p=1;p<=m;p++)
    {
        scanf("%s",cur+1);
        int len=strlen(cur+1),ans=0;
        memset(cur_cnt,0,sizeof(cur_cnt));
        for(int i=1;i<=len;i++)
        {
            cur_cnt[cur[i]-'a']++;
            ans=max(ans,pos[cur[i]-'a'][cur_cnt[cur[i]-'a']]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

C Vasyaと配列

あなたにいくつかの要件を考えると、tが与えられた時間間隔、少なくとも1セットの存在内の配列に必要な0トンの=、単調に、落下一定間隔内の配列に必要な、1 = \(a_iを、a_j \)を満たす\(私は< j個\)\(a_iを> a_j \) あなたは配列を構築することができます。

私たちは、全体のシーケンスの違いを作る。まず単調な、単調な、そして我々は彼らを等しくすることができ、落下しない議論を引き出しゾーンドロップしません。
その後、T = 0の場合に対応.....私たちは、任意の間隔ではなく選択することができますそして、彼が値を微分するように以前に、必要な-1の同数。いいえ、この数ならば、QAQから構成シーケンスは、falseを返します。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define MAXN 200010
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[MAXN],done[MAXN],ans[MAXN];
struct Node{int op,l,r;}node[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&node[i].op,&node[i].l,&node[i].r);
    }
    for(int i=2;i<=n;i++) a[i]=-inf;
    for(int i=1;i<=m;i++)
    {
        if(node[i].op==0) continue;
        for(int j=node[i].l+1;j<=node[i].r;j++) a[j]=0;
    }
    // for(int i=1;i<=n;i++) printf("%d ",a[i]); puts("");
    for(int i=1;i<=m;i++)
    {
        if(node[i].op==1) continue;
        bool flag=false;
        for(int j=node[i].l+1;j<=node[i].r;j++)
        {
            if(a[j]==-1) 
            {
                flag=true;
                break;
            }
            if(a[j]==-inf) 
            {
                a[j]=-1;
                flag=true;
                break;
            }
        }
        if(flag==false)
        {
            cout<<"NO"<<endl;
            return 0;
        }
    }
    // for(int i=1;i<=n;i++) printf("%d ",a[i]); puts("");
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++) if(a[i]==-inf) a[i]=0;
    for(int i=1;i<=n;i++)  ans[i]=ans[i-1]+a[i];
    int minn=0;
    for(int i=1;i<=n;i++) minn=min(minn,ans[i]);
    for(int i=1;i<=n;i++) ans[i]+=-minn+1;
    for(int i=1;i<=n;i++) printf("%d ",ans[i]); puts("");
    return 0;
}

Dサブアレイソート

その後、質問、すべてが持っていたレースを見ている多くの人々。FSTの多数の最も悲劇的な.........

あなたの二つの配列、AとBを付け、各セクションが任意に選択することができソート(小から大にデフォルトの順序)は、AからBへの操作をするかどうかを尋ねた
二つの配列内の数字限り、競争のアイデアがあるときを考えます確かに、あれば辞書式aはライン上のBよりも大きい。ように大きいので少し前から行くことができない、同じである
が、例えば......アウトフォークすることが容易である、= 2 6 3 7、B = 2376

正の解決策を考えてみましょう
。私たちはA、最低限のメンテナンス間隔のツリーラインを構築し
、その後、我々は一つ一つそれらにBを考える例えば、現在のプロセスがBである[i]は、この数は私たちVの位置Aに表示されます。需要[1、v]の最小値は、最小値[i]がB未満であれば、それは不可能であり、falseを返します。そうでない場合、我々はvが多数ある変更(問題の意味に応じて、[i]は、B [I ] <= N、N + 1)のように変更することができ
、これはサブ?理由
理由なら放電B [i]の時間、もし位置B k内である[J]、以前の最小値、その後、明らかにJ < - > Vの意志との接続がk < - >私が交差した後、大きな数字の後ろに行くことができない少数の一種の原理に従って、私たちは非常に、完全に違法な変更しましたこの位置で数Bで決定された以降の動作に影響を及ぼさないようにそれほどのn + 1に、置くことができます。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define MAXN 300010
using namespace std;
int n,T;
int a[MAXN],b[MAXN],minn[MAXN<<2],cnt[MAXN];
vector<int>pos[MAXN];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void push_up(int x){minn[x]=min(minn[ls(x)],minn[rs(x)]);}
inline void build(int x,int l,int r)
{
    if(l==r) {minn[x]=a[l];return;}
    int mid=(l+r)>>1;
    build(ls(x),l,mid);
    build(rs(x),mid+1,r);
    push_up(x);
}
inline void update(int x,int l,int r,int pos,int k)
{
    if(l==r) 
    {
        minn[x]=k;
        return;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) update(ls(x),l,mid,pos,k);
    else update(rs(x),mid+1,r,pos,k);
    push_up(x);
}
inline int query(int x,int l,int r,int ll,int rr)
{
    if(ll<=l&&r<=rr) return minn[x];
    int mid=(l+r)>>1,cur_ans=0x3f3f3f3f;
    if(ll<=mid) cur_ans=min(cur_ans,query(ls(x),l,mid,ll,rr));
    if(mid<rr) cur_ans=min(cur_ans,query(rs(x),mid+1,r,ll,rr));
    return cur_ans;
}
inline bool solve()
{
    for(int i=1;i<=n;i++)
    {
        int siz=(int)pos[b[i]].size();
        if(siz<=cnt[b[i]]) return false;
        int now=pos[b[i]][cnt[b[i]]++];
        if(query(1,1,n,1,now)<b[i]) return false;
        update(1,1,n,now,n+1);
    }
    return true;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) pos[i].clear(),cnt[i]=0;
        for(int i=1;i<=n;i++) 
        {
            scanf("%d",&a[i]);
            pos[a[i]].push_back(i);
        }
        for(int i=1;i<=n;i++) scanf("%d",&b[i]);
        build(1,1,n);
        if(solve()==true) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

Eツリー絵画

初心者の質問の意味:。どれ最大のサブツリーとサイズを見つけ、ルートのためのポイントを選ぶ
、私は少し変更されたルートDPのように感じ、再び模索する最初は、(1言う)にサブツリーのサイズをDFSルートとして、その後、あなたは戻ってきます変更のDFSルート、のような

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 200010
using namespace std;
int n,t;
int head[MAXN],siz[MAXN];
long long ans;
struct Edge{int nxt,to;}edge[MAXN<<1];
inline void add(int from,int to)
{
    edge[++t].nxt=head[from],edge[t].to=to;
    head[from]=t;
}
inline void dfs(int x,int pre)
{
    siz[x]=1;
    for(int i=head[x];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(v==pre) continue;
        dfs(v,x);
        siz[x]+=siz[v];
        // printf("[%d %d] %d\n",x,v,siz[x]);
    }
}
inline void change_root(int x,int pre,long long w)
{
    ans=max(ans,w);
    for(int i=head[x];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(v==pre) continue;
        change_root(v,x,(w-siz[v])+(n-siz[v]));
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y),add(y,x);
    }
    dfs(1,0);
    // for(int i=1;i<=n;i++)
        // printf("siz[%d]=%d\n",i,siz[i]);
    for(int i=1;i<=n;i++) ans+=siz[i];
    // printf("ans=%lld\n",ans);
    change_root(1,0,ans);
    printf("%lld\n",ans);
    return 0;
}

このチキン料理は、その後の質問は後ろ.........書き込みはありません
最初はそれをつぶやいた.......

(まあ、最後の質問は、私のレースについての感謝を提供することを目的とする場合BLUESKY007妖精qwq)

おすすめ

転載: www.cnblogs.com/fengxunling/p/11119382.html