2019 CCPC Hunan National Invitational Tournament (Guangdong Province, Jiangsu Province) Rematch

1002

Topic link: http://acm.hdu.edu.cn/showproblem.php?pid=6533

 

Build Tree

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 776    Accepted Submission(s): 74

Problem Description

You need to construct a full n-ary tree(n叉树) with m layers.All the edges in this tree have a weight.But this weight cannot be chosen arbitrarily you can only choose from set S,the size of S is k,each element in the set can only be used once.Node 0 is the root of tree.

We use d(i) for the distance from root to node i.Our goal is to minimize the following expression:

min∑i=0Nd(i)

Please find the minimum value of this expression and output it.Because it may be a big number,you should output the answer modul p.

 

Input

The input file contains 2 lines.

The first line contains 4 integers,these respectively is k,m,n,p。(2 ≤ k ≤200000,2 ≤ p≤ 1015)

The second line contains k integers,represent the set S,the elements in the set guarantee less than or equal to 1015.

We guarantee that k is greater than or equal to the number of edges.

 

Output

The output file contains an integer.represent the answer.

 

Sample Input

5 2 3 10 
1 2 3 4 5

Sample Output

6

Code:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
ll read() {
  ll x = 0;
  ll ch = getchar();
  while (ch < '0' || ch > '9') {
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (ll)(ch - '0');
    ch = getchar();
  }
  return x;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
}
ll a[200010];
ll num[2000];
ll sum[200010];
ll tot[2000];
int main() {
  ll n, m, k;
  ll p;
  while(~scanf("%lld%lld%lld%lld", &k, &m, &n, &p)) {//n叉 m层
    ll cnt = 0, t = 1, ans = 0;
    sum[0] = 0;
    for (ll i = 1; i <= k; i++) {
      a[i] = read();
      sum[i] = sum[i-1] + a[i];
    }
    num[1] = 0;
    tot[2] = 1;
    for (ll i = 2; i <= m; i++) {
      t *= n;
      cnt += t;
      num[i] = num[i-1] + t;//到当前层有多少条边
      tot[i+1] = tot[i] + t;//当前层每条边需要使用多少次
    }
    sort(a+1, a+k+1);
    for (ll i = 1; i <= cnt; i++) {
      sum[i] = (sum[i-1] + a[i]) % p;
    }
    for (ll i = 2; i <= m; i++) {
      ans = (ans + ((((sum[num[i]] - sum[num[i-1]] + p) % p)) * tot[m-i+2]) % p) % p;
    }
    out(ans);
    putchar('\n');
  }
  return 0;
}
/*
13 3 3 10000
1 2 3 4 5 6 7 8 9 10 11 12 13

*/

1005

Topic link: http://acm.hdu.edu.cn/showproblem.php?pid=6536

 

Hello XTCPC

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 173    Accepted Submission(s): 47

 

Problem Description

You have a string of lowercase letters.You need to find as many sequence “xtCpc” as possible.But letters in the same position can only be used once。

 

Input

The input file contains two lines.

The first line is an integer n show the length of string.(1≤n≤2×105)

The second line is a string of length n consisting of lowercase letters and uppercase letters.

 

Output

The input file contains an integer show the maximum number of different subsequences found.

 

Sample Input

10 
xtCxtCpcpc

Sample Output

2

 Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _rep(n,m,i) for (int i = n; i <= m; i++)
#define _for(n,m,i) for (int i = n; i < m; i++)
#define ff first
#define ss second
#define It iterator
#define me(a) memset(a, 0, sizeof(a))
inline int read() {
  int x = 0;
  char s = getchar();
  while(s < '0' || s > '9') s = getchar();
  while(s >= '0' && s <= '9') x = x * 10 + s - '0', s = getchar();
  return x;
}
LL a[5];
int main() {
  string s;
  int n;
  while(cin >> n >> s) {
    memset(a,0,sizeof(a));
    _for(0,n,i) {
    if(s[i] == 'x') 
      a[0]++;
    if(s[i] == 't') 
      if(a[0] > a[1])
        a[1]++;
    if(s[i] == 'C') 
      if(a[1] > a[2]) 
        a[2]++;
    if(s[i] == 'p') 
      if(a[2] > a[3]) 
        a[3]++;
    if(s[i] == 'c') 
      if(a[3] > a[4]) 
        a[4]++;
    }
  cout << a[4] << endl;
  }   
}

1011 

Topic link: http://acm.hdu.edu.cn/showproblem.php?pid=6542

 

SSY and JLBD

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 43    Accepted Submission(s): 23

 

Problem Description

Mahjong is a board game with a long history. But Mahjong has different rules in different city.

