TSOJ 1350-1352题解

来源:互联网 发布:淘宝异常交易认证 编辑:程序博客网 时间:2024/06/15 13:50

TSOJ 1350-1352题解


1350:面朝大海 春暖花开 [ 基础版 ]

题目描述:

选择那些大晴天的日子,行走在孤单的海岸线,静静地种花给自己看~

我们假设把海岸线分为n块,每块的分别标记为1…n,每块都可以种花,每次种花可以选择某个[left,right]的闭区间,每块种上一朵花.经过m次种花操作后,根据输入的区间,求该区间内花的总数.

输入描述:

多组输入

对每组输入,第一行有两个整数n m,分别代表总块数和种花的次数.(1 <= n, m <= 100)

接下来的m行, 每行两个整数 L,R 代表[L,R]区间内每块种上一朵花.(1 <= L <= R <= n)

最后一行,输入两个整数 a,b 代表最后要查询的花的总数的区间.(1 <= a <= b <= n)

输出描述:

对每组测试数据,输出区间[a,b]内花的总数

样例输入:

5 2

1 5

1 2

2 3
样例输出:

3

拿到这题没多想看数据这么小就直接数组挨个存过去就好

#include<stdio.h>int main() {    int N, M, L, R;    int Map[105] ={0};    int max = -1, min = 10005;    int count = 0;    while(scanf("%d %d", &N, &M) != EOF)    {        for(int i = 0; i < M; i++)        {            scanf("%d %d", &L, &R);            if(max < R) max = R;            if(min > L) min = L;            for(int j = L; j <= R; j++)            Map[j]++;        }            scanf("%d %d", &L, &R);            for(int j = L; j <= R; j++)            count += Map[j];            printf("%d", count);            count =0;            for(int i = min; i <=max; i++)            Map[i] = 0;    }}

1351:面朝大海 春暖花开 [ 数据加强版 ]

题目描述:

依然选择那些大晴天的日子,再一次行走在孤单的海岸线,静静地种更多的花给自己看~

我们假设把海岸线分为n块,每块的分别标记为1…n,每块都可以种花,每次种花可以选择某个[left,right]的闭区间,每块种上一朵花.经过m次种花操作后,根据输入的区间,求该区间内花的总数.

输入描述:

多组输入

对每组输入,第一行有两个整数n m,分别代表总块数和种花的次数.(1 <= n, m <= 100000)

接下来的m行, 每行两个整数 L,R 代表[L,R]区间内每块种上一朵花.(1 <= L <= R <= n)

最后一行,输入两个整数 a,b 代表最后要查询的花的总数的区间.(1 <= a <= b <= n)

输出描述:

对每组输入,输出区间[a,b]内花的总数

样例输入:

5 2

1 5

1 2

2 3
样例输出:

3

#include<stdio.h>#include <string.h>#define MAX_NUM 100005int main(){    int N, M, T, l, r, i, j;    int map[MAX_NUM];    while(scanf("%d %d", &N, &M) != EOF)    {        memset(map, 0, sizeof(int) * MAX_NUM);
            for (i = 0; i < M; i++)             {                scanf("%d %d", &l, &r);                map[l]++;                map[r+1]--;            }
        for (j = 0; j < 2; j++)         {            for (i = 1; i <= N; i++)             {                map[i]+=map[i-1];            }        }            scanf("%d %d", &l, &r);            printf("%d\n", map[r] - map[l-1]);    }}

一开始抱着侥幸的心理试了一下第一题的代码= =哈哈哈哈肯定是过不了的=
想过把所有先后走过的块数排个序再统计试了一下还是很慢 所以就想是否换一个存储每块花数量的方式 在纸上划来划去瞎猫碰上死耗子想到了一种
数组map[i]的值表示i块地花的数量与i-1块地花数量的差值
在纸上模拟几组数据不难发现规律

输入 数组map(从map[0]开始) 每块花当前总数 总共种花数 1 5 010000-1 011111 5 1 2 02-1000-1 021111 6

观察上列表格总结得出
读入m行数据的同时就将map[L]++ map[R+1]- -

    for (i = 0; i < M; i++) {            scanf("%d %d", &l, &r);            map[l]++;            map[r+1]--;            }

最后读入要求输出相应块数区间求和就好了
从1开始map[i] +=map[i-1]到N


1352:面朝大海 春暖花开 [ 数据更强版 ]

题目描述:

第三次选择那些大晴天的日子,第三次行走在孤单的海岸线,第三次静静地种更多的花给自己看~

我们假设把海岸线分为n块,每块的分别标记为1…n,每块都可以种花,每次种花可以选择某个[left,right]的闭区间,每块种上一朵花.经过m次种花操作后, 输入t次区间, 根据输入的区间,求该区间内花的总数.

注意这一次,我们要看更多次的花儿,所以在第一行要输入看花的次数t

输入描述:

多组输入

对每组输入,第一行有三个整数n m t,分别代表总块数和种花的次数以及我们希望查询区间的次数.(1 <= n, m, t<= 100000)

接下来的m行, 每行两个整数 L,R 代表[L,R]区间内每块种上一朵花.(1 <= L <= R <= n)

接下来的t行, 每行输入两个整数 a,b 代表最后要查询的花的总数的区间.(1 <= a <= b <= n)

输出描述:

每组输入中, 对每次查询, 输出区间[a,b]内花的总数

样例输入:

5 2 2

1 5

1 2

2 3

3 4
样例输出:

3

2
样例说明

第一行的三个数5 2 2 分别代表一共有5块可以种花的地方, 种花2次, 种完花后要查询2次

下面的两行 1 5 以及 1 2 表示在区间[1,5],[1,2]分别种一次花,不难算出,种完花后每个位置花的总数分别为2 2 1 1 1,最后两行2 3 以及3 4 表示我们要分别求出[2,3],[3,4]区间内花的总数,所以输出的结果分别为3 2


上一题复杂度已经达到了O(n)所以这题求多组块区间花总数只要加一个循环读入和输出就好了

        for (i = 1; i <= N; i++) {            scanf("%d %d", &l, &r);            printf("%d\n", map[r] - map[l-1]);        }

做题感悟
AC这三道题可以说是运气成分比较高 蒙对的方法 事后从同学那里才知道我这是应用差分的思想 所以还是要扎扎实实的学算法做题目就能更有方向的的去猜测去尝试

原创粉丝点击