zoukankan      html  css  js  c++  java
  • BZOJ3498 : PA2009 Cakes

    令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点

    设d[x]表示从x连出的边的条数

    从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i)

    如果$d[x]leqsqrt{m}$,则依次判断与x相连的边(x,y)(y<x)中的y是否与i相连

    否则,依次判断与i相连的边(i,y)(y<x)中的y是否与x相连

    用Hash表支持$O(1)$询问

    时间复杂度$O(msqrt{m})$

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=100010,M=250010,B=(1<<23)-1,BUF=5000000;
    struct edge{int v;edge*nxt;}epool[M],*ecur=epool,*g[N],*j,*k;
    struct Edge{int x,y;Edge*nxt;}Epool[M],*Ecur=Epool,*G[B+1],*l;
    int n,m,i,a[N],d[N],x,y,lim,hash;long long ans;char Buf[BUF],*buf=Buf;pair<int,int>e[M];
    inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
    inline int vis(int x,int y){for(l=G[(x<<8|y)&B];l;l=l->nxt)if(l->x==x&&l->y==y)return 1;return 0;}
    int main(){
      fread(Buf,1,BUF,stdin),read(n),read(m);
      while(lim*lim<m)lim++;
      for(i=1;i<=n;i++)read(a[i]);
      for(i=0;i<m;i++){
        read(x),read(y);
        if(x<y)swap(x,y);
        e[i].first=x,e[i].second=y;
      }
      for(sort(e,e+m),i=0;i<m;i++){
        d[x=e[i].first]++;
        ecur->v=y=e[i].second;ecur->nxt=g[x];g[x]=ecur++;
        Ecur->x=x;Ecur->y=y;Ecur->nxt=G[hash=(x<<8|y)&B];G[hash]=Ecur++;
      }
      for(i=3;i<=n;i++)for(j=g[i];j;j=j->nxt){
        y=a[i]>a[x=j->v]?a[i]:a[x];
        if(d[x]<=lim){for(k=g[x];k;k=k->nxt)if(vis(i,k->v))ans+=y>a[k->v]?y:a[k->v];}
        else for(k=j->nxt;k;k=k->nxt)if(vis(x,k->v))ans+=y>a[k->v]?y:a[k->v];
      }
      return printf("%lld",ans),0;
    }
    

      

  • 相关阅读:
    msyql多个or,and,
    mysql中 where in 用法详解
    history.back(-1)和history.go(-1)的区别
    经典 mysql 28道题
    企业案例(二):增量恢复案例
    企业案例(一):由于mysql sleep线程过多小故障
    mysql数据库恢复
    binlog介绍
    mysql 数据库备份
    docker入门与实践
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403138.html
Copyright © 2011-2022 走看看