zoukankan      html  css  js  c++  java
  • Summer training round2 #3

    A!:                    GTY系列题

    B!:莫队加分块  GTY系列题

    C!:线段树模拟拓扑排序
    (
    把普通的拓扑排序的栈操作改成线段树区间减一,查询区间最右侧的0的位置即可。注意一开始就删除的边,在区间减后要单点加回来 然后当前的点处理完后,要把其置成无穷大)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define N 100010
    int T,n,m,minv[N<<2],delta[N<<2];
    void pushdown(int rt)//将rt结点的懒惰标记下传
    {
        if(delta[rt])
          {
            delta[rt<<1]+=delta[rt];//标记下传到左结点
            delta[rt<<1|1]+=delta[rt];//标记下传到右结点
            minv[rt<<1]+=delta[rt];
            minv[rt<<1|1]+=delta[rt];
            delta[rt]=0;//清除rt结点的标记,下传完成
          }
    }
    void update(int ql,int qr,int v,int rt,int l,int r)
    {
        if(ql<=l&&r<=qr)
          {
            delta[rt]+=v;//更新当前结点的标记值
            minv[rt]+=v;
            return ;
          }
        pushdown(rt);//将该节点的标记下传到孩子们
        int m=(l+r>>1);
        if(ql<=m) update(ql,qr,v,rt<<1,l,m);
        if(m<qr) update(ql,qr,v,rt<<1|1,m+1,r);
        minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
    }
    int query(int rt,int l,int r)
    {
        if(l==r)
          return l;
        int m=(l+r>>1);
        pushdown(rt);
        if(minv[rt<<1|1]==0) return query(rt<<1|1,m+1,r);
        else return query(rt<<1,l,m);
    }
    int first[N],e,next[N],v[N];
    void AddEdge(int U,int V)
    {
        v[++e]=V;
        next[e]=first[U];
        first[U]=e;
    }
    int del[N];
    int main()
    {
        int x,y;
        scanf("%d",&T);
        for(;T;--T)
          {
            e=0;
            memset(minv,0,sizeof(minv));
            memset(delta,0,sizeof(delta));
            memset(first,0,sizeof(first));
            memset(next,0,sizeof(next));
            memset(del,0,sizeof(del));
            memset(v,0,sizeof(v));
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;++i)
              {
                scanf("%d%d",&x,&y);
                AddEdge(x,y);
                ++del[y];
              }
            for(int i=1;i<=n;++i)
              update(i,i,i-1-del[i],1,1,n);
            for(int i=1;i<=n;++i)
              {
                int U=query(1,1,n);
                printf("%d%c",U,i==n ? '
    ' : ' ');
                update(U,U,n+1,1,1,n);
                update(U+1,n,-1,1,1,n);
                for(int j=first[U];j;j=next[j])
                  update(v[j],v[j],1,1,1,n);
              }
          }
        return 0;
    }
    View Code

    D!:求最短路树

    E:打表找规律

    F:统计奇偶个数 快速幂

    G:数形结合找规律

    I:二进制

    J:找规律 暴力

    K:区间DP(贪心)

    L:构造

  • 相关阅读:
    安卓使用socket建立通信客户端不显示数据
    使用bmob后端云中listview如何实现数据显示在第一个item
    安卓如何实现点击一个按钮退出整个程序?
    Python安装与准备
    敏感度——区分平庸和伟大
    fragment中设置点击事件(onclick)使用intent进行通信
    listview的几种简单用法
    Android开发现在是不是该学?
    数据包重放
    Sql注入一种dump所有数据的方法
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7282509.html
Copyright © 2011-2022 走看看