zoukankan      html  css  js  c++  java
  • 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解:

    喵哈哈村的魔力源泉(1)

    题解:签到题。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        long long a,b,c;
        while(cin>>a>>b>>c){
            cout<<a*b%c<<endl;
        }
    }
    

    喵哈哈村的魔力源泉(2)

    题解:首先快速幂是来处理次方的问题,那么我们模仿快速幂,写一个快速加即可,这样我们每次乘以2,就不会爆longlong了

    代码:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <vector>
    
    using namespace std;
    long long a,b,p;
    long long ksj(long long a,long long b)
    {
        if(b==0)return 0;
        if(b==1)return a%p;
        long long sb=ksj(a,b/2);
        sb=(sb+sb)%p;
        if(b&1)
            return (sb+a)%p;
        else
            return sb;
    }
    void read_in()
    {
        while(scanf("%lld%lld%lld",&a,&b,&p)!=EOF){
            cout<<ksj(a,b)<<endl;
        }
    }
    int main()
    {
        read_in();
        return 0;
    }
    

    喵哈哈村的魔法源泉(3)

    题解:答案实际上就是树的直径的一半,关于树的直径,这个自己百度吧~

    代码:

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=200050;
    vector<int> son[maxn],w[maxn];
    bool vis[maxn];
    int f[maxn];
    int bfs(int root)
    {
    int i,j,k;
    int ans=root,maxx=0;
    queue<int> q;
    memset(vis,0,sizeof(vis));
    memset(f,0,sizeof(f));
    q.push(root);
    vis[root]=1;f[root]=0;
    while(!q.empty())
    {
        root=q.front();
        q.pop();
        for(i=0;i<son[root].size();i++)//À©Õ¹Â·¾¶ 
        {
            if(vis[son[root][i]]==0)//È¥ÖØ 
            {
                q.push(son[root][i]);
                vis[son[root][i]]=1;
                f[son[root][i]]=f[root]+w[root][i];
                if(maxx<f[son[root][i]])
                {
                    maxx=f[son[root][i]];
                    ans=son[root][i];//ansÊÇÄ¿Ç°¾àÀëROOT×îÔ¶µÄ½Úµã¡£ 
                }
            }
        }
    }
    return ans;  
    }
    int solve(int root)
    {
    int u,v;
    u=bfs(root);
    v=bfs(u);
    return f[v];
    }
    
    int main()
    {
        int i,j,k,n,m;
        int x1,x2,l,u;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            son[i].clear();
            w[i].clear();
        }
        for(i=0;i<n-1;i++)
        {
        scanf("%d%d%d",&x1,&x2,&l);
        son[x1].push_back(x2);w[x1].push_back(l);
        son[x2].push_back(x1);w[x2].push_back(l);
        }
        double ans=solve(1)/2.0;
        printf("%0.1f
    ",ans);
        return 0;
    }
    

    喵哈哈村的魔力源泉(4)

    题解:单调队列优化的dp,这儿有个链接比我讲得清楚。。。

    http://blog.csdn.net/oiljt12138/article/details/51174560

    代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    struct node
    {
        long long s;
        int n;
    }q[1000010];
    int a,n,m;
    long long s[1000010],ans;
    int h,t;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
        scanf("%d",&a);
        s[i]=a+s[i-1];
        }
        q[0].s=0;q[0].n=0;
        for(int i=1;i<=n;i++)
        {
        long long r=s[i];
        r-=q[t].s;
        ans=max(ans,r);
        while(t<=h&&q[h].s>s[i])h--;
        q[++h].s=s[i];
        q[h].n=i;
        while(q[t].n<=i-m)t++;
        }
        cout<<ans;
        return 0;
    }
    

    喵哈哈村的魔力源泉(5)

    题解:类似two pointer去做,维护最小边,然后去枚举最大边。用带权并查集去维护每个集合的边的信息,如果所有点都大于等于了k,那么就输出答案即可。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    
    #define maxlongint 2147483647
    #define pb push_back
    #define mp make_pair
    #define LL long long
    
    using namespace std;
    
    struct dwell
    {
        int a,b;
        LL w;
    } key[5010];
    
    struct bz
    {
        int where,cnt;
    } fa[1010];
    
    LL like[1010];
    LL k;
    int n,m;
    
    
    bool cmp(dwell A,dwell B)
    {
        return A.w<B.w;
    }
    
    int Findset(int x)
    {
        if(fa[x].where==x)return x;else return Findset(fa[x].where);
    }
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)scanf("%I64d",&like[i]);
        for(int i=1;i<=m;i++)
            scanf("%d%d%I64d",&key[i].a,&key[i].b,&key[i].w);
        sort(key+1,key+m+1,cmp);
        key[0].a=0;key[0].b=0;key[0].w=-100000000;
        key[m+1].a=0;key[m+1].b=0;key[m+1].w=-100000000;
        LL Minhz=-1,Maxhz=key[m].w+1,ans=0;
        for(int i=1;i<=m;i++)
            if(key[i].w!=key[i-1].w)
            {
                for(int j=1;j<=n;j++)
                {
                    fa[j].where=j;
                    fa[j].cnt=1;
                }
                int j=i;
                LL ans0=like[1]*n;
                while(j<=m)
                {
                    if(key[j].w-key[i].w>=Maxhz-Minhz)break;
                    int j0=j;
                    while(key[j0].w==key[j].w)j0++;
                    for(int x=j;x<j0;x++)
                    {
                        int s1=Findset(key[x].a),s2=Findset(key[x].b);
                        if(s1!=s2)
                        {
                            int X0=fa[s1].cnt,Y0=fa[s2].cnt;
                            ans0+=(like[X0+Y0]-like[X0]-like[Y0]);
                            fa[s1].cnt=X0+Y0;
                            fa[s2].cnt=X0+Y0;
                            if(s1>s2)fa[s1].where=s2;else fa[s2].where=s1;
                            if((ans0>=k)&&((Maxhz-Minhz>key[j].w-key[i].w)||(ans<k)))
                            {
                                ans=ans0;
                                Maxhz=key[j].w;
                                Minhz=key[i].w;
                            }
                        }
                    }
                    j=j0;
                }
            }
        if(ans>=k)
            printf("%lld
    ",Maxhz-Minhz);
        else
            printf("T_T
    ");
    //    system("pause");
        return 0;
    }
  • 相关阅读:
    在 Eclipse Workbench 之外使用 Eclipse GUI
    GB2312,GBK,Unicode
    木偶一之推荐系统
    Matlab:任意矩阵计算分布密度(海明距离的分布密度)
    live555在arm linux下的交叉编译,并下载的Arm板播放H264文件
    java设计模式之原型模式
    HDU 1102
    poj3661另一种做法(滚动数组)
    基于QT的小游戏细菌病毒战
    某代码查看器的保护突破
  • 原文地址:https://www.cnblogs.com/qscqesze/p/6831153.html
Copyright © 2011-2022 走看看