生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #756 (Div. 3)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Codeforces Round #756 (Div. 3)
A. Make Even
思路:如果末尾是偶數(shù),不需要操作;如果開(kāi)頭是偶數(shù),一次操作,即全翻轉(zhuǎn);如果開(kāi)頭和末尾都是 奇數(shù),判斷里面是否有偶數(shù),如果沒(méi)有,無(wú)法操作,如果有,需要兩次操作。
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i, n) for ( int i = 0 ; i < n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
string str
;
int a
[ N
] ;
void solve ( )
{ cin
>> str
; int len
= str
. length ( ) ; int ff
= - 1 ; int kk
= 0 ; for ( int i
= 0 ; i
< len
; i
++ ) { a
[ i
] = str
[ i
] - '0' ; if ( a
[ i
] % 2 == 0 ) kk
= 1 ; } if ( a
[ 0 ] % 2 == 0 ) ff
= 1 ; if ( a
[ len
- 1 ] % 2 == 0 ) ff
= 0 ; if ( ff
== - 1 && kk
) ff
= 2 ; cout
<< ff
<< endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
B. Team Composition: Programmers and Mathematicians
思路:先看總?cè)藬?shù)能組成多少隊(duì),然后再限制。
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i, n) for ( int i = 0 ; i < n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
string str
;
int a
[ N
] ;
void solve ( )
{ int a
, b
; cin
>> a
>> b
; int cou
= ( a
+ b
) / 4 ; cou
= min ( cou
, min ( a
, b
) ) ; cout
<< cou
<< endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
C. Polycarp Recovers the Permutation
思路:首先,最大的數(shù)應(yīng)該在最外面,不是最左邊就是最右邊。其次,如果它在最左邊,那就只要一開(kāi)始它在最右邊,就可以控制其他數(shù)反向輸出,右邊同理。 example : 5 3 2 4 1 → 1 4 2 3 5
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i) for ( int i = 1 ; i <= n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
int a
[ N
] ;
void solve ( )
{ int n
; cin
>> n
; for ( int i
= 0 ; i
< n
; i
++ ) { cin
>> a
[ i
] ; } if ( a
[ 0 ] != n
&& a
[ n
- 1 ] != n
) { cout
<< - 1 << endl
; return ; } for ( int i
= n
- 1 ; i
>= 0 ; i
-- ) { cout
<< a
[ i
] << " " ; } cout
<< endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
D. Weights Assignment For Tree Edges
題目意思:先給出每個(gè)數(shù)父節(jié)點(diǎn)。下一行給出每一位dist的大小排序(我覺(jué)得這里有點(diǎn)難讀)。 example : [3 1 2 5 4] → 節(jié)點(diǎn)三是最小的,其次是一,然后二,五,四。 思路:先判斷最小的是不是父節(jié)點(diǎn)。然后我們不妨給出dist[i] = i。 然后每一個(gè)節(jié)點(diǎn)的w就是它的dist-父節(jié)點(diǎn)的dist。 千萬(wàn)不要忘了,你是求w[i],不是dist[i]
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i) for ( int i = 1 ; i <= n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
int p
[ N
] , fa
[ N
] , ans
[ N
] ;
void solve ( )
{ int n
; cin
>> n
; for ( int i
= 1 ; i
<= n
; i
++ ) cin
>> fa
[ i
] ; for ( int i
= 1 ; i
<= n
; i
++ ) cin
>> p
[ i
] , ans
[ i
] = 0 ; if ( p
[ 1 ] != fa
[ p
[ 1 ] ] ) { cout
<< - 1 << endl
; return ; } ans
[ p
[ 1 ] ] = 1 ; for ( int i
= 2 ; i
<= n
; i
++ ) { if ( ! ans
[ fa
[ p
[ i
] ] ] ) { cout
<< - 1 << endl
; return ; } ans
[ p
[ i
] ] = i
; } for ( int i
= 1 ; i
<= n
; i
++ ) { cout
<< ans
[ i
] - ans
[ fa
[ i
] ] << " " ; 輸出w
[ i
] ; } cout
<< endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
E1. Escape The Maze (easy version)
題目大意:朋友和你同時(shí)走,是否在朋友之前走到出口,即葉節(jié)點(diǎn)。 思路:bfs多源問(wèn)題,因?yàn)槭峭瑫r(shí)動(dòng),所以可以用bfs找出口,如果有一條路可以在朋友之前走完,就是可行的。注意:處理上要先存朋友的位置,因?yàn)榕笥押湍阃瑫r(shí)到達(dá)的位置也不可以走。
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i) for ( int i = 1 ; i <= n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
vector
< int > cun
[ N
] ;
queue
< PII
> q
;
int n
, k
;
int vis
[ N
] ;
int a
[ N
] ;
bool bfs ( )
{ memset ( vis
, 0 , sizeof vis
) ; for ( int i
= 0 ; i
< k
; i
++ ) { q
. push ( { a
[ i
] , 0 } ) ; vis
[ a
[ i
] ] = 1 ; } vis
[ 1 ] = 1 ; q
. push ( { 1 , 1 } ) ; while ( q
. size ( ) ) { PII tmp
= q
. front ( ) ; q
. pop ( ) ; int now
= tmp
. ff
; if ( now
!= 1 && cun
[ now
] . size ( ) == 1 && tmp
. ss
== 1 ) return 1 ; for ( auto i
: cun
[ now
] ) { if ( vis
[ i
] ) continue ; vis
[ i
] = 1 ; q
. push ( { i
, tmp
. ss
} ) ; } } return 0 ;
}
void solve ( )
{ int x
, y
; cin
>> n
>> k
; for ( int i
= 0 ; i
< k
; i
++ ) cin
>> a
[ i
] ; for ( int i
= 1 ; i
<= n
; i
++ ) cun
[ i
] . clear ( ) ; for ( int i
= 1 ; i
< n
; i
++ ) { cin
>> x
>> y
; cun
[ x
] . push_back ( y
) ; cun
[ y
] . push_back ( x
) ; } while ( q
. size ( ) ) q
. pop ( ) ; cout
<< ( bfs ( ) ? "YES" : "NO" ) << endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
E2. Escape The Maze (hard version)
題意:就是朋友太多了,他們想用最少的朋友堵住他。如果本身就堵不住,那就輸出-1; 思路:和上一題一樣,多加一個(gè)他走不過(guò)去的地方都是什么朋友卡住。然后輸出卡住他的朋友的數(shù)量
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i) for ( int i = 1 ; i <= n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
vector
< int > cun
[ N
] ;
queue
< PII
> q
;
int n
, k
;
int from
[ N
] ;
int vis
[ N
] ;
int a
[ N
] ;
set
< int > st
;
int bfs ( )
{ st
. clear ( ) ; memset ( vis
, 0 , sizeof vis
) ; for ( int i
= 0 ; i
< k
; i
++ ) { q
. push ( { a
[ i
] , 0 } ) ; from
[ a
[ i
] ] = a
[ i
] ; vis
[ a
[ i
] ] = 1 ; } vis
[ 1 ] = 1 ; q
. push ( { 1 , 1 } ) ; from
[ 1 ] = 1 ; while ( q
. size ( ) ) { PII tmp
= q
. front ( ) ; q
. pop ( ) ; int now
= tmp
. ff
; if ( now
!= 1 && cun
[ now
] . size ( ) == 1 && tmp
. ss
== 1 ) return - 1 ; for ( auto i
: cun
[ now
] ) { if ( vis
[ i
] ) { if ( from
[ now
] == 1 && from
[ i
] != 1 ) st
. insert ( from
[ i
] ) ; continue ; } from
[ i
] = from
[ now
] ; vis
[ i
] = 1 ; q
. push ( { i
, tmp
. ss
} ) ; } } return st
. size ( ) ;
}
void solve ( )
{ int x
, y
; cin
>> n
>> k
; for ( int i
= 0 ; i
< k
; i
++ ) cin
>> a
[ i
] ; for ( int i
= 1 ; i
<= n
; i
++ ) cun
[ i
] . clear ( ) ; for ( int i
= 1 ; i
< n
; i
++ ) { cin
>> x
>> y
; cun
[ x
] . push_back ( y
) ; cun
[ y
] . push_back ( x
) ; } while ( q
. size ( ) ) q
. pop ( ) ; cout
<< bfs ( ) << endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
F. ATM and Students
題意:找一段學(xué)生取錢(qián)或者存錢(qián); 思路:雙指針,固定左邊取右邊。右邊一定大于等于上一次的右邊。 證明:如果a[l]是正數(shù),那么去除后,上次的右邊結(jié)束的值一定小于大于這次,上次小于0,所以這次也小于0,如果是負(fù)數(shù),那么過(guò)程中肯定始終大于上次過(guò)程。
# include <bits/stdc++.h>
# define int long long
# define PII pair< int , int >
# define endl "\n"
# define fast ios_base:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 )
# define fer ( i) for ( int i = 1 ; i <= n; i++ )
# define ff first
# define ss second
using namespace std
;
const int N
= 3e5 + 11 ;
int a
[ N
] ;
void solve ( )
{ int n
, s
; cin
>> n
>> s
; int tt
= 0 ; for ( int i
= 0 ; i
< n
; i
++ ) { cin
>> a
[ i
] ; } int ansr
, ansl
, maxn
= 0 ; while ( a
[ tt
] + s
< 0 ) ++ tt
; int sum
= a
[ tt
] ; for ( int l
= tt
, r
= tt
; l
< n
; l
++ ) { while ( r
+ 1 < n
&& s
+ sum
+ a
[ r
+ 1 ] >= 0 ) sum
+= a
[ ++ r
] ; if ( s
+ sum
>= 0 && maxn
< r
- l
+ 1 ) { maxn
= r
- l
+ 1 ; ansr
= r
; ansl
= l
; } sum
-= a
[ l
] ; } if ( maxn
<= 0 ) cout
<< "-1" << endl
; else cout
<< ansl
+ 1 << " " << ansr
+ 1 << endl
;
}
signed main ( )
{ fast
; int t
; cin
>> t
; while ( t
-- ) solve ( ) ;
}
總結(jié)
以上是生活随笔 為你收集整理的Codeforces Round #756 (Div. 3) 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。