码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #373 (Div. 2)

时间:2016-09-25 17:22:41      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

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

最后打了三题 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\n"); else if(A[1]==15) printf("DOWN\n"); else printf("-1\n"); return 0;}
  else
  {
    if(A[N]>A[N-1])
    {
      if(A[N]==15) printf("DOWN\n");
      else printf("UP\n");
    }
    else if(A[N]<A[N-1])
    {
      if(A[N]==0) printf("UP\n");
      else printf("DOWN\n");
    }
  }
  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("\n%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\n",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("\n%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\n",ans);
    }
  }
  return 0;
}
View Code

 

Codeforces Round #373 (Div. 2)

标签:

原文地址:http://www.cnblogs.com/wohenshuai/p/5906127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!