长乐集训 Day9

· · 个人记录

A.kobe

题意

Solution

Code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!('0'<=ch&&ch<='9')) (ch=='-')?flag=-1:1,ch=getchar();
    while('0'<=ch&&ch<='9') res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
int a[100],b[100];
int dp[100][1610];
int main(int argc,const char *argv[])
{
    freopen("kobe.in","r",stdin);
    freopen("kobe.out","w",stdout);
    int n=read(),sum=0;
    for(int i=1;i<=n;i++)
        a[i]=read(),sum+=a[i];
    for(int i=1;i<=n;i++)
        b[i]=read();
    memset(dp,128,sizeof dp);
    //cout<<dp[0][0];
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=i;j>=1;j--)
            for(int k=b[i];k<=1600;k++)
                dp[j][k]=std::max(dp[j][k],dp[j-1][k-b[i]]+a[i]);
    for(int i=1;i<=n;i++)
        for(int j=1600;j>=0;j--)
            dp[i][j]=std::max(dp[i][j],dp[i][j+1]);
    int q=read();
    for(int i=1;i<=q;i++)
    {
        int k=read();
        if(k<n)
            printf("%d\n",dp[k][sum]<0?-1:sum-dp[k][sum]);
        if(k==n)
            printf("0\n");
        if(k>n)
            printf("-1\n");
    }
    return 0;
}

B.habibi

题意

Solution

Code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!('0'<=ch&&ch<='9')) (ch=='-')?flag=-1:1,ch=getchar();
    while('0'<=ch&&ch<='9') res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
struct edge
{
    int to,nxt;
};
int n,m,q,tot;
bool check[30][30];
int val[200010];
int head[200010];
int las[200010][30];
int query[2000010];
struct edge ed[400010];
void add_edge(int fr,int to)
{
    ed[++tot]=(edge){to,head[fr]};
    head[fr]=tot;
    return ;
}
void init(int fr,int fa)
{
    for(int i=1;i<=m;i++)
    {
        if(check[i][val[fr]]==true)
            las[fr][i]=las[fa][i];
        else
            las[fr][i]=fr;
    }
    for(int i=head[fr];i!=0;i=ed[i].nxt)
    {
        if(ed[i].to==fa)
            continue;
        init(ed[i].to,fr);
    }
    return ;
}
int main(int argc,const char *argv[])
{
    freopen("habibi.in","r",stdin);
    freopen("habibi.out","w",stdout);
    n=read(),m=read(),q=read();
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
            check[i][j]=read();
    for(int i=1;i<=n;i++)
        val[i]=read();
    for(int i=1;i<n;i++)
    {
        int fr=read(),to=read();
        add_edge(fr,to);
        add_edge(to,fr);
    }
    init(1,0);
    for(int i=1;i<=q;i++)
    {
        int k=read(),pos=read();
        for(int j=1;j<=k;j++)
            query[j]=read();
        for(int j=k;j>=1;j--)
        {
            pos=las[pos][query[j]];
            if(pos==0)
                break;
        }
        putchar(pos==0?'1':'0');
        putchar('\n');
    }
    return 0;
}

C.escape

题意

Solution

Code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!('0'<=ch&&ch<='9')) (ch=='-')?flag=-1:1,ch=getchar();
    while('0'<=ch&&ch<='9') res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
const long long mod=998244353;
const long long inv=499122177;
#define mod(a) a>mod?a-mod:a
struct edge
{
    int to,nxt;
};
int n,k,tot;
int head[5010],val[5010];
int dp[5010][5010];
struct edge ed[10010];
void add_edge(int fr,int to)
{
    ed[++tot]=(edge){to,head[fr]};
    head[fr]=tot;
    return ;
}
long long quick(long long a,long long b)
{
    long long res=1;
    while(b!=0)
    {
        if(b&1==true)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void solve(int fr,int fa)
{
    for(int i=head[fr];i!=0;i=ed[i].nxt)
    {
        int to=ed[i].to;
        if(to==fa)
            continue;
        for(int j=val[to];j<=k;j++)
            dp[to][j]=1ll*dp[fr][j-val[to]]*inv%mod;
        solve(to,fr);
        for(int j=0;j<=k;j++)
            dp[fr][j]=mod(1ll*dp[fr][j]*inv%mod+dp[to][j]%mod);
    }
    return ;
} 
int main(int argc,const char *argv[])
{
    freopen("escape.in","r",stdin);
    freopen("escape.out","w",stdout);
    n=read(),k=read();
    for(int i=1;i<=n;i++)
        val[i]=read();
    for(int i=1;i<n;i++)
    {
        int fr=read(),to=read();
        add_edge(fr,to);
        add_edge(to,fr);
    }
    dp[1][val[1]]=val[1]<=k?1:0;
    solve(1,0);
    printf("%lld",dp[1][k]);
    return 0;
}

D.kaoyapp

题意

Solution

Code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!('0'<=ch&&ch<='9')) (ch=='-')?flag=-1:1,ch=getchar();
    while('0'<=ch&&ch<='9') res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
inline string Read()
{
    string res="";
    char ch=getchar();
    while(!('0'<=ch&&ch<='9'))
        ch=getchar();
    while('0'<=ch&&ch<='9')
        res=res+ch,ch=getchar();
    return res;
}
struct node
{
    bool end;
    int son[10];
};
int tot=1,root=1;
int fa[8000010];
struct node nd[8000010];
char s[8000010],t[8000010];
int get(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=get(fa[x]);
}
void insert()
{
    int pos=root;
    for(int i=0;i<strlen(s);i++)
    {
        int &nxt=nd[pos].son[s[i]-'0'];
        if(nxt==0)
            nxt=++tot,fa[tot]=tot;
        //cerr<<"insert:"<<pos<<" "<<s[i]-'0'<<" "<<get(nxt)<<endl;
        pos=get(nxt);
    }
    nd[pos].end=true;
    return ;
}
bool query()
{
    int pos=root;
    for(int i=0;i<strlen(s);i++)
    {
        if(pos==0)
            return false;
        pos=get(nd[pos].son[s[i]-'0']);
    }
    return nd[pos].end;
}
int find(char *s)
{
    int pos=root;
    for(int i=0;i<strlen(s);i++)
    {
        int &nxt=nd[pos].son[s[i]-'0'];
        if(nxt==0)
            nxt=++tot,fa[tot]=tot;
        pos=get(nxt);
    }
    return pos;
}
void merge(int &a,int &b,bool flag)
{
    a=get(a),b=get(b);
    //cerr<<a<<" "<<b<<endl;
    if(a==b)
        return ;
    fa[b]=a;
    nd[a].end|=nd[b].end;
    for(int i=0;i<=9;i++)
    {
        if(nd[a].son[i]==0||nd[b].son[i]==0)
        {
            nd[a].son[i]=nd[a].son[i]+nd[b].son[i];
            continue ;
        }
        merge(nd[a].son[i],nd[b].son[i],false);
        a=get(a);
    }
    return ;
}
int main(int argc,const char *argv[])
{
    freopen("kaoyapp.in","r",stdin);
    freopen("kaoyapp.out","w",stdout);
    int q=read();
    fa[1]=1;
    for(int i=1;i<=q;i++)
    {
        int opt=read();
        scanf("%s",s);
        if(opt==1)
            insert();
        if(opt==2)
            putchar(query()?'1':'0'),putchar('\n');
        if(opt==3)
        {
            scanf("%s",t);
            int a=find(s);
            int b=find(t);
        //  cerr<<"solve"<<a<<" "<<b<<endl;
            merge(a,b,true);
        }
    }
    return 0;
}