2014 Multi-University Training Contest 9小记

1002

 

typedef  long long  LL;
const  int  maxn = 100000 ;
vector<int>  d[maxn+8] ;
vector<int>  ::iterator it ;
int  a[maxn] ;
int  f[maxn] ;
int  b[maxn] ;
int  g[maxn] ;
int  c[maxn] ;

int  main(){
     int i , j ;
     for(i = 1 ; i <= maxn ; i++)
        for(j = i ; j <= maxn ; j += i) d[j].push_back(i) ;
     int  n   ;
     while(cin>>n && n){
          for(i = 1 ; i <= n ; i++) scanf("%d" , &a[i]) ;
          for(i = 1 ; i <= maxn ; i++) f[i] = -1 ;
          for(i = 1 ; i <= n ; i++){
              if(f[a[i]] == -1) b[i] = a[i] ;
              else  b[i] = a[f[a[i]]] ;
              for(it = d[a[i]].begin() ; it != d[a[i]].end() ; it++)
                 f[*it] = max(f[*it] , i) ;
          }

          for(i = 1 ; i <= maxn ; i++) g[i] = maxn + 10 ;
          for(i = n ; i >= 1 ; i--){
              if(g[a[i]] == maxn + 10) c[i] = a[i] ;
              else  c[i] = a[g[a[i]]] ;
              for(it = d[a[i]].begin() ; it != d[a[i]].end() ; it++)
                 g[*it] = min(g[*it] , i) ;
          }
          LL ans = 0 ;
          for(i = 1 ; i <= n ; i++){
            //  cout<<b[i] << "  "<<c[i]<<endl ;
              ans +=  (LL)b[i] * (LL) c[i] ;
          }
          printf("%I64d\n" , ans) ;
     }
     return 0  ;
}


 

1006

 

const  int  maxn = 1008 ;

int  n , k ;

struct  Mat{
        int x[10][10] ;
        Mat(){
            memset(x , 0 , sizeof(x)) ;
        }
        Mat(int){
            memset(x,  0 , sizeof(x)) ;
            for(int i = 1 ; i <= k ; i++) x[i][i] = 1 ;
        }
        friend Mat operator * (const Mat &a , const Mat &b) ;
        friend Mat operator ^ (Mat a , int b) ;
};

Mat operator * (const Mat &a , const Mat &b){
       Mat s ;
       int i , j , d ;
       for(i = 1 ; i <= k ; i++){
            for(j = 1 ; j <= k ; j++){
                if(a.x[i][j] == 0) continue  ;
                for(d = 1 ; d <= k ; d++){
                    s.x[i][d] += a.x[i][j] * b.x[j][d] ;
                    while(s.x[i][d] >= 6) s.x[i][d] -= 6 ;
                }
            }
       }
       return s ;
}

Mat operator ^ (Mat a , int b){
    Mat s(1);
    int i , j , d ;
    for(; b ; b >>= 1){
        if(b & 1) s = s * a ;
        a = a * a ;
    }
    return s ;
}

int  a[maxn][maxn] , b[maxn][maxn] ;
int  ac[maxn][maxn] , acb[maxn][maxn] ;

int  main(){
     int  i , j  , d ;
     while(scanf("%d%d" ,&n,&k)){
         if(n==0 && k==0) break ;
         for(i = 1 ; i <= n ; i++)
            for(j = 1 ; j <= k ; j++) scanf("%d" ,&a[i][j]) ;
         for(i = 1 ; i <= k ; i++)
            for(j = 1 ; j <= n ; j++) scanf("%d" ,&b[i][j]) ;

         Mat c ;
         for(i = 1 ; i <= k ; i++){
            for(j = 1 ; j <= n ; j++){
                if(b[i][j] == 0) continue  ;
                for(d = 1 ; d <= k ; d++){
                    c.x[i][d] += b[i][j] * a[j][d] ;
                    while(c.x[i][d] >= 6) c.x[i][d] -= 6 ;
                }
            }
         }
         c = c ^ (n*n-1) ;

         memset(ac , 0 , sizeof(ac)) ;
         for(i = 1 ; i <= n ; i++){
            for(j = 1 ; j <= k ; j++){
                if(a[i][j] == 0) continue  ;
                for(d = 1 ; d <= k ; d++){
                    ac[i][d] += a[i][j] * c.x[j][d] ;
                    while(ac[i][d] >= 6) ac[i][d] -= 6 ;
                }
            }
         }

         memset(acb , 0  , sizeof(acb)) ;
         for(i = 1 ; i <= n ; i++){
            for(j = 1 ; j <= k ; j++){
                if(ac[i][j] == 0) continue  ;
                for(d = 1 ; d <= n ; d++){
                    acb[i][d] += ac[i][j] * b[j][d] ;
                    while(acb[i][d] >= 6) acb[i][d] -= 6 ;
                }
            }
         }
         
         int sum = 0 ;
         for(i = 1 ; i <= n ; i++)
            for(j = 1 ; j <= n ; j++) sum += acb[i][j] ;
         printf("%d\n"  , sum)  ;
    }
    return 0  ;
}


1009

int  main(){
     int p , n , t , a , b , c , d , e ;
     double  cmax , cmin  , g ;
     cin>>t ;
     while(t--){
          cin>>p>>n ;
          cmin = 1000.0 ;
          cmax = -1000.0 ;
          p *= n ;
          for(a = 0 ; a <= n ; a++)
          for(b = 0 ; b <= n ; b++)
          for(c = 0 ; c <= n ; c++)
          for(d = 0 ; d <= n ; d++)
          for(e = 0 ; e <= n ; e++){
              if(a + b + c + d + e == n
                 && 85*a + 80*b + 75*c + 70*d + 60*e <= p
                 && 100*a + 84*b + 79*c + 74*d + 69*e >= p){
                    g = (4.0*a + 3.5*b + 3.0*c + 2.5*d + 2.0*e) / n ;
                    cmin = min(cmin , g) ;
                    cmax = max(cmax , g) ;
              }
          }
          printf("%.4lf %.4lf\n" , cmin , cmax) ;
     }
     return 0 ;
}



1011

typedef  long long  LL;
const  int  maxn = 100008 ;

int   n  ;
LL    c[maxn] , cnt[maxn] ;

inline  int lowb(int x){
      return x & (-x)  ;
}

void  into(int i , LL d){
      for(; i <= n ; i += lowb(i)) c[i] += d ;
}

LL  sum(int i){
    LL t = 0 ;
    for( ; i >= 1 ; i -= lowb(i)) t += c[i] ;
    return t ;
}

int main(){
    int  m , i ,j , l , r , t , k ;
    LL  h , d ;
    while(cin>>n&&n){
         fill(c , c+n+1 , 0) ;
         scanf("%d" , &m) ;
         while(m--){
              scanf("%d%d%I64d" , &l ,&r ,&d) ;
              into(l , d) ;
              into(r+1 , -d) ;
         }
         fill(cnt , cnt+n+2 , 0) ;
         for(i = n ; i >= 1 ; i--) cnt[i] += cnt[i+1] + sum(i) ;
         scanf("%d" , &k) ;
         t = 0 ;
         while(k--){
              scanf("%I64d%d",&h , &i) ;
              if(cnt[i] < h) t++ ;
         }
         printf("%d\n" , t) ;
    }
    return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值