Educational Codeforces Round 33 (Rated for Div. 2)
来源:互联网 发布:格式工厂是什么软件 编辑:程序博客网 时间:2024/05/22 05:08
传送门 : http://codeforces.com/contest/893
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!
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.
Print YES if the situation described in the log was possible. Otherwise print NO.
3112
YES
212
NO
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.
#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;}模拟失败者,看看是否出现逻辑错误。
#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;}
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.
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.
Print one number — the minimum amount of gold Vova has to spend in order to finish the quest.
5 22 5 3 4 81 44 5
10
10 01 2 3 4 5 6 7 8 9 10
55
10 51 6 2 7 3 8 4 9 5 101 23 45 67 89 10
15
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记录祖先最小值
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)B
- Educational Codeforces Round 33 (Rated for Div. 2) C
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2) A
- Educational Codeforces Round 33 (Rated for Div. 2) B
- Educational Codeforces Round 33 (Rated for Div. 2) C
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2) 题解
- Educational Codeforces Round 33 (Rated for Div. 2) F
- Educational Codeforces Round 34 (Rated for Div. 2) D
- Educational Codeforces Round 34 (Rated for Div. 2)
- Educational Codeforces Round 34 (Rated for Div. 2) D
- Educational Codeforces Round 34 (Rated for Div. 2) D
- Educational Codeforces Round 34 (Rated for Div. 2) C
- Educational Codeforces Round 34 (Rated for Div. 2) D
- Educational Codeforces Round 33 (Rated for Div. 2) 893A. Chess For Three
- tips
- 5.3
- 多线程中的LOCK锁
- 剑指offer---二维数组中的查找(3)
- iOS 各种demo链接汇总~HUD与Toast
- Educational Codeforces Round 33 (Rated for Div. 2)
- SSH框架:Spring和hibernate整合时出现的异常
- 知识点
- 个人知乎 ##基础二-WEB知识
- FZU
- 知识点
- findViewById的问题和inflate(0方法
- UOJ#57:[WC2013]平面图(最小左转法+点定位)
- 计算并输出100以内所有含7的或7的倍数的数