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