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