Codeforces Round #384 (Div. 2) A B C D dfs序+求两个不相交区间 最大权值和
2017-03-12 19:50
302 查看
A. Vladik and flights
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Vladik is a competitive programmer. This year he is going to win the International Olympiad in Informatics. But it is not as easy as it sounds: the question Vladik face now is to find the cheapest way to get to the olympiad.
Vladik knows n airports. All the airports are located on a straight line. Each airport has unique id from 1 to n, Vladik's house is situated next to the airport with id a, and the place of the olympiad is situated next to the airport with id b. It is possible that Vladik's house and the place of the olympiad are located near the same airport.
To get to the olympiad, Vladik can fly between any pair of airports any number of times, but he has to start his route at the airport a and finish it at the airport b.
Each airport belongs to one of two companies. The cost of flight from the airport i to the airport j is zero if both airports belong to the same company, and |i - j| if they belong to different companies.
Print the minimum cost Vladik has to pay to get to the olympiad.
Input
The first line contains three integers n, a, and b (1 ≤ n ≤ 105, 1 ≤ a, b ≤ n) — the number of airports, the id of the airport from which Vladik starts his route and the id of the airport which he has to reach.
The second line contains a string with length n, which consists only of characters 0 and 1. If the i-th character in this string is 0, then i-th airport belongs to first company, otherwise it belongs to the second.
Output
Print single integer — the minimum cost Vladik has to pay to get to the olympiad.
Examples
Input
Output
Input
Output
Note
In the first example Vladik can fly to the airport 2 at first and pay |1 - 2| = 1 (because the airports belong to different companies), and then fly from the airport 2 to the airport 4 for free (because the airports belong to the same company). So the cost of the whole flight is equal to 1. It's impossible to get to the olympiad for free, so the answer is equal to 1.
In the second example Vladik can fly directly from the airport 5 to the airport 2, because they belong to the same company.
题意:n个机场 起点a 终点b 给你长度魏n的01串 符号相同表示机场属于同一家公司 相同公司通航免费 不同公司通航费用为abs(i-j) 输出最小的花费
题解:细细分析一下 相同公司的花费为零 不同公司任意点的花费为1 水
B. Chloe and the sequence
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems to get to the olympiad like Vladik, but she was confused by the task proposed on the olympiad.
Let's consider the following algorithm of generating a sequence of integers. Initially we have a sequence consisting of a single element equal to 1. Then we perform (n - 1) steps. On each step we take the sequence we've got on the previous step, append it to the end of itself and insert in the middle the minimum positive integer we haven't used before. For example, we get the sequence [1, 2, 1] after the first step, the sequence [1, 2, 1, 3, 1, 2, 1] after the second step.
The task is to find the value of the element with index k (the elements are numbered from 1) in the obtained sequence, i. e. after (n - 1) steps.
Please help Chloe to solve the problem!
Input
The only line contains two integers n and k (1 ≤ n ≤ 50, 1 ≤ k ≤ 2n - 1).
Output
Print single integer — the integer at the k-th position in the obtained sequence.
Examples
Input
Output
Input
Output
Note
In the first sample the obtained sequence is [1, 2, 1, 3, 1, 2, 1]. The number on the second position is 2.
In the second sample the obtained sequence is [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]. The number on the eighth position is 4.
题意:按照题目要求生成序列 问第k个数是什么
题解:将k转换为二进制 可以发现结果为末尾零的个数加一
C. Vladik and fractions
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Vladik and Chloe decided to determine who of them is better at math. Vladik claimed that for any positive integer n he can represent fraction
as a sum of three distinct positive fractions in form
.
Help Vladik with that, i.e for a given n find three distinct positive integers x, y and z such that
. Because Chloe can't check Vladik's answer if the numbers are large, he asks you to print numbers not exceeding 109.
If there is no such answer, print -1.
Input
The single line contains single integer n (1 ≤ n ≤ 104).
Output
If the answer exists, print 3 distinct numbers x, y and z (1 ≤ x, y, z ≤ 109, x ≠ y, x ≠ z, y ≠ z). Otherwise print -1.
If there are multiple answers, print any of them.
Examples
Input
Output
Input
Output
D. Chloe and pleasant prizes
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Generous sponsors of the olympiad in which Chloe and Vladik took part allowed all the participants to choose a prize for them on their own. Christmas is coming, so sponsors decided to decorate the Christmas tree with their prizes.
They took n prizes for the contestants and wrote on each of them a unique id (integer from 1 to n). A gift i is characterized by integer ai — pleasantness of the gift. The pleasantness of the gift can be positive, negative or zero. Sponsors placed the gift 1 on the top of the tree. All the other gifts hung on a rope tied to some other gift so that each gift hung on the first gift, possibly with a sequence of ropes and another gifts. Formally, the gifts formed a rooted tree with n vertices.
The prize-giving procedure goes in the following way: the participants come to the tree one after another, choose any of the remaining gifts and cut the rope this prize hang on. Note that all the ropes which were used to hang other prizes on the chosen one are not cut. So the contestant gets the chosen gift as well as the all the gifts that hang on it, possibly with a sequence of ropes and another gifts.
Our friends, Chloe and Vladik, shared the first place on the olympiad and they will choose prizes at the same time! To keep themselves from fighting, they decided to choose two different gifts so that the sets of the gifts that hang on them with a sequence of ropes and another gifts don't intersect. In other words, there shouldn't be any gift that hang both on the gift chosen by Chloe and on the gift chosen by Vladik. From all of the possible variants they will choose such pair of prizes that the sum of pleasantness of all the gifts that they will take after cutting the ropes is as large as possible.
Print the maximum sum of pleasantness that Vladik and Chloe can get. If it is impossible for them to choose the gifts without fighting, print Impossible.
Input
The first line contains a single integer n (1 ≤ n ≤ 2·105) — the number of gifts.
The next line contains n integers a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — the pleasantness of the gifts.
The next (n - 1) lines contain two numbers each. The i-th of these lines contains integers ui and vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — the description of the tree's edges. It means that gifts with numbers ui and vi are connected to each other with a rope. The gifts' ids in the description of the ropes can be given in arbirtary order: vi hangs on ui or ui hangs on vi.
It is guaranteed that all the gifts hang on the first gift, possibly with a sequence of ropes and another gifts.
Output
If it is possible for Chloe and Vladik to choose prizes without fighting, print single integer — the maximum possible sum of pleasantness they can get together.
Otherwise print Impossible.
Examples
Input
Output
Input
Output
Input
Output
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Vladik is a competitive programmer. This year he is going to win the International Olympiad in Informatics. But it is not as easy as it sounds: the question Vladik face now is to find the cheapest way to get to the olympiad.
Vladik knows n airports. All the airports are located on a straight line. Each airport has unique id from 1 to n, Vladik's house is situated next to the airport with id a, and the place of the olympiad is situated next to the airport with id b. It is possible that Vladik's house and the place of the olympiad are located near the same airport.
To get to the olympiad, Vladik can fly between any pair of airports any number of times, but he has to start his route at the airport a and finish it at the airport b.
Each airport belongs to one of two companies. The cost of flight from the airport i to the airport j is zero if both airports belong to the same company, and |i - j| if they belong to different companies.
Print the minimum cost Vladik has to pay to get to the olympiad.
Input
The first line contains three integers n, a, and b (1 ≤ n ≤ 105, 1 ≤ a, b ≤ n) — the number of airports, the id of the airport from which Vladik starts his route and the id of the airport which he has to reach.
The second line contains a string with length n, which consists only of characters 0 and 1. If the i-th character in this string is 0, then i-th airport belongs to first company, otherwise it belongs to the second.
Output
Print single integer — the minimum cost Vladik has to pay to get to the olympiad.
Examples
Input
4 1 4 1010
Output
1
Input
5 5 2 10110
Output
0
Note
In the first example Vladik can fly to the airport 2 at first and pay |1 - 2| = 1 (because the airports belong to different companies), and then fly from the airport 2 to the airport 4 for free (because the airports belong to the same company). So the cost of the whole flight is equal to 1. It's impossible to get to the olympiad for free, so the answer is equal to 1.
In the second example Vladik can fly directly from the airport 5 to the airport 2, because they belong to the same company.
题意:n个机场 起点a 终点b 给你长度魏n的01串 符号相同表示机场属于同一家公司 相同公司通航免费 不同公司通航费用为abs(i-j) 输出最小的花费
题解:细细分析一下 相同公司的花费为零 不同公司任意点的花费为1 水
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include <map> #define ll __int64 #define mod 1000000007 #define dazhi 2147483647 const int N=100005; using namespace std; int n,a,b; char c[100005]; int main() { scanf("%d %d %d",&n,&a,&b); getchar(); for(int i=1;i<=n;i++) scanf("%c",&c[i]); if(c[a]==c[b]) { printf("0\n"); return 0; } else { printf("1\n"); } return 0; }
B. Chloe and the sequence
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems to get to the olympiad like Vladik, but she was confused by the task proposed on the olympiad.
Let's consider the following algorithm of generating a sequence of integers. Initially we have a sequence consisting of a single element equal to 1. Then we perform (n - 1) steps. On each step we take the sequence we've got on the previous step, append it to the end of itself and insert in the middle the minimum positive integer we haven't used before. For example, we get the sequence [1, 2, 1] after the first step, the sequence [1, 2, 1, 3, 1, 2, 1] after the second step.
The task is to find the value of the element with index k (the elements are numbered from 1) in the obtained sequence, i. e. after (n - 1) steps.
Please help Chloe to solve the problem!
Input
The only line contains two integers n and k (1 ≤ n ≤ 50, 1 ≤ k ≤ 2n - 1).
Output
Print single integer — the integer at the k-th position in the obtained sequence.
Examples
Input
3 2
Output
2
Input
4 8
Output
4
Note
In the first sample the obtained sequence is [1, 2, 1, 3, 1, 2, 1]. The number on the second position is 2.
In the second sample the obtained sequence is [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]. The number on the eighth position is 4.
题意:按照题目要求生成序列 问第k个数是什么
题解:将k转换为二进制 可以发现结果为末尾零的个数加一
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include <map> #define ll __int64 #define mod 1000000007 #define dazhi 2147483647 const int N=100005; using namespace std; ll n,k; int main() { scanf("%I64d %I64d",&k,&n); ll ans=0; while(((n>>ans)&1)==0) ans++; printf("%d\n",ans+1); return 0; }
C. Vladik and fractions
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Vladik and Chloe decided to determine who of them is better at math. Vladik claimed that for any positive integer n he can represent fraction
as a sum of three distinct positive fractions in form
.
Help Vladik with that, i.e for a given n find three distinct positive integers x, y and z such that
. Because Chloe can't check Vladik's answer if the numbers are large, he asks you to print numbers not exceeding 109.
If there is no such answer, print -1.
Input
The single line contains single integer n (1 ≤ n ≤ 104).
Output
If the answer exists, print 3 distinct numbers x, y and z (1 ≤ x, y, z ≤ 109, x ≠ y, x ≠ z, y ≠ z). Otherwise print -1.
If there are multiple answers, print any of them.
Examples
Input
3
Output
2 7 42
Input
7
Output
7 8 56 题意:公式题目 题解:我是莫名其妙暴力出来的 看了别人的题解 是直接分解式子的 2/n=1/n+1/(n+1)+1/n*(n+1)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include <map> #define ll __int64 #define mod 1000000007 #define dazhi 2147483647 const int N=100005; using namespace std; int n; ll x1,x2,x3; int main() { scanf("%d",&n); int i=n; while(i) { if(2*i>n) { x1=i; break; } i++; } ll zi1,mu1; zi1=2*x1-n; mu1=n*x1; i=x1+1; while(i) { if(zi1*i>mu1) { x2=i; break; } i++; } ll zi2,mu2; zi2=zi1*x2-mu1; mu2=mu1*x2; if(mu2%zi2==0) { x3=mu2/zi2; if(x1!=x3&&x2!=x3) { cout<<x1<<" "<<x2<<" "<<x3<<endl; return 0; } } cout<<"-1"<<endl; return 0; }
D. Chloe and pleasant prizes
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Generous sponsors of the olympiad in which Chloe and Vladik took part allowed all the participants to choose a prize for them on their own. Christmas is coming, so sponsors decided to decorate the Christmas tree with their prizes.
They took n prizes for the contestants and wrote on each of them a unique id (integer from 1 to n). A gift i is characterized by integer ai — pleasantness of the gift. The pleasantness of the gift can be positive, negative or zero. Sponsors placed the gift 1 on the top of the tree. All the other gifts hung on a rope tied to some other gift so that each gift hung on the first gift, possibly with a sequence of ropes and another gifts. Formally, the gifts formed a rooted tree with n vertices.
The prize-giving procedure goes in the following way: the participants come to the tree one after another, choose any of the remaining gifts and cut the rope this prize hang on. Note that all the ropes which were used to hang other prizes on the chosen one are not cut. So the contestant gets the chosen gift as well as the all the gifts that hang on it, possibly with a sequence of ropes and another gifts.
Our friends, Chloe and Vladik, shared the first place on the olympiad and they will choose prizes at the same time! To keep themselves from fighting, they decided to choose two different gifts so that the sets of the gifts that hang on them with a sequence of ropes and another gifts don't intersect. In other words, there shouldn't be any gift that hang both on the gift chosen by Chloe and on the gift chosen by Vladik. From all of the possible variants they will choose such pair of prizes that the sum of pleasantness of all the gifts that they will take after cutting the ropes is as large as possible.
Print the maximum sum of pleasantness that Vladik and Chloe can get. If it is impossible for them to choose the gifts without fighting, print Impossible.
Input
The first line contains a single integer n (1 ≤ n ≤ 2·105) — the number of gifts.
The next line contains n integers a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — the pleasantness of the gifts.
The next (n - 1) lines contain two numbers each. The i-th of these lines contains integers ui and vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — the description of the tree's edges. It means that gifts with numbers ui and vi are connected to each other with a rope. The gifts' ids in the description of the ropes can be given in arbirtary order: vi hangs on ui or ui hangs on vi.
It is guaranteed that all the gifts hang on the first gift, possibly with a sequence of ropes and another gifts.
Output
If it is possible for Chloe and Vladik to choose prizes without fighting, print single integer — the maximum possible sum of pleasantness they can get together.
Otherwise print Impossible.
Examples
Input
8 0 5 -1 4 3 2 6 5 1 2 2 4 2 5 1 3 3 6 6 7 6 8
Output
25
Input
4 1 -5 1 1 1 2 1 4 2 3
Output
2
Input
1 -1
Output
Impossible 题意:给你一颗树 树有点权 现在找到两个不关联的子树 输出最大的子树点权和 题解:dfs序将子树转化为区间 在n个区间中选取两个不相交的区间 输出最大的权值和。(具体看代码)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include <map> #define ll __int64 #define mod 1000000007 #define dazhi 2147483647 using namespace std; int n; ll a[200005]; int u,v; int pre[200005]; ll d[1000006]; int in[200005]; int out[200005]; ll dp[2000005]; int nedge=0; struct node { int from; int to; }N[1000006]; struct xx { int l; int r; ll w; }M[200005]; void add(int from ,int to) { nedge++; N[nedge].to=to; N[nedge].from=pre[from]; pre[from]=nedge; } int dfn=0; ll sum=0; map<int,int> mp; map<int,int>mpp; void getdfs(int root) { sum+=a[root]; in[root]=++dfn; d[dfn]=sum; mp[dfn]=root; mpp[root]=1; for(int i=pre[root];i;i=N[i].from) { if(mpp[N[i].to]) continue; getdfs(N[i].to); } out[root]=dfn; } bool cmp(struct xx aa,struct xx bb) { return aa.r<bb.r; } int main() { memset(pre,0,sizeof(pre)); mp.clear(); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%I64d",&a[i]); for(int i=1;i<=n-1;i++) { scanf("%d %d",&u,&v); add(u,v); add(v,u); } getdfs(1); for(int i=1;i<=n;i++) { M[i].l=in[i]; M[i].r=out[i]; M[i].w=d[out[i]]-d[in[i]]+a[mp[in[i]]]; } sort(M+1,M+1+n,cmp); ll ans=-1e18-1; ll maxn=-1e18-1; int flag=0; for(int i=0;i<=n;i++) dp[i]=-1e18-1; for(int i=1;i<=n;i++) { maxn=max(M[i].w,maxn); dp[M[i].r]=maxn; } for(int i=2;i<=n;i++) { if(dp[i]<=dp[i-1]) dp[i]=dp[i-1]; } for(int i=1;i<=n;i++){ ans=max(ans,M[i].w+dp[M[i].l-1]); if(dp[M[i].l-1]!=(-1e18-1)) flag=1; } if(flag==0) printf("Impossible\n"); else printf("%I64d\n",ans); return 0; } /* 10 -1 2 -2 -3 -1 -1 0 -4 -5 -4 4 6 6 9 1 2 6 2 7 8 7 9 5 10 6 3 10 1 */
相关文章推荐
- 【HDU5586 BestCoder Round 64 (div1)A】【贪心 最大连续子串】Sum 区间函数值变换使得数列权值和最大
- 【Codeforces Round 362 (Div 2)F】【AC自动机+矩阵快速幂】Legen... 长度为l字符串最大能够重复匹配的字符串权值
- 【Codeforces Round 339 (Div 2)D】【暴力 贪心 二分】Skills 最高技能人数乘cm+最低技能乘cf权值最大
- hdu 1853 Cyclic Tour 求图中不相交的l个环的最小权值:首先变成完全图(i->j=inf),然后取反,求最大权值,最后判断是否所有点都选到
- 【COGS743】最长k可重区间集问题 最大权不相交路径
- !HDU 4293 排队分组说谎问题-dp-(不相交区间的最大个数)
- poj2479 && poj2593Maximum sum(求两个不相交最大字段的和)
- poj2593 Max Sequence(两个不相交字段的最大总和与)
- Uvalive 4267 Finding The Heaviest Path (Regionals 2008 Asia Taipei +DFS结点最大权值路径)
- Codeforces Round #442 (Div. 2)-E-Danil and a Part-time Job(DFS序+线段树区间更新)
- 【MOOC·数据结构】求数组区间两个最大整数
- 将[1,n^2]区间内n^2个数字分别填充到n*n的矩阵里,要求任意两个相邻的数字的和,它们的最大值最小是多少?
- 贪心法:最大不相交区间数
- Codeforces 633 F The Chocolate Spree(树形dp,两条不相交链节点权值和最大)
- nefu495最长k可重区间集问题【最大权不相交路径】网络流24题
- 最大不相交区间求法分析(结合一道例题)
- 线性规划与网络流24题之最长k可重区间集问题 最大权不相交路径(最大费用最大流)
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job (dfs序树型转线性 线段树区间修改区间查询)
- HDU 4343 多查询求区间内的最大不相交区间个数-思维&贪心-卡时间&二分&剪枝
- 判断两个div的位置是否相交,可以判断相互包含的特殊情况