zoukankan      html  css  js  c++  java
  • 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.)

    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
    ",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
    ",get(a,b));
        }
    }

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

  • 相关阅读:
    media query(媒体查询)和media type(媒体类型)
    移动平台的meta标签-----神奇的功效
    CSS3那些不为人知的高级属性
    为什么你应该抛弃Express的视图渲染引擎
    HTML5桌面通知:notification api
    css3特效
    Java学习笔记18(Object类)
    Java学习笔记17(面向对象十:综合案例)
    Java学习笔记16(面向对象九:补充内容)
    Java学习笔记15(面向对象八:匿名对象、内部类)
  • 原文地址:https://www.cnblogs.com/8023spz/p/9501851.html
Copyright © 2011-2022 走看看