zoukankan      html  css  js  c++  java
  • 阶段总结

    最近因发现基础不好而狂刷板子,导致bzoj的计划放了一段时间。现在板子搞得差不多了,还剩一个90分的负环和70分的树刨搞不出来,就很慌,希望大家帮我调一下,都是T了。

    接下来重心放到bzoj去,按照hzwer的顺序吧。

    下面放代码:

    90分负环:

    // luogu-judger-enable-o2
    #include <cstdio>
    #include <cmath>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <iomanip>
    #include <iostream> 
    using namespace std ; 
    
    const int maxn = 200011,maxm = 200011,inf = 1e9 ; 
    struct node{
        int to,val,pre ; 
    }e[2*maxm];
    int T,n,m,x,y,val,cnt ; 
    int head[maxn],dist[maxn] ; 
    bool flag ; 
    bool vis[maxn] ; 
    
    inline void addedge(int x,int y,int v) 
    {
        e[++cnt] = (node){ y,v,head[x] } ; 
        head[ x ] = cnt ; 
    }
    
    inline int read() 
    {
        char ch = getchar() ; 
        int x = 0 , f = 1 ; 
        while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ;  } 
        while(ch>='0'&&ch<='9') { x = x*10+ch-48 ; ch = getchar() ; } 
        return x*f ; 
    }
    
    inline void SPFA(int u) 
    {
        int v ; 
        vis[ u ] = 1 ; 
        for(int i=head[u];i;i = e[ i ].pre ) 
        {
            v = e[ i ].to ; 
            if( dist[ u ] + e[ i ].val < dist[ v ] ) 
            {
                dist[ v ] = dist[ u ] + e[ i ].val ; 
                if(vis[ v ]||flag) 
                {
                    flag = 1 ;  
                    break ; 
                }
                SPFA( v ) ; 
             }
        }    
        vis[ u ] = 0 ; 
    }
    
    int main()  
    {
        T = read() ;  
        while(T--) 
        {
            flag = 0 ; 
            cnt = 0 ; 
            n = read() ; m = read() ;  
            for(int i=1;i<=n;i++) dist[ i ] = 0,vis[ i ] = 0,head[ i ] = 0 ;    //0
            for(int i=1;i<=m;i++) 
            {
                scanf("%d%d%d",&x,&y,&val) ; 
                addedge(x,y,val) ; 
                if(val>=0) addedge(y,x,val) ;  
            }
            for(int i=1;i<=n;i++) 
            {
                SPFA( i ) ; 
                if(flag) break ; 
            } 
            if(flag) 
                printf("YE5
    ") ;  
            else 
                printf("N0
    ") ; 
                
        }
        return 0 ; 
    }

    70分树刨:

    // luogu-judger-enable-o2
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    const int INF = 1 << 30;
    const int N = 200005;
    typedef long long ll;
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    struct edge
    {
        int nxt,r;
    } e[4 * N];
    int n,m,r,cnt;
    int a[N],lst[N],p;
    int f[N],d[N],siz[N],son[N],rk[N];
    int top[N],id[N],tree[4 * N];
    int lazy[4 * N],len = 0;
    //id新编号dfs序
    void add(int x,int y)
    {
        e[++len].nxt = lst[x];
        e[len].r = y;
        lst[x] = len;
    }
    
    void dfs1(int u,int fa,int depth)
    {
        f[u] = fa;
        d[u] = depth;
        siz[u] = 1;
        for(int k = lst[u];k;k = e[k].nxt)
        {
            int y = e[k].r;
            if(y == fa)
                continue;
            dfs1(y,u,depth + 1);
            siz[u] += siz[y];
            if(siz[y] > siz[son[u]] || !son[u])
            {
                son[u] = y;
            }
        }
    }
    
    void dfs2(int u,int t)
    {
        top[u] = t;
        id[u] = ++cnt;
        rk[cnt] = u;
        if(!son[u])
            return;
        dfs2(son[u],t);
        for(int k = lst[u];k;k = e[k].nxt)
        {
            int y = e[k].r;
            if(y != son[u] && y != f[u])
                dfs2(y,y);
        }
    }
    
    void push_down(int o,int l,int r)
    {
        if(lazy[o])
        {
            lazy[o << 1] += lazy[o];
            lazy[o << 1] %= p;
            lazy[o << 1 | 1] += lazy[o];
            lazy[o << 1 | 1] %= p;
            int len = (r - l + 1);
            tree[o << 1] += lazy[o] * (len - (len >> 1));
            tree[o << 1 | 1] += lazy[o] * (len >> 1);
            tree[o << 1] %= p;
            tree[o << 1 | 1] %= p;
            lazy[o] = 0;
        }
    }
    
    void build(int o,int l,int r)
    {
        if(l == r)
        {
            tree[o] = a[rk[l]];
            tree[o] %= p;
            return;
        }
        int mid = (l + r) >> 1;
        build(o << 1,l,mid);
        build(o << 1 | 1,mid + 1,r);
        tree[o] = tree[o << 1] + tree[o << 1 | 1];
        tree[o] %= p;
    }
    
    void up_num(int o,int l,int r,int x,int y,int w)
    {
        if(l == x && r == y)
        {
            tree[o] += w * (l - r + 1);
            tree[o] %= p;
            lazy[o] += w;
            lazy[o] %= p;
            return;
        }
        push_down(o,l,r);
        int mid = (l + r) >> 1;
        if(mid < x)
            up_num(o << 1 | 1,mid + 1,r,x,y,w);
        else if(mid >= y)
            up_num(o << 1,l,mid,x,y,w);
        else
        {
            up_num(o << 1,l,mid,x,mid,w);
            up_num(o << 1 | 1,mid + 1,r,mid + 1,y,w);
        }
        tree[o] = tree[o << 1] + tree[o << 1 | 1];
        tree[o] %= p;
    }
    
    int query(int o,int l,int r,int x,int y)
    {
        if(l == r && x == y)
        {
            return tree[o];
        }
        push_down(o,l,r);
        int mid = (l + r) >> 1;
        if(mid >= y)
            return query(o << 1,l,mid,x,y);
        else if(mid < x)
            return query(o << 1 | 1,mid + 1,r,x,y);
        else
        {
            return (query(o << 1,l,mid,x,mid) + query(o << 1 | 1,mid + 1,r,mid + 1,y)) % p;
        }
    }
    
    int pathquery(int x,int y)
    {
        int ans = 0;
        while(top[x] != top[y])
        {
            if(d[top[x]] < d[top[y]])
                swap(x,y);
            ans += query(1,1,n,id[top[x]],id[x]);
            ans %= p;
            x = f[top[x]];
        }
        if(d[x] > d[y])
        swap(x,y);
        ans += query(1,1,n,id[x],id[y]);
        ans %= p;
        return ans;
    }
    
    void pathupdate(int x,int y,int c)
    {
        // int fx = top[x],fy = top[y];
        while(top[x] != top[y])
        {
            if(d[top[x]] < d[top[y]])
            swap(x,y);
            up_num(1,1,n,id[top[x]],id[x],c);
            x = f[top[x]];
            // update(id[x])
        }
        if(d[x] > d[y])
        swap(x,y);
        up_num(1,1,n,id[x],id[y],c);
    }
    int main()
    {
        read(n);read(m);read(r);read(p);
        duke(i,1,n)
        read(a[i]);
        duke(i,1,n - 1)
        {
            int x,y;
            read(x);read(y);
            add(x,y);
            add(y,x);
        }
        cnt = 0;
        dfs1(r,0,1);
        dfs2(r,r);
        cnt = 0;
        build(1,1,n);
        duke(i,1,m)
        {
            int op,x,y,z;
            read(op);
            if(op == 1)
            {
                read(x);read(y);read(z);
                pathupdate(x,y,z);
            }
            else if(op == 2)
            {
                read(x);read(y);
                printf("%d
    ",pathquery(x,y));
            }
            else if(op == 3)
            {
                read(x);read(z);
    //            cout<<x<<endl;
                up_num(1,1,n,id[x],id[x] + siz[x] - 1,z);
            }
            else
            {
                read(x);
                printf("%d
    ",query(1,1,n,id[x],id[x] + siz[x] - 1));
            }
        }
        return 0;
    }
    /*
    5 5 2 24
    7 3 7 8 0
    1 2
    1 5
    3 1
    4 1
    3 4 2
    3 2 2
    4 5
    1 5 1 3
    2 1 3
    */

    有人帮我debug吗?

  • 相关阅读:
    使用servletContext和类加载器加载文件
    servletConfig和servletContext的应用
    java中的正则表达式(一)
    servlet的生命周期
    servlet的基本原理
    java中类加载机制
    java中的动态代理(三)
    Navicat Premium 连接Oracle 数据库
    使用SqlServer2005 Service Broker 和 SqlDependency类提供数据更改的通知
    WebService简单使用
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9693778.html
Copyright © 2011-2022 走看看