교육 Codeforces Round 33 (Rated for Div. 2) A - C 문제 풀이

CF 문 제 를 풀 어 블 로그 조회 수 를 어렵 게 유 지 했 지만 점수 가 올 라 기쁘다.마지막 초 에 C 문 제 를 넘 기 는 것 도 상당히 자극적이다.
A. Chess For Three
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Alex, Bob and Carl will soon participate in a team chess tournament. Since they are all in the same team, they have decided to practise really hard before the tournament. But it's a bit difficult for them because chess is a game for two players, not three.
So they play with each other according to following rules:
Alex and Bob play the first game, and Carl is spectating;
When the game ends, the one who lost the game becomes the spectator in the next game, and the one who was spectating plays against the winner.
Alex, Bob and Carl play in such a way that there are no draws.
Today they have played n games, and for each of these games they remember who was the winner. They decided to make up a log of games describing who won each game. But now they doubt if the information in the log is correct, and they want to know if the situation described in the log they made up was possible (that is, no game is won by someone who is spectating if Alex, Bob and Carl play according to the rules). Help them to check it!
Input
The first line contains one integer n (1 ≤ n ≤ 100) — the number of games Alex, Bob and Carl played.
Then n lines follow, describing the game log. i-th line contains one integer ai (1 ≤ ai ≤ 3) which is equal to 1 if Alex won i-th game, to 2if Bob won i-th game and 3 if Carl won i-th game.
Output
Print YES if the situation described in the log was possible. Otherwise print NO.
Examples
input
3
1
1
2

output
YES

input
2
1
2

output
NO

Note
In the first example the possible situation is:
Alex wins, Carl starts playing instead of Bob;
Alex wins, Bob replaces Carl;
Bob wins.
The situation in the second example is impossible because Bob loses the first game, so he cannot win the second one.
바로 세 명의 꼬마 가 바둑 을 둘 일이 없다. 1 과 2 를 먼저 겨 루 고 진 사람 은 방관자 가 되 고 승 자 는 방관자 와 비교 해서 제 시 된 인원수 의 서열 이 합 법 적 인지 물 었 다.
꿈 도 꾸 지 마 세 요. 시 뮬 레이 션.......................................................
코드 구현:
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define mset(a,x) memset(a,x,sizeof(a))

using namespace std;
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}

