AtCoder Beginner Contest 106 2018/08/18

A - Garden


Time limit : 2sec / Memory limit : 1000MB

Score: 100 points

Problem Statement

There is a farm whose length and width are A yard and B yard, respectively. A farmer, John, made a vertical road and a horizontal road inside the farm from one border to another, as shown below: (The gray part represents the roads.)

AtCoder Beginner Contest 106 2018/08/18

What is the area of this yard excluding the roads? Find it.

Note

It can be proved that the positions of the roads do not affect the area.

Constraints

  • A is an integer between 2 and 100 (inclusive).
  • B is an integer between 2 and 100 (inclusive).

Input

Input is given from Standard Input in the following format:

A B

Output

Print the area of this yard excluding the roads (in square yards).


Sample Input 1

Copy
2 2

Sample Output 1

Copy
1

In this case, the area is 1 square yard.


Sample Input 2

Copy
5 7

Sample Output 2

Copy
24

In this case, the area is 24 square yards.

容斥定理。

代码:

import java.util.*;

public class Main {
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        int b = in.nextInt();
        System.out.println(a * b - a - b + 1);
    }
}

B - 105


Time limit : 2sec / Memory limit : 1000MB

Score: 200 points

Problem Statement

The number 105 is quite special - it is odd but still it has eight divisors. Now, your task is this: how many odd numbers with exactly eight positive divisors are there between 1 and N (inclusive)?

Constraints

  • N is an integer between 1 and 200 (inclusive).

Input

Input is given from Standard Input in the following format:

N

Output

Print the count.


Sample Input 1

Copy
105

Sample Output 1

Copy
1

Among the numbers between 1 and 105, the only number that is odd and has exactly eight divisors is 105.


Sample Input 2

Copy
7

Sample Output 2

Copy
0

1 has one divisor. 35 and 7 are all prime and have two divisors. Thus, there is no number that satisfies the condition.

代码:

import java.util.*;

public class Main {
    static int get(int a) {
        int b = 2;
        for(int i = 3;i <= a / 3;i += 2) {
            if(a % i == 0) {
                b ++;
            }
        }
        return b;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        int m = 0;
        if(a >= 105)m ++;
        for(int i = 107;i <= a;i += 2) {
            if(get(i) == 8)m ++;
        }
        System.out.println(m);
    }
}

C - To Infinity


Time limit : 2sec / Memory limit : 1000MB

Score: 300 points

Problem Statement

Mr. Infinity has a string S consisting of digits from 1 to 9. Each time the date changes, this string changes as follows:

  • Each occurrence of 2 in S is replaced with 22. Similarly, each 3 becomes 3334 becomes 44445 becomes 555556 becomes 6666667 becomes 77777778 becomes 88888888 and 9 becomes 9999999991 remains as 1.

For example, if S is 1324, it becomes 1333224444 the next day, and it becomes 133333333322224444444444444444 the day after next. You are interested in what the string looks like after 5×1015 days. What is the K-th character from the left in the string after 5×1015 days?

Constraints

  • S is a string of length between 1 and 100 (inclusive).
  • K is an integer between 1 and 1018 (inclusive).
  • The length of the string after 5×1015 days is at least K.

Input

Input is given from Standard Input in the following format:

S
K

Output

Print the K-th character from the left in Mr. Infinity's string after 5×1015 days.


Sample Input 1

Copy
1214
4

Sample Output 1

Copy
2

The string S changes as follows:

  • Now: 1214
  • After one day: 12214444
  • After two days: 1222214444444444444444
  • After three days: 12222222214444444444444444444444444444444444444444444444444444444444444444

The first five characters in the string after 5×1015 days is 12222. As K=4, we should print the fourth character, 2.


Sample Input 2

Copy
3
157

Sample Output 2

Copy
3

The initial string is 3. The string after 5×1015 days consists only of 3.


Sample Input 3

Copy
299792458
9460730472580800

Sample Output 3

