本文主要是介绍Codeforces Round #261 (Div. 2)小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 ;
}
这篇关于Codeforces Round #261 (Div. 2)小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!