zoukankan      html  css  js  c++  java
  • Codeforces Round #373 (Div. 2)

    好爽啊 晚上不回宿舍打比赛

    最后打了三题 fail了一题.. 是因为第三题>='9'就进位了...

    A Vitya in the Countryside

    打的时候被hack了一次cnm变大变小只有一个数的时候判断是不是0和15 其他的话判断一下最后的那个是不是0和15和增减性就好了

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #define Maxn 100
    using namespace std;
    int N,A[Maxn];
    int main()
    {
      scanf("%d",&N);
      for(int i=1;i<=N;i++) scanf("%d",&A[i]);
      if(N==1){if(A[1]==0) printf("UP
    "); else if(A[1]==15) printf("DOWN
    "); else printf("-1
    "); return 0;}
      else
      {
        if(A[N]>A[N-1])
        {
          if(A[N]==15) printf("DOWN
    ");
          else printf("UP
    ");
        }
        else if(A[N]<A[N-1])
        {
          if(A[N]==0) printf("UP
    ");
          else printf("DOWN
    ");
        }
      }
      return 0;
    }
    View Code

    B Anatoly and Cockroaches

    这道题硕爷用了三分钟ac 我被吓到了 心情平复一下 然后认为和字符串连续的多少有关然后dp

    后来发现要间隔 一端连续的并不能说是把那些删去或者换掉 所以这也提醒了我 间隔的方式只有两种

    然后按照这两种间隔方式dp 不同的记录一下 然后先交换 再一个个变 这样显然

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<climits>
    #define Maxn 100010
    using namespace std;
    char str[Maxn];
    int main()
    {
      //freopen("a.in","r",stdin);
      //freopen("a.out","w",stdout);
      int N; scanf("%d",&N); for(int i=1;i<=N;i++) scanf("
    %c",&str[i]);
      int F1=0, F2=0;
      for(int i=1;i<=N;i++)
      {
        if(str[i]=='b'&&i%2==1) F2++;
        if(str[i]=='r'&&i%2==0) F1++;    
      }
      int minx=INT_MAX;
      minx=min(minx,max(F1,F2));
      F1=0, F2=0;
      for(int i=1;i<=N;i++)
      {
        if(str[i]=='b'&&i%2==0) F2++;
        if(str[i]=='r'&&i%2==1) F1++;    
      }
      minx=min(minx,max(F1,F2));
      return printf("%d
    ",minx),0;
    }
    View Code

    C Efim and Strange Grade

    这道题一看就知道贪心 只是细节 比如说我就fail掉了 从最大的位可以进的就进就好了

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #define Maxn 200010
    using namespace std;
    char str[Maxn];
    int main()
    {
      int N,T; scanf("%d%d",&N,&T);
      for(int i=1;i<=N;i++) scanf("
    %c",&str[i]);
      int p; for(int i=1;i<=N;i++) if(str[i]=='.') p=i;
      int L=N-p+1; int last=N+1; int tot=1;
      for(int i=p;i<=N;i++)
      {
        if(str[i]>='5'&&str[i]<='9'){last=i; break;}
      }
      if(last!=N+1)
      {
        L=N-last; str[last-1]++; last--;
        while(tot<T&&last>p&&str[last]>='5'&&str[last]<=('9'+1))
        {
          last--; tot++; str[last]++;
        }
      
        if(last==p)
        {
          str[last]='.'; str[p-1]++; last=p-1;
          while(str[last]>'9')
          {
            str[last]='0'; str[last-1]++;
            last--;
          }
        }
      }else last=N;
      if(str[0]==1) printf("1");
      for(int i=1;i<p;i++) if(str[i]>=('9'+1)) printf("0");
      else printf("%c",str[i]); 
      
      if(last>p)
      {
        printf(".");
        for(int i=p+1;i<=last;i++) if(str[i]>=('9'+1)) printf("0");
        else printf("%c",str[i]);
      }
      return 0;
    }
    View Code

    D 删掉了

    E Sasha and Array

    就back回这一题 当时看完题栋爷给我讲了 但是没时间写 硕爷好6一个小时草掉了 我调了一个上午加个下午

    这道题原来以为是卡常 然后发现要打的非常严谨 一定要nlogn

    区间想到的就是线段树 然后斐波那契数列就在每个节点都放一个矩阵 来做矩阵乘法

    每一个节点维护下面的矩阵的大小的和 就是每个元素加起来的呵

    矩阵乘法是满足分配律的!!!!!!!!!!!!!!!!

    比如说你要求lc和rc的答案 或者说是在lc和rc同时增加后求答案 那么(lc*c+rc*c)=u*c

    然后就是怎么保证nlogn的问题 给出优化方案:

    1.区间增加的时候不要看到一个区间就算一次 在外面先算一次 在里面的时候乘一下就好 这样就不是log^2而是 log+log

    2.lazy下传的时候传一个矩阵 同样的 如果是传一个数 那么下面的数就会累计了上面很多数的和 那么到时候找的时候又要log

       而直接传矩阵的话就不需要快速幂 只需要转移的速度罢了 打的时候很烦躁 代码略猥琐

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iostream>
    #include<cstdlib>
    #include<cmath>
    #include<climits>
    #define Maxn 100010
    using namespace std;
    typedef long long LL;
    const LL Mod=1e9+7;
    struct node
    {
      LL A[2][2];
    }C[4*Maxn],Sim,B,V,Bit[70],P,lazy[4*Maxn];
    int N,M; LL A[4*Maxn];
    
    int lc[4*Maxn],rc[4*Maxn]; int root,tot;
    void Add_Matrix(int x,int y)
    {
      for(int i=0;i<2;i++) for(int j=0;j<1;j++)
        if(C[x].A[i][j]+C[y].A[i][j]>Mod) C[x].A[i][j]=(C[x].A[i][j]+C[y].A[i][j])%Mod;
        else C[x].A[i][j]+=C[y].A[i][j];
    }
    LL bit[Maxn];
    
    void Quick(LL c)
    {
      B.A[0][0]=1; B.A[0][1]=0; B.A[1][0]=0; B.A[1][1]=1;
      for(int p=0;c>=bit[p];p++)
      {
        if((c&bit[p])==bit[p])
        {
          for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=B.A[i][j];
          for(int i=0;i<2;i++) for(int j=0;j<2;j++) B.A[i][j]=0;
          for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++)
            if(B.A[i][j]+V.A[i][k]*Bit[p].A[k][j]>Mod) B.A[i][j]=(B.A[i][j]+V.A[i][k]*Bit[p].A[k][j])%Mod;
            else B.A[i][j]=B.A[i][j]+V.A[i][k]*Bit[p].A[k][j];
        }
      }
    }
    void Add(int u,node c)
    {
      for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=lazy[u].A[i][j];
      for(int i=0;i<2;i++) for(int j=0;j<2;j++) lazy[u].A[i][j]=0;
      for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++)
        if(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j]>Mod) lazy[u].A[i][j]=(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j])%Mod;
        else lazy[u].A[i][j]=(lazy[u].A[i][j]+c.A[i][k]*V.A[k][j]);
      
      for(int i=0;i<2;i++) for(int j=0;j<1;j++) V.A[i][j]=C[u].A[i][j];
      for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0;
      for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++)
        if(C[u].A[i][j]+c.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+c.A[i][k]*V.A[k][j])%Mod;
        else C[u].A[i][j]=(C[u].A[i][j]+c.A[i][k]*V.A[k][j]);
    }
    void Push_Down(int u)
    {
      if(lazy[u].A[0][0]!=1||lazy[u].A[0][1]!=0||lazy[u].A[1][0]!=0||lazy[u].A[1][1]!=1)
      {
        Add(lc[u],lazy[u]); Add(rc[u],lazy[u]);
        lazy[u]=Sim;
      }
    }
    void Link(int &u,int L,int R)
    {
      if(!u) u=++tot; lazy[u]=Sim;
      if(L==R)
      {
        Quick(A[L]-1); V.A[0][0]=0; V.A[1][0]=1;
        for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0;
        for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++)
          if(C[u].A[i][j]+B.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+B.A[i][k]*V.A[k][j])%Mod;
          else C[u].A[i][j]=(C[u].A[i][j]+B.A[i][k]*V.A[k][j]);
        return ;
      }
      int mid=(L+R)>>1;
      Link(lc[u],L,mid);Add_Matrix(u,lc[u]);
      Link(rc[u],mid+1,R);Add_Matrix(u,rc[u]);
    }
    
    void Change(int u,int L,int R,int l,int r,LL c)
    {
      if(L==l&&R==r)
      {
        for(int i=0;i<2;i++) for(int j=0;j<2;j++) V.A[i][j]=lazy[u].A[i][j];
        for(int i=0;i<2;i++) for(int j=0;j<2;j++) lazy[u].A[i][j]=0;
        for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++)
          if(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j]>Mod) lazy[u].A[i][j]=(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j])%Mod;
          else lazy[u].A[i][j]=(lazy[u].A[i][j]+P.A[i][k]*V.A[k][j]);
        
        for(int i=0;i<2;i++) for(int j=0;j<1;j++) V.A[i][j]=C[u].A[i][j];
        for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0;
        for(int i=0;i<2;i++) for(int j=0;j<1;j++) for(int k=0;k<2;k++)
          if(C[u].A[i][j]+P.A[i][k]*V.A[k][j]>Mod) C[u].A[i][j]=(C[u].A[i][j]+P.A[i][k]*V.A[k][j])%Mod;
          else C[u].A[i][j]=(C[u].A[i][j]+P.A[i][k]*V.A[k][j]);
        return ;
      }
      int mid=(L+R)>>1;
      Push_Down(u);
      if(r<=mid) Change(lc[u],L,mid,l,r,c);
      else if(l>mid) Change(rc[u],mid+1,R,l,r,c);
      else
      {
        Change(lc[u],L,mid,l,mid,c);
        Change(rc[u],mid+1,R,mid+1,r,c);
      }
      for(int i=0;i<2;i++) for(int j=0;j<1;j++) C[u].A[i][j]=0;
      Add_Matrix(u,lc[u]);
      Add_Matrix(u,rc[u]);
    }
    
    LL ans=0;
    void Ask(int u,int L,int R,int l,int r)
    {
      if(L==l&&R==r){ans=(ans+C[u].A[1][0])%Mod; return;}
      int mid=(L+R)>>1;
      Push_Down(u);
      if(r<=mid) Ask(lc[u],L,mid,l,r);
      else if(l>mid) Ask(rc[u],mid+1,R,l,r);
      else
      {
        Ask(lc[u],L,mid,l,mid);
        Ask(rc[u],mid+1,R,mid+1,r);
      }
    }
    
    int read() {
        char c; 
        int t; int f; 
        t = 0; f = 1; 
        c = getchar(); 
        for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1; 
        for(; c >= '0' && c <= '9'; c = getchar()) t = t * 10 + (c - '0'); 
        return t * f; 
    }
    int main()
    {
      N=read(); M=read(); root=tot=0;
      bit[0]=1; for(int i=1;i<=63;i++) bit[i]=bit[i-1]*2;
      Sim.A[0][0]=1; Sim.A[0][1]=0; Sim.A[1][0]=0; Sim.A[1][1]=1;
      Bit[0].A[0][0]=0; Bit[0].A[0][1]=Bit[0].A[1][0]=Bit[0].A[1][1]=1;
      for(int p=1;p<=65;p++)
        for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) Bit[p].A[i][j]=(Bit[p].A[i][j]+Bit[p-1].A[i][k]*Bit[p-1].A[k][j])%Mod;
      
      for(int i=1;i<=N;i++) A[i]=read();
      Link(root,1,N);
      for(int i=1;i<=M;i++)
      {
        int opt; opt=read();
        if(opt==1)
        {
          int l,r; int x; l=read(); r=read(); x=read();
          Quick(x); for(int i=0;i<2;i++) for(int j=0;j<2;j++) P.A[i][j]=B.A[i][j]; Change(root,1,N,l,r,x);
        }
        else if(opt==2)
        {
          int l,r; l=read(); r=read();
          ans=0; Ask(root,1,N,l,r);
          printf("%I64d
    ",ans);
        }
      }
      return 0;
    }
    View Code
  • 相关阅读:
    npm命令
    前端单元测试工具karma和jest
    加解密学习之--模运算与经典密码学
    数据结构之-翻转二叉树
    数据结构之-链表倒转
    转载:MQ
    分布式ID生成器 待整理
    软件开发中的负载均衡
    制作软件过程中所产出的文档(请补充)
    多线程的创建
  • 原文地址:https://www.cnblogs.com/wohenshuai/p/5906127.html
Copyright © 2011-2022 走看看