zoukankan      html  css  js  c++  java
  • 2018 Multi-University Training Contest 3

    题解:

    solution

    Code:

    A. Ascending Rating

    #include<cstdio>
    const int N=10000010;
    int T,n,m,k,P,Q,R,MOD,i,a[N],q[N],h,t;long long A,B;
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d%d%d%d%d%d",&n,&m,&k,&P,&Q,&R,&MOD);
        for(i=1;i<=k;i++)scanf("%d",&a[i]);
        for(i=k+1;i<=n;i++)a[i]=(1LL*P*a[i-1]+1LL*Q*i+R)%MOD;
        for(h=1,t=A=B=0,i=n;i;i--){
          while(h<=t&&a[q[t]]<=a[i])t--;
          q[++t]=i;
          if(i+m-1<=n){
            while(q[h]>=i+m)h++;
            A+=i^a[q[h]];
            B+=i^(t-h+1);
          }
        }
        printf("%lld %lld
    ",A,B);
      }
    }
    

      

    B. Cut The String

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N=100010,S=26;
    int T,n,m,i,j,len,x,y,ca,cb,ans;char s[N];
    struct AP{
      int s,d,r,f;
      //k*d+s 0<=k<=r
      AP(){}
      AP(int _s,int _d,int _r,int _f){s=_s,d=_d,r=_r,f=_f;}
    }a[N],b[N];
    struct DS{
      int all,son[N][S],fail[N],len[N],diff[N],top[N],text[N],last,tot,f[N];
      int newnode(int l){
        for(int i=0;i<S;i++)son[tot][i]=0;
        fail[tot]=diff[tot]=top[tot]=0,len[tot]=l;
        return tot++;
      }
      void init(){
        last=tot=all=0;
        newnode(0),newnode(-1);
        text[0]=-1,fail[0]=1;
      }
      int getfail(int x){
        while(text[all-len[x]-1]!=text[all])x=fail[x];
        return x;
      }
      void add(int w){
        w-='a';
        text[++all]=w;
        int x=getfail(last);
        if(!son[x][w]){
          int y=newnode(len[x]+2);
          int z=son[getfail(fail[x])][w];
          son[x][w]=y;
          fail[y]=z;
          diff[y]=len[y]-len[z];
          if(diff[y]!=diff[z]||len[z]<1)top[y]=y;else top[y]=top[z];
        }
        last=son[x][w];
        f[all]=last;
      }
      void get(int x,AP q[],int&cnt){
        cnt=0;
        x=f[x];
        while(len[x]>0){
          int y=top[x];
          q[++cnt]=AP(len[y],diff[x],(len[x]-len[y])/diff[x],len[x]);
          //printf("! %d %d %d
    ",len[y],len[x],diff[x]);
          x=fail[y];
        }
      }
    }pre,suf;
    ll exgcd(ll a,ll b,ll&x,ll&y){
      if(!b)return x=1,y=0,a;
      ll d=exgcd(b,a%b,x,y),t=x;
      return x=y,y=t-a/b*y,d;
    }
    inline ll solve(ll a,ll b,ll c,ll xl,ll xr,ll yl,ll yr){
      if(xl>xr)return 0;
      if(yl>yr)return 0;
      if(!a&&!b){
        if(c)return 0;
        return (xr-xl+1)*(yr-yl+1);
      }
      if(!b){
        swap(a,b);
        swap(xl,yl);
        swap(xr,yr);
      }
      if(!a){
        if(c%b)return 0;
        ll y=-c/b;
        if(y<yl||y>yr)return 0;
        return xr-xl+1;
      }
      ll x,y,d=exgcd((a%abs(b)+abs(b))%abs(b),abs(b),x,y);
      if(c%d)return 0;
      x=(x%abs(b)+abs(b))%abs(b)*((((-c)%abs(b))+abs(b))%abs(b)/d)%abs(b/d);
      d=abs(b/d);
      ll kl=(xl-x)/d-3,kr=(xr-x)/d+3;
      while(x+kl*d<xl)kl++;
      while(x+kr*d>xr)kr--;
      ll A=(-yl*b-a*x-c)/(a*d),B=(-yr*b-a*x-c)/(a*d);
      if(A>B)swap(A,B);
      kl=max(kl,A-3);
      kr=min(kr,B+3);
      while(kl<=kr){
        ll y=(-c-a*x-a*d*kl)/b;
        if(yl<=y&&y<=yr)break;
        kl++;
      }
      while(kl<=kr){
        ll y=(-c-a*x-a*d*kr)/b;
        if(yl<=y&&y<=yr)break;
        kr--;
      }
      if(kl>kr)return 0;
      return kr-kl+1;
    }
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d%s",&n,&m,s+1);
        pre.init();
        suf.init();
        for(i=1;i<=n;i++)pre.add(s[i]);
        for(i=n;i;i--)suf.add(s[i]);
        while(m--){
          scanf("%d%d",&x,&y);
          len=y-x+1;
          pre.get(y,a,ca);
          suf.get(n-x+1,b,cb);
          ans=0;
          for(i=1;i<=ca;i++)for(j=1;j<=cb;j++){
            if(a[i].s+b[j].s>len)continue;
            if(a[i].f+b[j].f<len)continue;
            ans+=solve(a[i].d,b[j].d,a[i].s+b[j].s-len,0,a[i].r,0,b[j].r);
          }
          printf("%d
    ",ans);
        }
      }
    }
    

      

    C. Dynamic Graph Matching

    #include<cstdio>
    const int N=1<<10,P=1000000007;
    int T,n,m,all,i,x,y,S,f[N],cnt[N],ans[N];char op[9];
    inline void add(int&a,int b){a=a+b<P?a+b:a+b-P;}
    inline void sub(int&a,int b){a=a-b>=0?a-b:a-b+P;}
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d",&n,&m);
        all=1<<n;
        for(i=0;i<all;i++)f[i]=0,cnt[i]=__builtin_popcount(i);
        f[0]=1;
        while(m--){
          scanf("%s%d%d",op,&x,&y);
          x--,y--;
          S=(1<<x)|(1<<y);
          if(op[0]=='+'){
            for(i=all-1;~i;i--)if(!(i&S))add(f[i^S],f[i]);
          }else{
            for(i=0;i<all;i++)if(!(i&S))sub(f[i^S],f[i]);
          }
          for(i=1;i<=n;i++)ans[i]=0;
          for(i=1;i<all;i++)add(ans[cnt[i]],f[i]);
          for(i=2;i<=n;i+=2)printf("%d%c",ans[i],i<n?' ':'
    ');
        }
      }
    }
    

      

    D. Euler Function

    #include<cstdio>
    int T,k;
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d",&k);
        if(k==1)puts("5");else printf("%d
    ",5+k);
      }
    }
    

      

    E. Find The Submatrix

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N=10010;
    const ll inf=1LL<<60;
    int T,n,m,X,Y,i,j,k,pool[N];ll a[N],f[4][2][N],g[4][2][N],ans;
    inline void up(ll&a,ll b){a<b?(a=b):0;}
    inline void clr(){
      for(i=0;i<=Y;i++)for(j=0;j<2;j++)for(k=0;k<=X;k++)g[i][j][k]=-inf;
    }
    inline void nxt(){
      for(i=0;i<=Y;i++)for(j=0;j<2;j++)for(k=0;k<=X;k++)f[i][j][k]=g[i][j][k];
    }
    void solve1(int o,int l,int r,int dl,int dr){
      int mid=(l+r)>>1,dm=dl;
      ll ret=-inf;
      for(int i=dl;i<=dr&&i<=mid;i++){
        ll now=f[o][0][i];
        if(mid-i<=m)now+=a[mid-i];
        if(now>ret)ret=now,dm=i;
      }
      up(g[o][0][mid],ret);
      if(l<mid)solve1(o,l,mid-1,dl,dm);
      if(r>mid)solve1(o,mid+1,r,dm,dr);
    }
    void solve2(int o,int l,int r,int dl,int dr){
      int mid=(l+r)>>1,dm=dl;
      ll ret=-inf;
      for(int i=dl;i<=dr&&i<=mid;i++){
        ll now=f[o][1][i];
        if(mid-i<=m)now+=a[mid-i];
        if(now>ret)ret=now,dm=i;
      }
      up(g[o+1][0][mid],ret);
      if(l<mid)solve2(o,l,mid-1,dl,dm);
      if(r>mid)solve2(o,mid+1,r,dm,dr);
    }
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d%d%d",&n,&m,&X,&Y);
        clr();
        nxt();
        f[0][1][0]=0;
        while(n--){
          for(i=1;i<=m;i++)scanf("%d",&pool[i]);
          sort(pool+1,pool+m+1);
          a[0]=0;
          for(i=1;i<=m;i++)a[0]+=pool[i];
          for(i=1;i<=m;i++)a[i]=a[i-1]-pool[i];
          clr();
          for(i=0;i<=Y;i++)solve1(i,0,X,0,X);
          for(i=0;i<Y;i++)solve2(i,0,X,0,X);
          for(i=0;i<=Y;i++)for(k=0;k<=X;k++){
            up(g[i][1][k],f[i][0][k]);
            up(g[i][1][k],f[i][1][k]);
          }
          nxt();
        }
        ans=0;
        for(i=0;i<=Y;i++)for(j=0;j<2;j++)for(k=0;k<=X;k++)up(ans,f[i][j][k]);
        printf("%lld
    ",ans);
      }
    }
    

      

    F. Grab The Tree

    #include<cstdio>
    int T,n,i,x,y,sum;
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d",&n);
        sum=0;
        for(i=1;i<=n;i++)scanf("%d",&x),sum^=x;
        for(i=1;i<n;i++)scanf("%d%d",&x,&y);
        puts(sum?"Q":"D");
      }
    }
    

      

    G. Interstellar Travel

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=200010;
    int T,n,t,i,f[N];bool must[N];
    struct P{int x,y,p;}a[N],q[N];
    inline bool cmp(const P&a,const P&b){
      if(a.x!=b.x)return a.x<b.x;
      if(a.y!=b.y)return a.y>b.y;
      return a.p<b.p;
    }
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d",&n);
        for(i=1;i<=n;i++){
          scanf("%d%d",&a[i].x,&a[i].y);
          a[i].p=i;
        }
        sort(a+1,a+n+1,cmp);
        for(t=0,i=1;i<=n;i++){
          if(i>1&&a[i].x==a[i-1].x)continue;
          while(t>1&&1LL*(q[t].y-q[t-1].y)*(a[i].x-q[t].x)<1LL*(a[i].y-q[t].y)*(q[t].x-q[t-1].x))t--;
          q[++t]=a[i];
        }
        for(i=1;i<=t;i++)must[i]=0;
        must[1]=must[t]=1;
        for(i=2;i<t;i++)if(1LL*(q[i].y-q[i-1].y)*(q[i+1].x-q[i].x)!=1LL*(q[i+1].y-q[i].y)*(q[i].x-q[i-1].x))must[i]=1;
        for(i=t;i;i--)if(must[i])f[i]=q[i].p;else f[i]=min(f[i+1],q[i].p);
        for(i=1;i<t;i++)if(f[i]==q[i].p)printf("%d ",f[i]);
        printf("%d
    ",f[t]);
      }
    }
    

      

    H. Monster Hunter

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int N=100010;
    int T,n,i,x,y,g[N],v[N<<1],nxt[N<<1],ed,f[N],vis[N],del[N],pos;
    struct P{
      ll a,b;//- a then + b
      P(){}
      P(ll _a,ll _b){a=_a,b=_b;}
      bool operator<(const P&o)const{//true means bigger
        int sgn1=a<b,sgn2=o.a<o.b;
        if(sgn1!=sgn2)return sgn1<sgn2;
        if(a<b)return a>o.a;
        return b<o.b;
      }
      void operator+=(const P&o){
        ll na=max(a,a-b+o.a),nb=b+o.b-a-o.a+na;
        a=na,b=nb;
      }
    }a[N];
    typedef pair<int,int>PI;
    typedef pair<P,PI>PII;
    priority_queue<PII>q;
    inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
    void dfs(int x,int y){
      f[x]=y;
      for(int i=g[x];i;i=nxt[i])if(v[i]!=y)dfs(v[i],x);
    }
    int F(int x){return del[f[x]]?f[x]=F(f[x]):f[x];}
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d",&n);
        for(ed=pos=i=0;i<=n;i++)vis[i]=del[i]=g[i]=0;
        a[1]=P(0,0);
        for(i=2;i<=n;i++)scanf("%lld%lld",&a[i].a,&a[i].b);
        for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
        dfs(1,0);
        for(i=2;i<=n;i++)q.push(PII(a[i],PI(0,i)));
        while(!q.empty()){
          PII t=q.top();
          q.pop();
          x=t.second.second;
          if(del[x])continue;
          if(t.second.first!=vis[x])continue;
          del[x]=1;
          y=F(x);
          a[y]+=a[x];
          if(y>1)q.push(PII(a[y],PI(vis[y]=++pos,y)));
        }
        printf("%lld
    ",a[1].a);
      }
    }
    

      

    I. Random Sequence

    #include<cstdio>
    const int N=110,M=1500,P=1000000007;
    int T,n,m,i,j,k,x,y,cnt,gcd[N][N],v[N],a[N],id[N][N][N],g[M][N],w[M][N],f[N][M],ans;
    int getgcd(int a,int b){return b?getgcd(b,a%b):a;}
    int po(int a,int b){int t=1;for(;b;b>>=1,a=1LL*a*a%P)if(b&1)t=1LL*t*a%P;return t;}
    inline void up(int&a,int b){a=a+b<P?a+b:a+b-P;}
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)scanf("%d",&a[i]);
        for(i=1;i<=m;i++)scanf("%d",&v[i]);
        for(i=1;i<=m;i++)for(j=1;j<=m;j++)gcd[i][j]=getgcd(i,j);
        cnt=0;
        for(i=1;i<=m;i++)for(j=i;j<=m;j+=i)for(k=j;k<=m;k+=j)id[i][j][k]=++cnt;
        for(i=1;i<=m;i++)for(j=i;j<=m;j+=i)for(k=j;k<=m;k+=j){
          x=id[i][j][k];
          for(y=1;y<=m;y++){
            g[x][y]=id[gcd[j][y]][gcd[k][y]][y];
            w[x][y]=v[gcd[i][y]];
          }
        }
        for(i=1;i<=n;i++)for(j=1;j<=cnt;j++)f[i][j]=0;
        for(i=1;i<=m;i++)for(j=1;j<=m;j++)for(k=1;k<=m;k++){
          if(a[1]&&i!=a[1])continue;
          if(a[2]&&j!=a[2])continue;
          if(a[3]&&k!=a[3])continue;
          up(f[3][id[gcd[gcd[i][j]][k]][gcd[j][k]][k]],1);
        }
        for(i=3;i<n;i++)for(j=1;j<=cnt;j++)if(f[i][j])for(k=1;k<=m;k++){
          if(a[i+1]&&k!=a[i+1])continue;
          up(f[i+1][g[j][k]],1LL*f[i][j]*w[j][k]%P);
        }
        ans=0;
        for(j=1;j<=cnt;j++)up(ans,f[n][j]);
        for(i=1;i<=n;i++)if(!a[i])ans=1LL*ans*po(m,P-2)%P;
        printf("%d
    ",ans);
      }
    }
    

      

    J. Rectangle Radar Scanner

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=100010,M=1000010,E=262150,inf=~0U>>1;
    int T,n,m,K,i,a[N],b[N],vma[E],vmi[E],vprod[E];
    int xl[M],xr[M],yl[M],yr[M],ansma[M],ansmi[M],ansprod[M],q[M],pool[M],e[M];
    int A,B,U,C,D;
    inline bool cmpl(int x,int y){return xl[x]>xl[y];}
    inline bool cmpr(int x,int y){return xr[x]<xr[y];}
    inline void umax(int&a,int b){a<b?(a=b):0;}
    inline void umin(int&a,int b){a>b?(a=b):0;}
    void dfs(int x,int a,int b){
      if(!vma[x])return;
      vma[x]=0,vmi[x]=inf,vprod[x]=1;
      if(a==b)return;
      int mid=(a+b)>>1;
      dfs(x<<1,a,mid),dfs(x<<1|1,mid+1,b);
    }
    void add(int x,int a,int b){
      umax(vma[x],D);
      umin(vmi[x],D);
      vprod[x]=1LL*vprod[x]*D%K;
      if(a==b)return;
      int mid=(a+b)>>1;
      if(C<=mid)add(x<<1,a,mid);else add(x<<1|1,mid+1,b);
    }
    void ask(int x,int a,int b){
      if(C<=a&&b<=D){
        umax(A,vma[x]);
        umin(B,vmi[x]);
        U=1LL*U*vprod[x]%K;
        return;
      }
      int mid=(a+b)>>1;
      if(C<=mid)ask(x<<1,a,mid);
      if(D>mid)ask(x<<1|1,mid+1,b);
    }
    void solve(int l,int r,int L,int R){
      if(l>r||L>R)return;
      int mid=(l+r)>>1,i,j,k,cL=L-1,cR=R+1,ce=0;
      for(i=L;i<=R;i++){
        j=q[i];
        if(xr[j]<mid)pool[++cL]=j;
        else if(xl[j]>mid)pool[--cR]=j;
        else e[++ce]=j;
      }
      for(i=L;i<=R;i++)q[i]=pool[i];
      sort(e+1,e+ce+1,cmpl);
      for(i=1,j=mid;i<=ce;i++){
        k=e[i];
        while(j>=xl[k]){
          C=a[j],D=b[j];
          add(1,1,n);
          j--;
        }
        C=yl[k],D=yr[k],A=ansma[k],B=ansmi[k],U=ansprod[k];
        ask(1,1,n);
        ansma[k]=A,ansmi[k]=B,ansprod[k]=U;
      }
      dfs(1,1,n);
      sort(e+1,e+ce+1,cmpr);
      for(i=1,j=mid+1;i<=ce;i++){
        k=e[i];
        while(j<=xr[k]){
          C=a[j],D=b[j];
          add(1,1,n);
          j++;
        }
        C=yl[k],D=yr[k],A=ansma[k],B=ansmi[k],U=ansprod[k];
        ask(1,1,n);
        ansma[k]=A,ansmi[k]=B,ansprod[k]=U;
      }
      dfs(1,1,n);
      solve(l,mid-1,L,cL);
      solve(mid+1,r,cR,R);
    }
    int main(){
      for(i=0;i<E;i++)vmi[i]=inf,vprod[i]=1;
      scanf("%d",&T);
      while(T--){
        scanf("%d",&n);
        for(i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
        int a0,b0,c0,d0,pp,qq,rr,P;
        scanf("%d%d%d%d%d%d%d%d%d%d",&m,&a0,&b0,&c0,&d0,&pp,&qq,&rr,&P,&K);
        for(i=1;i<=m;i++){
          int na=(1LL*pp*a0+1LL*qq*b0+rr)%P;
          int nb=(1LL*pp*b0+1LL*qq*a0+rr)%P;
          int nc=(1LL*pp*c0+1LL*qq*d0+rr)%P;
          int nd=(1LL*pp*d0+1LL*qq*c0+rr)%P;
          xl[i]=min(na%n+1,nb%n+1);
          xr[i]=max(na%n+1,nb%n+1);
          yl[i]=min(nc%n+1,nd%n+1);
          yr[i]=max(nc%n+1,nd%n+1);
          a0=na,b0=nb,c0=nc,d0=nd;
          q[i]=i;
          ansma[i]=0;
          ansmi[i]=inf;
          ansprod[i]=1;
        }
        solve(1,n,1,m);
        long long fin=0;
        for(i=1;i<=m;i++)if(ansma[i])fin+=ansprod[i]^ansma[i]^ansmi[i];
        printf("%lld
    ",fin);
      }
    }
    

      

    K. Transport Construction

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,int>E;
    const int N=100010;
    const ll inf=1LL<<60;
    int T,n,i,j,k,m,c[N],q[N],st[N],en[N],qx[N],qk[N],stq[N],enq[N],tmp[N];
    int hull[N],on[N],f[N];
    E e[N];
    ll ans;
    struct P{int x,y;}a[N];
    inline bool cmpc(int x,int y){return c[x]<c[y];}
    inline bool cmpx(int x,int y){
      if(a[x].x!=a[y].x)return a[x].x<a[y].x;
      if(a[x].y!=a[y].y)return a[x].y<a[y].y;
      return c[x]<c[y];
    }
    inline bool cmpk(int x,int y){return 1LL*a[x].y*a[y].x<1LL*a[y].y*a[x].x;}
    inline ll dot(const P&a,const P&b){return 1LL*a.x*b.x+1LL*a.y*b.y;}
    inline void work(int A,int B){//update B with A's hull
      int l1=stq[A],r1=enq[A];
      int l2=stq[B],r2=enq[B];
      int t=0,i,j,x,cnt=0;
      for(i=l1;i<=r1;i++){
        if(i>l1&&a[qx[i]].x==a[qx[i-1]].x)continue;
        //while(t>1&&slope(tmp[t],tmp[t-1])>slope(qx[i],tmp[t]))t--;
        while(t>1&&1LL*(a[tmp[t]].y-a[tmp[t-1]].y)*(a[qx[i]].x-a[tmp[t]].x)>1LL*(a[qx[i]].y-a[tmp[t]].y)*(a[tmp[t]].x-a[tmp[t-1]].x))t--;
        tmp[++t]=qx[i];
      }
      for(i=1;i<=t;i++){
        if(i==1||i==t)hull[++cnt]=i;
        //else if(slope(tmp[i],tmp[i-1])!=slope(tmp[i+1],tmp[i]))hull[++cnt]=i;
        else if(1LL*(a[tmp[i]].y-a[tmp[i-1]].y)*(a[tmp[i+1]].x-a[tmp[i]].x)!=1LL*(a[tmp[i+1]].y-a[tmp[i]].y)*(a[tmp[i]].x-a[tmp[i-1]].x))hull[++cnt]=i;
      }
      for(i=1;i<cnt;i++){
        on[i]=c[tmp[hull[i]]];
        for(j=hull[i];j<=hull[i+1];j++)on[i]=min(on[i],c[tmp[j]]);
      }
      for(i=1;i<=cnt;i++)hull[i]=tmp[hull[i]];
      for(i=l2,j=1;i<=r2;i++){
        x=qk[i];
        while(j<cnt&&dot(a[x],a[hull[j]])>dot(a[x],a[hull[j+1]]))j++;
        ll now=dot(a[x],a[hull[j]]);
        if(j<cnt&&now==dot(a[x],a[hull[j+1]]))e[c[x]]=min(e[c[x]],E(now,on[j]));
        else e[c[x]]=min(e[c[x]],E(now,c[hull[j]]));
      }
    }
    void solve(int l,int r){
      if(l==r){
        stq[l]=stq[l]=enq[l-1]+1;
        int cur=enq[l-1];
        for(int i=st[l];i<=en[l];i++){
          qx[++cur]=q[i];
          qk[cur]=q[i];
        }
        enq[l]=cur;
        sort(qx+stq[l],qx+cur+1,cmpx);
        sort(qk+stq[l],qk+cur+1,cmpk);
        return;
      }
      int mid=(l+r)>>1;
      solve(l,mid);
      solve(mid+1,r);
      work(l,mid+1);
      work(mid+1,l);
      int l1=stq[l],r1=enq[l];
      int l2=stq[mid+1],r2=enq[mid+1];
      int k=l1-1;
      while(l1<=r1&&l2<=r2)tmp[++k]=cmpx(qx[l1],qx[l2])?qx[l1++]:qx[l2++];
      while(l1<=r1)tmp[++k]=qx[l1++];
      while(l2<=r2)tmp[++k]=qx[l2++];
      for(int i=stq[l];i<=k;i++)qx[i]=tmp[i];
      l1=stq[l],r1=enq[l];
      l2=stq[mid+1],r2=enq[mid+1];
      k=l1-1;
      while(l1<=r1&&l2<=r2)tmp[++k]=cmpk(qk[l1],qk[l2])?qk[l1++]:qk[l2++];
      while(l1<=r1)tmp[++k]=qk[l1++];
      while(l2<=r2)tmp[++k]=qk[l2++];
      for(int i=stq[l];i<=k;i++)qk[i]=tmp[i];
      enq[l]=r2;
    }
    int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
    inline void merge(int x,int y,ll z){if(F(x)!=F(y))ans+=z,f[f[x]]=f[y];}
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d",&n);
        for(i=1;i<=n;i++){
          scanf("%d%d",&a[i].x,&a[i].y);
          c[i]=q[i]=i;
        }
        ans=0;
        while(1){
          sort(q+1,q+n+1,cmpc);
          for(m=0,i=1;i<=n;i=j){
            for(j=i;j<=n&&c[q[i]]==c[q[j]];j++);
            m++;
            for(k=i;k<j;k++)c[q[k]]=m;
          }
          if(m==1)break;
          for(i=1;i<=n;i++)en[c[q[i]]]=i;
          for(i=n;i;i--)st[c[q[i]]]=i;
          for(i=1;i<=m;i++)e[i]=E(inf,0);
          solve(1,m);
          for(i=1;i<=m;i++)f[i]=i;
          for(i=1;i<=m;i++)merge(i,e[i].second,e[i].first);
          for(i=1;i<=n;i++)c[i]=F(c[i]);
        }
        printf("%lld
    ",ans);
      }
    }
    

      

    L. Visual Cube

    #include<cstdio>
    const int N=200;
    int T,a,b,c,n,m,i,j;char f[N][N];
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d%d",&a,&b,&c);
        n=b*2+c*2+1;
        m=a*2+b*2+1;
        for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]='.';
        for(i=1;i<=b;i++)for(j=1;j<=a;j++){
          f[i*2-1][j*2+1+b*2-i*2]='+';
          f[i*2-1][j*2+2+b*2-i*2]='-';
          f[i*2-1][j*2+3+b*2-i*2]='+';
          f[i*2][j*2+b*2-i*2]='/';
          f[i*2][j*2+2+b*2-i*2]='/';
        }
        for(i=1;i<=c;i++)for(j=1;j<=a;j++){
          f[i*2+b*2-1][j*2-1]='+';
          f[i*2+b*2-1][j*2]='-';
          f[i*2+b*2-1][j*2+1]='+';
          f[i*2+b*2][j*2-1]='|';
          f[i*2+b*2][j*2+1]='|';
          f[i*2+b*2+1][j*2-1]='+';
          f[i*2+b*2+1][j*2]='-';
          f[i*2+b*2+1][j*2+1]='+';
        }
        for(i=1;i<=c;i++)for(j=1;j<=b;j++){
          f[i*2+b*2-j*2][a*2+j*2+1]='|';
          f[i*2+b*2-j*2+1][a*2+j*2+1]='+';
          f[i*2+b*2-j*2+2][a*2+j*2]='/';
        }
        for(i=1;i<=n;i++){
          for(j=1;j<=m;j++)putchar(f[i][j]);
          puts("");
        }
      }
    }
    

      

    M. Walking Plan

    #include<cstdio>
    #define rep(i) for(int i=0;i<n;i++)
    const int N=55,M=105,inf=1000000000;
    int T,n,m,x,y,q,K,A,B,z,g[N][N],d[N][N],f[N][N],a[M][N][N],b[M][N][N];
    inline void up(int&a,int b){if(a>b)a=b;}
    inline void mul(int a[][N],int b[][N],int c[][N]){
      static int f[N][N];
      rep(i)rep(j){
        f[i][j]=inf;
        rep(k)up(f[i][j],a[i][k]+b[k][j]);
      }
      rep(i)rep(j)c[i][j]=f[i][j];
    }
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d",&n,&m);
        rep(i)rep(j)g[i][j]=inf;
        while(m--){
          scanf("%d%d%d",&x,&y,&z);
          x--,y--;
          up(g[x][y],z);
        }
        rep(i)rep(j)a[0][i][j]=b[0][i][j]=i==j?0:inf;
        for(int i=1;i<M;i++)mul(a[i-1],g,a[i]);
        for(int i=1;i<M;i++)mul(b[i-1],a[100],b[i]);
        rep(i)rep(j)d[i][j]=i==j?0:g[i][j];
        rep(k)rep(i)rep(j)up(d[i][j],d[i][k]+d[k][j]);
        for(x=0;x<M;x++){
          rep(i)rep(j)f[i][j]=inf;
          rep(i)rep(j)rep(k)up(f[i][j],b[x][i][k]+d[k][j]);
          rep(i)rep(j)b[x][i][j]=f[i][j];
        }
        scanf("%d",&q);
        while(q--){
          scanf("%d%d%d",&x,&y,&K);
          x--,y--;
          A=K%100,B=K/100;
          z=inf;
          rep(i)up(z,a[A][x][i]+b[B][i][y]);
          if(z>=inf)z=-1;
          printf("%d
    ",z);
        }
      }
    }
    

      

  • 相关阅读:
    POJ 2251 Dungeon Master
    POJ1321棋盘问题
    CODE[VS] 1003 电话连线
    CCF-201412-1-门禁系统
    CCF-201412-2-Z字形扫描
    为什么要用补码
    CCF-201409-1-相邻数对
    CCF-201409-2-画图
    CCF-201403-1-相反数
    CCF-201403-2-窗口
  • 原文地址:https://www.cnblogs.com/clrs97/p/9426621.html
Copyright © 2011-2022 走看看