int main()
{
	int map[1000],n,i,j,k;
	int x=3;
    	int a=1;
    	int b=2;
	cin>>n;
	for(i=0;i>k;
		if(k==x)
		{
			cout<

B. Beautiful Divisors
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Recently Luba learned about a special kind of numbers that she calls beautiful numbers. The number is called beautiful iff its binary representation consists of k + 1 consecutive ones, and then k consecutive zeroes.
Some examples of beautiful numbers:
12 (110);
1102 (610);
11110002 (12010);
1111100002 (49610).
More formally, the number is beautiful iff there exists some positive integer k such that the number is equal to (2k - 1) * (2k - 1).
Luba has got an integer number n, and she wants to find its greatest beautiful divisor. Help her to find it!
Input
The only line of input contains one number n (1 ≤ n ≤ 105) — the number Luba has got.
Output
Output one number — the greatest beautiful divisor of Luba's number. It is obvious that the answer always exists.
Examples
input
3

output
1

input
992

output
496

아름 다운 숫자의 정 의 를 내 립 니 다. 즉, 이 진 에서 앞 k + 1 위 는 1 이 고 뒤 k 위 는 0 입 니 다. n 의 인자 중 가장 조건 에 부합 되 는 수 는 얼마 입 니까?
시 계 를 쳐 보 니 10 ^ 5 에서 8 개의 숫자 가 나 왔 습 니 다. 그리고 저 는 최적화 시 뮬 레이 션 을 했 습 니 다. WA test 4 를 계속 한 다음 에 아예 폭력 적 이 고 지나 갔습니다. 할 말 이 없습니다.
코드 구현:
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define mset(a,x) memset(a,x,sizeof(a))

using namespace std;
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
int ans[]={1,6,28,120,496,2016,8128,32640,130816,523776,2096128,8386560,33550336,134209536,536854528,2147450880};

int main()
{
	int i,j,k=0,sum=0,a=0,n;
	while(cin>>n)
	{
		int maxx=0;
		for(i=1;i<=n;i++)
		{
			if(n%i==0)
			{
				for(j=0;j<10;j++)
				{
					if(i==ans[j])
					{
						maxx=max(maxx,i);
						break;
					}
				}
			}
		}
		cout<

C. Rumor
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Vova promised himself that he would never play computer games... But recently Firestorm — a well-known game developing company — published their newest game, World of Farcraft, and it became really popular. Of course, Vova started playing it.
Now he tries to solve a quest. The task is to come to a settlement named Overcity and spread a rumor in it.
Vova knows that there are n characters in Overcity. Some characters are friends to each other, and they share information they got. Also Vova knows that he can bribe each character so he or she starts spreading the rumor; i-th character wants ci gold in exchange for spreading the rumor. When a character hears the rumor, he tells it to all his friends, and they start spreading the rumor to their friends (for free), and so on.
The quest is finished when all n characters know the rumor. What is the minimum amount of gold Vova needs to spend in order to finish the quest?
Take a look at the notes if you think you haven't understood the problem completely.
Input
The first line contains two integer numbers n and m (1 ≤ n ≤ 105, 0 ≤ m ≤ 105) — the number of characters in Overcity and the number of pairs of friends.
The second line contains n integer numbers ci (0 ≤ ci ≤ 109) — the amount of gold i-th character asks to start spreading the rumor.
Then m lines follow, each containing a pair of numbers (xi, yi) which represent that characters xi and yi are friends (1 ≤ xi, yi ≤ n,xi ≠ yi). It is guaranteed that each pair is listed at most once.
Output
Print one number — the minimum amount of gold Vova has to spend in order to finish the quest.
Examples
input
5 2
2 5 3 4 8
1 4
4 5

output
10

input
10 0
1 2 3 4 5 6 7 8 9 10

output
55

input
10 5
1 6 2 7 3 8 4 9 5 10
1 2
3 4
5 6
7 8
9 10

output
15

Note
In the first example the best decision is to bribe the first character (he will spread the rumor to fourth character, and the fourth one will spread it to fifth). Also Vova has to bribe the second and the third characters, so they know the rumor.
In the second example Vova has to bribe everyone.
In the third example the optimal decision is to bribe the first, the third, the fifth, the seventh and the ninth characters.
이 문 제 는 n 개의 수 를 입력 한 다음 에 m 대 수 를 입력 하 는 것 이다. 각 대수 간 의 교 류 는 비용 이 들 지 않 고 마지막 에 최소 비용 이 얼마 인지 물 어 보 는 것 이다.
모든 관계 가 있 는 중 가장 작은 것 을 찾 을 수 있 고 dfs 에서 연결 블록 을 구 할 수 있 으 며 최소 값 을 유지 할 수 있 습 니 다. 마지막 초 에 제출 하 는 것 은 정말 자극 적 입 니 다.
코드 구현:
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define mset(a,x) memset(a,x,sizeof(a))

using namespace std;
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
int pre[1000005];
int map[maxn],ans[maxn];
int find(int x){
    int r=x;
    while (pre[r]!=r){
        r=pre[r];
    }
    int i=x;
    int temp;
    while (i!=r){
        temp=pre[i];
        pre[i]=r;
        i=temp;
    }
    return r;

}
void join(int x,int y){
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy){
        pre[fx]=fy;
    }
}


int main()
{
	int n,m,i,j,k,aa,bb;
	while(cin>>n>>m)
	{
		for(i=1;i<=n;i++)
		cin>>map[i];
		for (int i=1;i<=n;i++) pre[i]=i;
		for (int i=0;i

좋은 웹페이지 즐겨찾기