A deck of mahjong consists of 136 cards. It contains 1-9 card in three suits,and Seven kinds of word card("dong","nan","xi","bei",“zhong”,"fa","bai"),there are 4 same cards for each kind of card in a deck of mahjong .

In a mysterious country, the rules of mahjong are very simple.In the game,each Player has 14 cards.There are only two ways people can win the game:

1. shisanyao:You should have all 1 and 9 card in three suits and seven kinds of word card at the same time,and an extra card with any kind of 1 and 9 or word.

2. jiulianbaodeng:Firstly,You should make sure that you have the same suit in your hand.Secondly, for card "1" and card "9",you should have at least three . but for card "2" to card "8",at least one.For example, both "11112345678999" and "11122345678999" can win the game.

Now you know a player's 14 cards. Please judge which card type he can use to win the game.

 

Input

The input file contains 14 lines.Each line has a string representing a card.

For three suits of card "1" to card "9",We use two characters for the type,the first character a is number 1 to 9,and the second character b represents the suit.(a∈{1,2,3,4,5,6,7,8,9},b∈{s,p,w})

For the word cards,as shown in the description,we use full spelling pinyin represent them.

 

Output

If player ‘s card meet the “shisanyao” condition, you should output "shisanyao!".

If player ‘s card meet the “jiulianbaodeng” condition, you should output "jiulianbaodeng!".

Otherwise,you should output "I dont know!".

 

Sample Input

1w 
5w 
2w 
6w 
5w 
9w 
9w 
7w 
1w 
3w 
9w 
4w 
1w 
8w

Sample Output

jiulianbaodeng!

Code:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
}
string s[15], card[7] = {"dong","nan","xi","bei","zhong","fa","bai"};
map<int, int> mp;
set<string> shi;
string ss = "1s1p1w9s9p9wdongnanxibeizhongfabai";
int cnt;
char ch;
int main() {
  cnt = 0;
  int flag = 0, p = 0;
  for (int i = 1; i < 15; i++) {
    cin >> s[i];
    if(ss.find(s[i]) != string::npos) {
      shi.insert(s[i]);
      p++;
    }
    if (s[i][0] >= '1' && s[i][0] <= '9')mp[s[i][0]-'0']++;
    else
      flag = 1;
    if (i == 1) {
      ch = s[i][1];
      cnt = 1;
    } else {
      if (s[i][1] != ch) cnt++;
    }
  }
  for (int i = 2; i <= 8; i++) {
    if (mp[i] < 1) {
      flag = 1;
      break;
    }
  }
  if (cnt == 1 && mp[1] >= 3 && mp[9] >= 3 && flag == 0) cout << "jiulianbaodeng!" << endl;
  else if (shi.size() == 13 && p == 14) cout << "shisanyao!" << endl;
  else
    cout << "I dont know!" << endl;
  return 0;
}

1012

Topic link: http://acm.hdu.edu.cn/showproblem.php?pid=6543

 

Can you raed it croretcly?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 67    Accepted Submission(s): 41

 

Problem Description

Do you feel weird when reading the problem title? You can understand word meanning correctly even if its spelling is wrong.
According to research, if the initial and last letter of the word are right, and just swap the others, human can correct the spelling of the word automatically.
Now, giving you a word and its correct spelling, can you correct it automatically?

 

Input

The input contains several test cases. 
Each test case consists of one line with two strings, each string only contains lowercase letter, and its length is no more than 20.

 

Output

Output "Equal" when the two strings are same; output "Yes" when you can correct it, otherwise outoput "No".

 

Sample Input

raed read 
it it 
croretcly correctly 
raed dear

 Sample Output

Yes 
Equal 
Yes 
No

Code:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define llinf 1ll<<60
using namespace std;
typedef long long ll;
int read() {
  int x = 0, f = 1;
  int ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (int)(ch - '0');
    ch = getchar();
  }
  return x * f;
}
void out(ll a) {
  if (a < 0) {
    putchar('-');
    a = -a;
  }
  if (a >= 10) {
    out(a / 10);
  }
  putchar(a % 10 + '0');
}
bool chilk(string s, string t) {
  sort(s.begin(), s.end());
  sort(t.begin(),t.end());
  return s == t;
}
int main() {
  string s, t;
  while(cin >> s>> t) {
    if(s == t) {
      cout << "Equal\n";
    }
    else if(chilk(s,t)) {
      if(s[0] == t[0] && s[s.size() - 1] == t[t.size() - 1]) {
        cout << "Yes\n";
      }
      else cout << "No\n";
    }
    else cout << "No\n"; 
  }
  return 0;
}

The weak school was unable to participate in the live competition, and could only play the rematch, and could only make 4 questions, alas

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326526158&siteId=291194637