Codeforces Round #261 (Div. 2)小记

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

#define  X  first
#define  Y  second

vector<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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值