Codeforces Round #277(Div 2) A、B、C、D、E题解

转载请注明出处: http://www.cnblogs.com/fraud/           ——by fraud

A. Calculating Function

水题,判个奇偶即可

 1 #include <iostream>

 2 #include <sstream>

 3 #include <ios>

 4 #include <iomanip>

 5 #include <functional>

 6 #include <algorithm>

 7 #include <vector>

 8 #include <string>

 9 #include <list>

10 #include <queue>

11 #include <deque>

12 #include <stack>

13 #include <set>

14 #include <map>

15 #include <cstdio>

16 #include <cstdlib>

17 #include <cmath>

18 #include <cstring>

19 #include <climits>

20 #include <cctype>

21 using namespace std;

22 #define XINF INT_MAX

23 #define INF 0x3FFFFFFF

24 #define MP(X,Y) make_pair(X,Y)

25 #define PB(X) push_back(X)

26 #define REP(X,N) for(int X=0;X<N;X++)

27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

29 #define CLR(A,X) memset(A,X,sizeof(A))

30 #define IT iterator

31 typedef long long ll;

32 typedef pair<int,int> PII;

33 typedef vector<PII> VII;

34 typedef vector<int> VI;

35 

36 int main()

37 {

38     ios::sync_with_stdio(false);

39     ll n;

40     while(cin>>n)

41     {

42         if(n&1)cout<<-(n+1)/2<<endl;

43         else cout<<n/2<<endl;

44     }

45     return 0;

46 }
View Code

B. OR in Matrix

先把A全部初始化为1,再把B中为0的对应的行和列在A中设为0,最后再通过得到的A来求B,看是否一致

 1 #include <iostream>

 2 #include <sstream>

 3 #include <ios>

 4 #include <iomanip>

 5 #include <functional>

 6 #include <algorithm>

 7 #include <vector>

 8 #include <string>

 9 #include <list>

10 #include <queue>

11 #include <deque>

12 #include <stack>

13 #include <set>

14 #include <map>

15 #include <cstdio>

16 #include <cstdlib>

17 #include <cmath>

18 #include <cstring>

19 #include <climits>

20 #include <cctype>

21 using namespace std;

22 #define XINF INT_MAX

23 #define INF 0x3FFFFFFF

24 #define MP(X,Y) make_pair(X,Y)

25 #define PB(X) push_back(X)

26 #define REP(X,N) for(int X=0;X<N;X++)

27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

29 #define CLR(A,X) memset(A,X,sizeof(A))

30 #define IT iterator

31 typedef long long ll;

32 typedef pair<int,int> PII;

33 typedef vector<PII> VII;

34 typedef vector<int> VI;

35 int a[2010];

36 vector<int>G[2010];

37 int d,n;

38 const ll MOD=1000000007;

39 ll dp[2010];

40 void dfs(int v,int u,int root,int x)

41 {

42     if((a[v]<x&&x-a[v]<=d)||(a[v]==x&&root>=v))

43     {

44         //cout<<v<<" ";

45         dp[v]=1;

46         for(int i=0;i<G[v].size();i++)

47         {

48             if(G[v][i]==u)continue;

49             dfs(G[v][i],v,root,x);

50             dp[v]*=(dp[G[v][i]]+1);

51             dp[v]%=MOD;

52         }

53 

54     }

55     return ;

56 }

57 int main()

58 {

59     ios::sync_with_stdio(false);

60     //freopen("in.in","r",stdin);

61     while(cin>>d>>n)

62     {

63         for(int i=0;i<n;i++)

64         {

65             cin>>a[i];

66             G[i].clear();

67         }

68         int u,v;

69         for(int i=0;i<n-1;i++)

70         {

71             cin>>u>>v;

72             u--,v--;

73             G[u].PB(v);

74             G[v].PB(u);

75         }

76         ll ans=0;

77         for(int i=0;i<n;i++)

78         {

79             CLR(dp,0);

80             dfs(i,i,i,a[i]);

81             ans+=dp[i];

82             ans%=MOD;

83         }

84         cout<<ans<<endl;

85 

86     }

87     return 0;

88 }
View Code

C. Palindrome Transformation

