• 济南day3


    连续几天都有点炸

    预计的分拿不到,调整好心态,考试的时候多想一下,think twice,code once

    唉,什么情况啊

    题解链接

    0+0+0

    T1读错题输出反了

    n*m%2判断是否==1

    T2

    40分暴力忘记取mod了,全炸了gg

    T3

    70分暴力输出了中间变量,然后主席树写成了区间第k小,gg

    建立10颗线段树维护前k大,因为k<=10

    总结:以后认真点.....多推一下样例,合理分配时间,多思考

    做完之后检查,最后几分钟不调新程序

    下午

    题解链接

    我可能只能口头ac了,考完后都能说出正解,就是写不来,也许不吃饭就考不好????,我好菜啊

    10+20+10

    没状态,笔记本不好用,其实T2和T3是都可以切的,但是做了T1,虽然最后想出来了,没写不出来,不值。

    T1 找环dfs瞎搞找错了,做了2h,后边没法做了

    #include<cstdio> 
    #include<vector>
    #include<cstring>
    using namespace std;
    const int maxn = 100086;
    struct node{
        int v,next;
    }edge[maxn*4];
    int head[maxn*4];
    const int mod =1e9+7;int num;
    inline void add_edge(int u,int v) {
        edge[++num].v=v;edge[num].next=head[u];head[u]=num;
    }
    inline int read() {
        int x=0,f=1;
        char c=getchar();
        while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x*f;
    }
    bool vis[maxn*2];
    int n,m;bool flag=0;
    int dfs(int u,int f) {
        int cnt=1;
        vis[u]=1;
        for(int i=head[u];i;i=edge[i].next) {
            int v=edge[i].v;
            if(v==f)continue;
            if(vis[v])flag=1;
            else cnt=(cnt+dfs(v,u))%mod; 
        }
        return cnt%mod;
    }
    int rd[maxn];
    int main () {
        n=read();m=read();
        for(int i=1;i<=m;++i) {
            int a=read(),b=read();
            add_edge(a,b);add_edge(b,a);
        }
        long long ans=1;
        for(int i=1;i<=n;++i) {
            if(!vis[i]){
                flag=0;
                int qqq=dfs(i,0)%mod;
                if(!flag)ans=(ans%mod*qqq%mod)%mod;
                else ans=(ans<<1)%mod;
            }
        }
        printf("%lld
    ",ans);
    }

    T2 想出来了正解,没时间写了,暴力写炸

    #include<cmath>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    LL n,ans,cnt;
    LL a[66],k;
    int main() {
    //    freopen("endless.in","r",stdin);
    //    freopen("endless.out","w",stdout);
        cin>>n>>k;
        LL x=n;
        while(x) {
            a[++cnt]=x%k;
            x/=k;
        }
        if(cnt%2==0) ans=pow(k,cnt/2);
        else {
            for(int i=cnt;i>=1;i--) {
                if(a[i]>0&&i%2==0) {
                    ans+=pow(k,i/2);
                    break;
                }
                if(a[i]==0&&i%2) continue;
                ans+=a[i]*pow(k,i/2);
                if(i==1&&a[i]>0) ans++;
            }
        }
        cout<<ans<<endl;
        return 0;
    }

    T3 想出来了正解,没写,暴力写炸

    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define maxn 200007
    #define LL long long
    int n,K;
    int num=0;
    int val[maxn<<2],pos[maxn<<2],fa[maxn<<2];
    int clo[maxn<<2],cle[maxn<<2],lason[maxn<<2],tot=0;
    struct node{
        int v,next;
    }edge[maxn<<1];
    int head[maxn<<1];
    LL dis[maxn<<1],tree[maxn<<1],tag[maxn<<1],ans=0;//I64d见祖宗 
    void add_edge(int u,int v){
      edge[++num].v=v;edge[num].next=head[u];head[u]=num;
    }
    void dfs(int rt) {
        clo[rt]=++tot;cle[tot]=rt;
        for(int i=head[rt];i;i=edge[i].next) {
            if(edge[i].v==fa[rt]) continue;
            fa[edge[i].v]=rt;dis[edge[i].v]=dis[rt]+(LL)val[edge[i].v];
            dfs(edge[i].v);
        }
        lason[rt]=tot;
    }
    void merge(int l,int r,int rt) {
        tree[rt]=tree[rt<<1];pos[rt]=pos[rt<<1];
        if(tree[rt] < tree[rt<<1|1]) tree[rt]=tree[rt<<1|1],pos[rt]=pos[rt<<1|1];
        return ;
    }
    void pushdown(int rt) {
        if(!tag[rt]) return ;
        tag[rt<<1]+=tag[rt];tag[rt<<1|1]+=tag[rt];
        tree[rt<<1]-=tag[rt];tree[rt<<1|1]-=tag[rt];
        tag[rt]=0;return ;
    }
    void build(int l,int r,int rt) {
        if(l==r) {
            tree[rt]=dis[cle[r]];
            pos[rt]=cle[r];return ;
        }
        int mid=(l+r)>>1;
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
        merge(l,r,rt);
    }
    void update(int l,int r,int rt,int ll,int rr,int c) {
        if(ll<=l&& r<=rr) {
            tree[rt]-=(LL)c;tag[rt]+=(LL)c;return ;
        }
        pushdown(rt);
        int mid=(l+r)>>1;
        if(ll<=mid) update(l,mid,rt<<1,ll,rr,c);
        if(rr>mid) update(mid+1,r,rt<<1|1,ll,rr,c);
        merge(l,r,rt);
    }
    int main() {
        //freopen("tour.in","r",stdin);
        //freopen("tour.out","w",stdout);
        int u,v,now;
        scanf("%d%d",&n,&K);
        for(int i=1;i<=n;i++) scanf("%d",val+i);
        for(int i=1;i<n;i++)
            scanf("%d%d",&u,&v),add_edge(u,v),add_edge(v,u);
        dis[1]=val[1];
        dfs(1);
        build(1,n,1);
        while(K--) {
            if(!tree[1]) break;
            ans+=tree[1];now=pos[1];
            while(val[now]) {
                update(1,n,1,clo[now],lason[now],val[now]);val[now]=0;now=fa[now];
            }
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    ibatis学习笔记
    记ibatis使用动态列查询问题(remapresults)
    jQuery(九)、ajax对象操作
    jQuery(八)、ajax
    jQuery(七)、效果和动画
    jQuery(六)、事件
    jQuery(五)、筛选
    jQuery(四)、文档处理
    jQuery(三)、属性、CSS
    jQuery(二)、选择器
  • 原文地址:https://www.cnblogs.com/sssy/p/7753810.html
Copyright © 2020-2023  润新知