Codeforces Round #261 (Div. 2)小记

来源:互联网 发布:vb下载官方 编辑:程序博客网 时间:2024/06/10 12:43

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。

#define  X  first#define  Y  secondvector<pair<int , int> > a ;int can(pair<int , int> c){    return  -1000 <= c.X && c.X <= 1000         && -1000 <= c.Y && c.Y <= 1000  ;}int main(){    int  x1 , x2 , y1 ,y2   , d  , ok ;    pair<int , int >s , t ;    while(cin>>x1>>y1>>x2>>y2){         ok = 1 ;         a.clear() ;         a.push_back( make_pair(x1 , y1)) ;         a.push_back( make_pair(x2 , y2)) ;         sort(a.begin()  , a.end()) ;         if(a[0].X == a[1].X && a[0].Y != a[1].Y){              d = a[1].Y - a[0].Y ;              s.X = a[0].X + d ;              t.X = a[1].X + d ;              s.Y = a[0].Y ;              t.Y = a[1].Y ;              if(! can(s) || ! can(t)){                   s.X = a[0].X + d ;                   t.X = a[1].X + d ;                   s.Y = a[0].Y ;                   t.Y = a[1].Y ;                   if(! can(s) || ! can(t)) ok = 0 ;              }         }         else if(a[0].X != a[1].X && a[0].Y == a[1].Y){              d = a[1].X - a[0].X ;              s.Y = a[0].Y + d ;              t.Y = a[1].Y + d ;              s.X = a[0].X ;              t.X = a[1].X ;              if(! can(s) || ! can(t)){                   s.Y = a[0].Y - d ;                   t.Y = a[1].Y - d ;                   s.X = a[0].X ;                   t.X = a[1].X ;                   if(! can(s) || ! can(t)) ok = 0 ;              }         }         else{              if(abs(a[1].Y - a[0].Y) != abs(a[1].X - a[0].X)) ok = 0 ;              s.X = a[0].X ;              s.Y = a[1].Y ;              t.X = a[1].X ;              t.Y = a[0].Y ;              if(! can(s) || ! can(t)) ok = 0 ;         }         if(ok) printf("%d %d %d %d\n" ,s.X ,s.Y , t.X , t.Y) ;         else   puts("-1")  ;    }    return 0;}

B XX

C

组合数学,打印全排列

typedef   long  long  LL ;LL  n , k , d ;int  ok(){     LL t = 1 ;     for(int i = 1; i <= d ; i++){        t *= k ;        if(t >= n) return 1 ;     }     return 0 ;}int  c[1008][1008] ;int  selc[1008] ;int  over ;void  dfs(int id , int &col){      if(over)  return  ;      if(col == n+1){ over = 1 ; return ;} ;      if(id == d+1){            for(int i = 1 ; i <= d ; i++)  c[i][col] = selc[i] ;            col++ ;            return  ;      }      for(int i = 1 ; i <= min(k , n ) ; i++){          selc[id] = i ;          dfs(id+1 , col) ;      }}int main(){    while(cin>>n>>k>>d){         if(ok()){               over = 0 ;               int col = 1 ;               dfs(1 , col) ;               for(int i = 1 ; i <= d ; i++){                    printf("%d" , c[i][1]) ;                    for(int j = 2 ; j <= n ; j++) printf(" %d" , c[i][j]) ;                    puts("") ;               }         }         else puts("-1") ;    }    return 0;}


D

 转换成树状数组来做。

typedef   long  long  LL ;const  int  maxn = 1000008 ;int  g[maxn] ;int  n ;inline int lowbit(int x){       return x & (-x) ;}void into(int id , int d){     for(int i = id ; i <= n ; i += lowbit(i)) g[i] += d ;}int  sum(int id){     int t = 0 ;     for(int i = id ; i >= 1 ; i -= lowbit(i)) t += g[i] ;     return t ;}int  a[maxn] , c[maxn]  ;int  cnt[maxn]  ;int main(){    int  i  , m  ;    while(cin>>n){         for(i = 1 ; i <= n ; i++){              scanf("%d" , &a[i]) ;              c[i-1] = a[i] ;         }         sort(c , c+n) ;         m = unique(c , c+n) - c ;         for(i = 1 ; i <= n ; i++)              a[i] = upper_bound(c , c+m , a[i]) - c ;         memset(cnt , 0 , sizeof(cnt)) ;         for(i = 1 ; i <= n ; i++) c[i] = ++cnt[a[i]] ;         memset(g , 0 , sizeof(g)) ;         memset(cnt , 0 , sizeof(cnt)) ;         LL  ans = 0 ;         for(i = n ; i >= 1 ; i--){             ans += sum(c[i] - 1) ;             into(++cnt[a[i]] , 1) ;         }         cout<< ans << endl ;    }    return 0;}

E 贪心,按w排序 每次更新

const  int  maxn = 300008 ;int  n , m ;struct  state{        int u , v , w ;        friend bool operator < (const state &a , const state &b){               return a.w < b.w ;        }}g[maxn] ;int  d[maxn] , pd[maxn] ;int  main(){     int i , j ;     while(cin>>n>>m){          for(i = 0 ; i < m ; i++)              scanf("%d%d%d",&g[i].u , &g[i].v , &g[i].w) ;          sort(g , g+m) ;          memset(d , 0 , sizeof(d)) ;          memset(pd , 0 , sizeof(pd)) ;          for(i = 0 ; i < m ; i++){              j = i ;              while(j < m && g[i].w == g[j].w) j++ ;              for(int k = i ; k < j ; k++)                  d[g[k].v]= max(d[g[k].v] , pd[g[k].u]+1) ;              for(int k = i ; k < j ; k++)                  pd[g[k].v]= d[g[k].v] ;              i = j - 1 ;          }          int t = *max_element(d+1 , d+1+n) ;          cout<< t << endl ;     }     return  0 ;}


0 0
原创粉丝点击