贪心,只需要看初始位置所在的一半字符串。取短的那一部分先改。

  1 #include <iostream>

  2 #include <sstream>

  3 #include <ios>

  4 #include <iomanip>

  5 #include <functional>

  6 #include <algorithm>

  7 #include <vector>

  8 #include <string>

  9 #include <list>

 10 #include <queue>

 11 #include <deque>

 12 #include <stack>

 13 #include <set>

 14 #include <map>

 15 #include <cstdio>

 16 #include <cstdlib>

 17 #include <cmath>

 18 #include <cstring>

 19 #include <climits>

 20 #include <cctype>

 21 using namespace std;

 22 #define XINF INT_MAX

 23 #define INF 0x3FFFFFFF

 24 #define MP(X,Y) make_pair(X,Y)

 25 #define PB(X) push_back(X)

 26 #define REP(X,N) for(int X=0;X<N;X++)

 27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

 28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

 29 #define CLR(A,X) memset(A,X,sizeof(A))

 30 #define IT iterator

 31 typedef long long ll;

 32 typedef pair<int,int> PII;

 33 typedef vector<PII> VII;

 34 typedef vector<int> VI;

 35 string s;

 36 int main()

 37 {

 38     ios::sync_with_stdio(false);

 39     int n,p;

 40     cin>>n>>p>>s;

 41     int len=n;

 42     int ans=0;

 43     int x=(n+1)/2;

 44     if(p<=x)

 45     {

 46         p--;

 47         int lx=0,rx=0;

 48         int i=0;

 49         while(s[i]==s[len-1-i]&&i<p)i++;

 50         ans+=p-i;

 51         lx=p-i;

 52         int temp;

 53         while(i<=p)

 54         {

 55             if(s[i]!=s[len-1-i])

 56             {

 57                 temp=max(s[i],s[len-1-i])-min(s[i],s[len-1-i]);

 58                 ans+=min(temp,26-temp);

 59             }

 60             i++;

 61         }

 62         i=x-1;

 63         while(s[i]==s[len-1-i]&&i>p)i--;

 64         rx=i-p;

 65         ans+=i-p;

 66         while(i>p)

 67         {

 68             if(s[i]!=s[len-1-i])

 69             {

 70                 temp=max(s[i],s[len-1-i])-min(s[i],s[len-1-i]);

 71                 ans+=min(temp,26-temp);

 72             }

 73             i--;

 74         }

 75         ans+=min(lx,rx);

 76 

 77     }

 78     else

 79     {

 80         p--;

 81         int lx=0,rx=0;

 82         int i=x;

 83         while(s[i]==s[len-1-i]&&i<p)i++;

 84         ans+=p-i;

 85         lx=p-i;

 86         int temp;

 87         while(i<=p)

 88         {

 89             if(s[i]!=s[len-1-i])

 90             {

 91                 temp=max(s[i],s[len-1-i])-min(s[i],s[len-1-i]);

 92                 ans+=min(temp,26-temp);

 93             }

 94             i++;

 95         }

 96         i=len-1;

 97         while(s[i]==s[len-1-i]&&i>p)i--;

 98         rx=i-p;

 99         ans+=i-p;

100         while(i>p)

101         {

102             if(s[i]!=s[len-1-i])

103             {

104                 temp=max(s[i],s[len-1-i])-min(s[i],s[len-1-i]);

105                 ans+=min(temp,26-temp);

106             }

107             i--;

108         }

109         ans+=min(lx,rx);

110     }

111     cout<<ans<<endl;

112     return 0;

113 }
View Code

 

D. Valid Sets

 

As you know, an undirected connected graph with n nodes and n - 1 edges is called a tree. You are given an integer d and a tree consisting of n nodes. Each node i has a value ai associated with it.

We call a set S of tree nodes valid if following conditions are satisfied:

  1. S is non-empty.
  2. S is connected. In other words, if nodes u and v are in S, then all nodes lying on the simple path between u and v should also be presented in S.
  3. .

Your task is to count the number of valid sets. Since the result can be very large, you must print its remainder modulo 1000000007(109 + 7).

题目:要求所给的树中,满足任意两个节点的权值相差小于等于d的子树个数。

