2020hdu多校2

hdu6772

题目
暴力优化题
前向星 瞎搞搞

#include <bits/stdc++.h>

using namespace std;
int n,k;
typedef struct node
{
    int a,b,c,d;
    int next;
}node;
node no[55];
int head[55]={0};
int index[55]={0};
int T;
int cnt;
int ans;
int bns;
int cns;
int dns;
int res;
long long max_;
void dfs(int dep)
{
    if(dep==res)
    {
        long long ssss=(long long)ans*bns*cns*dns;
        if(ssss>max_)
            max_=ssss;
        return;
    }
    for(int i=head[index[dep]];i;i=no[i].next)
    {
        ans+=no[i].a;
        bns+=no[i].b;
        cns+=no[i].c;
        dns+=no[i].d;
        dfs(dep+1);
        ans-=no[i].a;
        bns-=no[i].b;
        cns-=no[i].c;
        dns-=no[i].d;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--)
    {
        memset(head,0,sizeof(head));
        cnt=1;
        max_=0;
        ans=100;
        bns=100;
        cns=dns=100;
        res=0;
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            int t,a,b,c,d;
            cin>>t>>a>>b>>c>>d;
            no[cnt].a=a;
            no[cnt].b=b;
            no[cnt].c=c;
            no[cnt].d=d;
            no[cnt].next=head[t];
            head[t]=cnt;
            cnt++;
        }
        for(int i=0;i<55;i++)
        {
            if(head[i]!=0)
            {
                index[res++]=i;
            }
        }
        dfs(0);
        cout<<max_<<endl;
    }
    return 0;
}

hdu6763
铁索连环点连环
把大点先入,小点后入并查集优化求贡献
题目

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const int maxn=1e5+5;
const int maxm=2e5+5;
int n,m;
int fa[maxn];
int head[maxn];
int b[maxn];
int inde[maxn];
int vis[maxn];
int cnt;
int find(int x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct edge
{
    int v,next;
};
edge no[maxm*2];
ll ans=0;
void init()
{
    cnt=1;
    ans=0;
    for(int i=1;i<=n;i++)
    {
        head[i]=0;
        inde[i]=i;
        fa[i]=i;
        vis[i]=0;
    }
}
void add(int x,int y)
{
    no[cnt].v=y;
    no[cnt].next=head[x];
    head[x]=cnt;
    cnt++;
}
bool cmp(int aa,int bb)
{
    return b[aa]>b[bb];
}
void solve()
{
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        ans+=b[i];
    }
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    sort(inde+1,inde+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        vis[inde[i]]=1;
        int u=inde[i];
        for(int j=head[u];j;j=no[j].next)
        {
            int v=no[j].v;
            if(!vis[v])
                continue;
            int fax=find(u);
            int fay=find(v);
            if(fax!=fay)
            {
                ans-=b[u];
                fa[fax]=fay;
            }
        }
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)
    {
        cin>>n>>m;
        init();
        solve();
    }
    return 0;
}

hdu6768
题目
因为求出那个什么A B C 再搞i 虽然他会爆 ll 但是对 i 没有影响

#include <iostream>

using namespace std;
long long f[2000001];
long long A,B,C;
long long read()
{
    long long res=0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(x==0)
            continue;
        res=res+f[i];
    }
    return res;
}
int main()
{
    f[0]=1;
    f[1]=1;
    for(int i=2;i<2000001;i++)
        f[i]=f[i-1]+f[i-2];
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        A=read();
        B=read();
        C=read();
        A=A*B;
        for(int i=1;;i++)
        {
            if(C+f[i]==A)
            {
                cout<<i<<"\n";
                break;
            }
        }
    }
    return 0;
}

hdu6774
题目
正常的s,t 最长子序列是
i j
if(s[i]==t[j]) c[i][j]=c[i-1][j-1]+1;
else c[i][j]=max(c[i-1][j],c[i][j-1]);
o(nm)
这题有q会t
所以先预处理那个 g[i][j] 表示第i(包括i) 及以后的第一次出现 j的位置
然后 f[i][j]表示那个什么t的 前i位 匹配了j个序列的最小位置
if(f[i+1][j]<f[i][j])
f[i+1][j]=f[i][j];
if(f[i][j]<r) ///在r前找的到
{
f[i+1][j+1]=g[f[i][j]+1][t[i]-‘a’];///t 从0开始
}

#include <iostream>

using namespace std;
string s,t;
int n,m;
int g[100005][26];
int T;
int f[25][25];
int qiu(int l,int r)
{
    for(int i=0;i<=m;i++)
    {
        for(int j=0;j<=i;j++)
        {
            f[i][j]=n+1;
        }
    }
    f[0][0]=l-1;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(f[i+1][j]>f[i][j])
                f[i+1][j]=f[i][j];
            if(f[i][j]<n+1)
            {
                f[i+1][j+1]=g[f[i][j]+1][t[i]-'a'];
            }
        }
    }
    for(int i=m;i>=1;i--)
    {
        for(int j=m;j>=i;j--)
        {
            if(f[j][i]<=r)
                return i;
        }
    }
    return 0;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--)
    {
        cin>>s>>t;
        n=s.size();
        m=t.size();
        for(int i=0;i<26;i++)
        {
            g[n+1][i]=n+1;
        }
        for(int i=n;i>0;i--)
        {
            for(int j=0;j<26;j++)
            {
                g[i][j]=g[i+1][j];
            }
            g[i][s[i-1]-'a']=i;
        }
        int q;
        cin>>q;
        while(q--)
        {
            int l,r;
            cin>>l>>r;
            cout<<r-l+1+m-2*qiu(l,r)<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值