Educational Codeforces Round 33 (Rated for Div. 2)

来源:互联网 发布:格式工厂是什么软件 编辑:程序博客网 时间:2024/05/22 05:08

传送门 : http://codeforces.com/contest/893

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 2 if 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
3112
output
YES
input
212
output
NO
Note

In the first example the possible situation is:

  1. Alex wins, Carl starts playing instead of Bob;
  2. Alex wins, Bob replaces Carl;
  3. Bob wins.

The situation in the second example is impossible because Bob loses the first game, so he cannot win the second one.

A题 水题 模拟过程,3个人玩游戏,2个人玩一个人看着,输了换人。

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int a[105];int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);int win,los;int flag=1;if(a[0]==1)los=2;else if(a[0]==2)los=1;elseflag=0;for(int i=1;i<n && flag;i++){if(a[i]==los){flag=0;break;}else{if(a[i]==1 && los==2)los=3;else if(a[i]==1 && los==3)los=2;else if(a[i]==2 && los==1)los=3;else if(a[i]==2 && los==3)los=1; else if(a[i]==3 && los==1)los=2;else if(a[i]==3 && los==2)los=1;}}if(flag)printf("YES\n");elseprintf("NO\n"); return 0;} 
模拟失败者,看看是否出现逻辑错误。

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

找特殊的数,总共就八个,直接分解因子判断就好了。

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int a[10]={1,6,28,120,496,2016,8128,32640};int b[10000];int main(){int n,i;scanf("%d",&n);int temp=n;int C=0;for(int i=1;i<=sqrt(temp);i++){if(temp%i==0){if(temp/i!=i){b[C++]=i;b[C++]=temp/i;}elseb[C++]=i; }}sort(b,b+C);int flag=1;for(int i=C-1;i>=0 && flag;i--){for(int j=0;j<=7  && flag;j++){if(b[i]==a[j]){printf("%d\n",b[i]);flag=0;break;}}}return 0;}

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 ≤ nxi ≠ 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 22 5 3 4 81 44 5
output
10
input
10 01 2 3 4 5 6 7 8 9 10
output
55
input
10 51 6 2 7 3 8 4 9 5 101 23 45 67 89 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.


裸的并查集 加一个维护最小数就Ok了

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int pre[1000005];int min1[1000005];int Find(int x)  {      int r=x;      while(r!=pre[r])          r=pre[r];            int i=x,j;      while(pre[i]!=r)      {          j=pre[i];          pre[i]=r;          i=j;      }      return r;  }  void mix(int x,int y)  {      int fx=Find(x),fy=Find(y);      if(fx!=fy)      {          pre[fy]=fx;          min1[fx]=min(min1[fx],min1[fy]);    }  }   int main(){int n,m,x,y;scanf("%d%d",&n,&m);for(int i=0;i<=n;i++)pre[i]=i;for(int i=1;i<=n;i++)scanf("%d",&min1[i]);for(int i=0;i<m;i++){scanf("%d%d",&x,&y);mix(x,y);}long long sum=0;for(int i=1;i<=n;i++){if(pre[i]==i)sum=sum+min1[i];}printf("%I64d\n",sum);return 0;}

pre记录祖先  min1记录祖先最小值