分析:树形dp。

为了方便计数,我采取以下方式:每次选取的子树都是保证根节点的权值为最大,当然如果单单是这样的话,权值均相等的子树是会被重复计数的,因此我在遇到权值相等的情况时,需要保证其结点的标号小于根节点。

 1 #include <iostream>

 2 #include <sstream>

 3 #include <ios>

 4 #include <iomanip>

 5 #include <functional>

 6 #include <algorithm>

 7 #include <vector>

 8 #include <string>

 9 #include <list>

10 #include <queue>

11 #include <deque>

12 #include <stack>

13 #include <set>

14 #include <map>

15 #include <cstdio>

16 #include <cstdlib>

17 #include <cmath>

18 #include <cstring>

19 #include <climits>

20 #include <cctype>

21 using namespace std;

22 #define XINF INT_MAX

23 #define INF 0x3FFFFFFF

24 #define MP(X,Y) make_pair(X,Y)

25 #define PB(X) push_back(X)

26 #define REP(X,N) for(int X=0;X<N;X++)

27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

29 #define CLR(A,X) memset(A,X,sizeof(A))

30 #define IT iterator

31 typedef long long ll;

32 typedef pair<int,int> PII;

33 typedef vector<PII> VII;

34 typedef vector<int> VI;

35 int a[2010];

36 vector<int>G[2010];

37 int d,n;

38 const ll MOD=1000000007;

39 ll dp[2010];

40 void dfs(int v,int u,int root,int x)

41 {

42     if((a[v]<x&&x-a[v]<=d)||(a[v]==x&&root>=v))

43     {

44         //cout<<v<<" ";

45         dp[v]=1;

46         for(int i=0;i<G[v].size();i++)

47         {

48             if(G[v][i]==u)continue;

49             dfs(G[v][i],v,root,x);

50             dp[v]*=(dp[G[v][i]]+1);

51             dp[v]%=MOD;

52         }

53 

54     }

55     return ;

56 }

57 int main()

58 {

59     ios::sync_with_stdio(false);

60     //freopen("in.in","r",stdin);

61     while(cin>>d>>n)

62     {

63         for(int i=0;i<n;i++)

64         {

65             cin>>a[i];

66             G[i].clear();

67         }

68         int u,v;

69         for(int i=0;i<n-1;i++)

70         {

71             cin>>u>>v;

72             u--,v--;

73             G[u].PB(v);

74             G[v].PB(u);

75         }

76         ll ans=0;

77         for(int i=0;i<n;i++)

78         {

79             CLR(dp,0);

80             dfs(i,i,i,a[i]);

81             ans+=dp[i];

82             ans%=MOD;

83         }

84         cout<<ans<<endl;

85 

86     }

87     return 0;

88 }
View Code

 

E. LIS of Sequence

 

The next "Data Structures and Algorithms" lesson will be about Longest Increasing Subsequence (LIS for short) of a sequence. For better understanding, Nam decided to learn it a few days before the lesson.

Nam created a sequence a consisting of n (1 ≤ n ≤ 105) elements a1, a2, ..., an (1 ≤ ai ≤ 105). A subsequence ai1, ai2, ..., aik where 1 ≤ i1 < i2 < ... < ik ≤ n is called increasing if ai1 < ai2 < ai3 < ... < aik. An increasing subsequence is called longest if it has maximum length among all increasing subsequences.

Nam realizes that a sequence may have several longest increasing subsequences. Hence, he divides all indexes i (1 ≤ i ≤ n), into three groups:

  1. group of all i such that ai belongs to no longest increasing subsequences.
  2. group of all i such that ai belongs to at least one but not every longest increasing subsequence.
  3. group of all i such that ai belongs to every longest increasing subsequence.

Since the number of longest increasing subsequences of a may be very large, categorizing process is very difficult. Your task is to help him finish this job.

Input

The first line contains the single integer n (1 ≤ n ≤ 105) denoting the number of elements of sequence a.

The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 105).

Output

Print a string consisting of n characters. i-th character should be '1', '2' or '3' depending on which group among listed above index ibelongs to.

Sample test(s)
input
1
4
output
3
input
4
1 3 2 5
output
3223
input
4
1 5 2 3
output
3133
Note