Copy
2
只需要看看开头有几个连续的1即可。
代码:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        long a = in.nextLong();
        int b = 0;
        for(int i = 0;i < s.length();i ++) {
            if(s.charAt(i) == '1')b ++;
            else break;
        }
        if(b >= a)System.out.println(1);
        else System.out.println(s.charAt(b));
    }
}

 

D - AtCoder Express 2


Time limit : 3sec / Memory limit : 1000MB

Score: 400 points

Problem Statement

In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 123, ..., N from west to east. A company called AtCoder Expresspossesses M trains, and the train i runs from City Li to City Ri (it is possible that Li=Ri). Takahashi the king is interested in the following Q matters:

  • The number of the trains that runs strictly within the section from City pi to City qi, that is, the number of trains j such that piLj and Rjqi.

Although he is genius, this is too much data to process by himself. Find the answer for each of these Q queries to help him.

Constraints

  • N is an integer between 1 and 500 (inclusive).
  • M is an integer between 1 and 200 000 (inclusive).
  • Q is an integer between 1 and 100 000 (inclusive).
  • 1≤LiRiN (1≤iM)
  • 1≤piqiN (1≤iQ)

Input

Input is given from Standard Input in the following format:

N M Q
L1 R1
L2 R2
:
LM RM
p1 q1
p2 q2
:
pQ qQ

Output

Print Q lines. The i-th line should contain the number of the trains that runs strictly within the section from City pi to City qi.


Sample Input 1

Copy
2 3 1
1 1
1 2
2 2
1 2

Sample Output 1

Copy
3

As all the trains runs within the section from City 1 to City 2, the answer to the only query is 3.


Sample Input 2

Copy
10 3 2
1 5
2 8
7 10
1 7
3 10

Sample Output 2

Copy
1
1

The first query is on the section from City 1 to 7. There is only one train that runs strictly within that section: Train 1. The second query is on the section from City 3 to 10. There is only one train that runs strictly within that section: Train 3.


Sample Input 3

Copy
10 10 10
1 6
2 9
4 5
4 7
4 7
5 8
6 6
6 7
7 9
10 10
1 8
1 9
1 10
2 8
2 9
2 10
3 8
3 9
3 10
1 10

Sample Output 3

Copy
7
9
10
6
8
9
6
7
8
10
简单的区间dp。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q;
int dp[502][502];
int main() {
    int a,b;
    scanf("%d%d%d",&n,&m,&q);
    for(int i = 0;i < m;i ++) {
        scanf("%d%d",&a,&b);
        dp[a][b] ++;
    }
    for(int j = 1;j < n;j ++) {
        for(int i = 1;i + j <= n;i ++) {
            int k = i + j;
            dp[i][k] += dp[i + 1][k] + dp[i][k - 1];
            if(j > 1)dp[i][k] -= dp[i + 1][k - 1];
        }
    }
    for(int i = 0;i < q;i ++) {
        scanf("%d%d",&a,&b);
        printf("%d\n",dp[a][b]);
    }
    return 0;
}

 树状数组,区间向两侧更新,最后查询两侧向内查询。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int n;
int sum[501][501];
int lowbit(int x) {
    return x&-x;
}
void update(int x,int y) {
    for(int i = x;i > 0;i -= lowbit(i)) {
        for(int j = y;j <= n;j += lowbit(j)) {
            sum[i][j] ++;
        }
    }
}
int get(int x,int y) {
    int ans = 0;
    for(int i = x;i <= y;i += lowbit(i)) {
        for(int j = y;j >= x;j -= lowbit(j)) {
            ans += sum[i][j];
        }
    }
    return ans;
}
int main() {
    int m,q;
    scanf("%d%d%d",&n,&m,&q);
    int a,b;
    for(int i = 0;i < m;i ++) {
        scanf("%d%d",&a,&b);
        update(a,b);
    }
    for(int i = 0;i < q;i ++) {
        scanf("%d%d",&a,&b);
        printf("%d\n",get(a,b));
    }
}

 也可以用邻接表加二分遍历,不过就比较麻烦了。