In the second sample, sequence a consists of 4 elements: {a1, a2, a3, a4} = {1, 3, 2, 5}. Sequence a has exactly 2 longest increasing subsequences of length 3, they are {a1, a2, a4} = {1, 3, 5} and {a1, a3, a4} = {1, 2, 5}.

In the third sample, sequence a consists of 4 elements: {a1, a2, a3, a4} = {1, 5, 2, 3}. Sequence a have exactly 1 longest increasing subsequence of length 3, that is {a1, a3, a4} = {1, 2, 3}.

题目:问所给的序列中,若ai不存在于任何的LIS中,则输出1,若存在于至少一个但不为全部LIS中,则输出2,若ai存在于任意一个LIS中,则输出3

分析:求出到该点(包括该点在内)的正向LIS和不包括该点的反向LIS的长度,通过此判断即可。

例如:序列   1  2  4  2  3  5  4

   l[i]     1  2  3  2  3  3  4  表示正向的到该点为止包括该点在内的LIS的长度

     r[i]     3  2  1  2  1  0  0   表示的是反向的到该点为止不包括该点的最长下降子序列的长度

如果对于某一点,若l[i]+r[i]等于LIS的长度,则其必处于某一LIS之中,否则必然不在任意一个LIS之中,可判该点为1

接下来在由于之前我记录了正向的到该点为止包括该点在内的LIS的长度,即我知道每一个处于LIS中的位置,由此,我只需判LIS中该位置的点是否唯一,若唯一,则为3,否则为2;

 1 #include <iostream>

 2 #include <sstream>

 3 #include <ios>

 4 #include <iomanip>

 5 #include <functional>

 6 #include <algorithm>

 7 #include <vector>

 8 #include <string>

 9 #include <list>

10 #include <queue>

11 #include <deque>

12 #include <stack>

13 #include <set>

14 #include <map>

15 #include <cstdio>

16 #include <cstdlib>

17 #include <cmath>

18 #include <cstring>

19 #include <climits>

20 #include <cctype>

21 using namespace std;

22 #define XINF INT_MAX

23 #define INF 0x3FFFFFFF

24 #define MP(X,Y) make_pair(X,Y)

25 #define PB(X) push_back(X)

26 #define REP(X,N) for(int X=0;X<N;X++)

27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

29 #define CLR(A,X) memset(A,X,sizeof(A))

30 #define IT iterator

31 typedef long long ll;

32 typedef pair<int,int> PII;

33 typedef vector<PII> VII;

34 typedef vector<int> VI;

35 const int maxn=100010;

36 int a[maxn],b[maxn],dp[maxn];

37 int l[maxn],r[maxn];

38 int ans[maxn];

39 int deg[maxn];

40 int main()

41 {

42     ios::sync_with_stdio(false);

43     int n;

44     while(cin>>n)

45     {

46         CLR(ans,0);

47         CLR(deg,0);

48         for(int i=0;i<n;i++)

49         {

50             cin>>a[i];

51             b[n-1-i]=-a[i];

52         }

53         fill(dp,dp+n,INF);

54         for(int i=0;i<n;i++)

55         {

56             int temp=lower_bound(dp,dp+n,a[i])-dp;

57             l[i]=temp+1;

58             dp[temp]=a[i];

59         }

60         int len=lower_bound(dp,dp+n,INF)-dp;

61         fill(dp,dp+n,INF);

62         for(int i=0;i<n;i++)

63         {

64             int temp=lower_bound(dp,dp+n,b[i])-dp;

65             r[n-1-i]=temp;

66             dp[temp]=b[i];

67         }

68         for(int i=0;i<n;i++)

69         {

70             if(l[i]+r[i]==len)

71             {

72                 deg[l[i]]++;

73             }

74             else

75             {

76                 ans[i]=1;

77             }

78         }

79         for(int i=0;i<n;i++)

80         {

81             if(ans[i])cout<<1;

82             else if(deg[l[i]]>1)cout<<2;

83             else cout<<3;

84         }

85         cout<<endl;

86 

87     }

88     return 0;

89 }
View Code

 

 

你可能感兴趣的:(codeforces)