首页 > 其他分享 >Day5 备战CCF-CSP练习

Day5 备战CCF-CSP练习

时间:2024-10-12 09:01:06浏览次数:1  
标签:矩形 前缀 int Day5 样例 整数 ++ CCF CSP

题目描述

给定 \(n\) 个不同的整数,问这些数中有多少对整数,它们的值正好相差 \(1\)。

输出格式

输入的第一行包含一个整数 \(n\),表示给定整数的个数。

第二行包含所给定的$ n$ 个整数。

输出格式

输出一个整数,表示值正好相差 \(1\) 的数对的个数。

数据范围

\(1≤n≤1000\),给定的整数为不超过 \(10000\) 的非负整数。

输入样例:

6
10 2 6 3 7 8

输出样例:

3

样例解释

值正好相差 \(1\) 的数对包括 \((2,3),(6,7),(7,8)\)

题目分析

语法题

C++代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;
int n;
int a[N];
int res = 0;

int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i ++)
        cin >> a[i];
    for(int i = 0 ; i < n ; i ++)
        for(int j = i + 1 ; j < n ; j ++)
            if(abs(a[i] - a[j]) == 1) 
                res ++ ;
    
    cout << res << '\n';
    return 0;
}

题目描述

在一个定义了直角坐标系的纸上,画一个 \((x_1,y_1)\) 到 \((x_2,y_2)\)的矩形指将横坐标范围从 \(x_1\) 到 \(x_2\),纵坐标范围从 \(y_1\) 到 \(y_2\) 之间的区域涂上颜色。

下图给出了一个画了两个矩形的例子。

第一个矩形是 \((1,1)\) 到 \((4,4)\),用绿色和紫色表示。

第二个矩形是 \((2,3)\) 到 \((6,5)\),用蓝色和紫色表示。

图中,一共有 \(15\) 个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。

在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

p21

给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

输入格式

输入的第一行包含一个整数 \(n\),表示要画的矩形的个数。

接下来 \(n\) 行,每行 \(4\)个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

输出格式

输出一个整数,表示有多少个单位的面积被涂上颜色。

数据范围

\(1≤n≤100,0≤ 横坐标、纵坐标 ≤100\)

输入样例:

2
1 1 4 4
2 3 6 5

输出样例:

15

题目分析

暴力/二维前缀和
暴力就不说了,讲一下优化

二位前缀和,我们将矩形中每一个点都当成前缀和的点,那么,我们只需要将顶点标注一下,就可以利用前缀和的性质画出整个矩形

如图一,蓝色是要画的目标矩形
屏幕截图 2024-09-24 201845.png

那么怎么构建差分数组呢
根据前缀和公式f[i][j] = f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1] + a[i][j]
其中f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1]都是以\((i , j)\)为最右下的顶点的矩形面积(差分数组的矩形),问题是我们怎么通过控制顶点的a[i][j]来控制矩阵的大小。

屏幕截图 2024-10-12 084220.png

红色点是矩形的左上角,在此之前的所有点都为\(0\),那么前缀和自然也为\(0\),那么a[x1][y1] = 1,到了橘色点,矩形已经结束了,可是前缀和依然为\(1\),因此a[x2 + 1][y1] = -1,同理另一个橘色点a[x1][y2 + 1] = -1 ,到了紫色点,由于两个橘色点,紫色点的前缀和为\(-1\),所以a[x2 + 1][y2 + 1] = 1

然后推广就可以了,利用前缀和性质,只要不是\(0\)的点就是覆盖的点,求面积即可

构造差分数组 \(\rightarrow\) 前缀和构建矩形 \(\rightarrow\) 再次前缀和求覆盖面积

C++ 代码

#include <bits/stdc++.h>

using namespace std;
const int N = 110;

int f[N][N];
int n;

int main()
{
    cin >> n;
    while (n -- )
    {
        int a , b , x , y;
        cin >> a >> b >> x >> y;
        a ++ , b ++ ;
        f[a][b] += 1;
        f[x + 1][b] -= 1 , f[a][y + 1] -= 1;
        f[x + 1][y + 1] += 1;
    }
    
    for(int i = 1 ; i < N ; i ++)
        for(int j = 1 ; j < N ; j ++)
            f[i][j] += f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];
    
    for(int i = 1 ; i < N ; i ++)
        for(int j = 1 ; j < N ; j ++){
            if(f[i][j]) f[i][j] = 1;
            f[i][j] += f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];
        }    
        
    cout << f[N - 1][N - 1];        
    
    
}

标签:矩形,前缀,int,Day5,样例,整数,++,CCF,CSP
From: https://www.cnblogs.com/mathblog/p/18459768

相关文章

  • CSP2024-25
    2A题意(gym105158C):给定正整数序列\(\{a\}\),构造一个\(\mathbbZ\to\mathbbZ\)的映射\(f\),满足\(\foralli<n,\f(a_{i})\lef(a_{i+1})\)。最小化\(f(x)\nex\)的\(x\)数量。数据范围:\(1\len\le10^6,\1\lea_i\len\)。对于\(i\notin\{......
  • CSP-S 模拟赛 28
    CSP-S模拟赛28T1签到题。对\(b\)分解质因数后便容易求解。T2考虑枚举\(\gcd(S)\)的取值\(x\),则\(\operatorname{lcm}(S)=m-x\)。那么同时变形\(\gcd\)和\(\operatorname{lcm}\)变为\(\gcd(S)=1,\operatorname{lcm}(S)=\dfrac{m-x}{x}\)。那么对于\(\gcd\)......
  • CSP-S 模拟赛 29
    CSP-S模拟赛29T1\(n\le18\)显然是状压dp。考虑设状态\(dp_{i,j}\)表示状态为\(i\),最终的\(a\)为\(j\)时的最大代价及方案数。转移是简单的。优化是观察到最终的\(a\in(\maxa_i,\maxa_i+1)\)。那么这一维便可以用\(0/1\)来设。于是时间复杂度\(O(2^nn)\).......
  • CSP-S 模拟赛 37
    CSP-S模拟赛37T1口胡题。显然尽量靠近中间更优,且选端点一定不劣,于是依据结论将中点设为所有端点的中位数。代码:#include<bits/stdc++.h>#defineN300005#defineintlonglongusingnamespacestd;intn;intl[N],r[N];intrk[N<<1];intpos[N];intans;signe......
  • CSP-J 2023 T3 一元二次方程 解题报告
    CSP-J2023T3一元二次方程解题报告Link前言今年\(CSP\)的原题,回家\(1h\)内写\(AC\),但是考场上没有写出来,原因是脑子太不好了,竟然调了两个小时没有调出来.一等奖悬那......正题看完题目,第一眼就是大模拟,并且\(CCF\)绝对不会让你好受,所以出了一个如此***钻的......
  • CSP-S 模拟赛 36
    CSP-S模拟赛36T1由于\(a_i\le10^5\),那么考虑枚举这个\(\gcd\),考虑求\(f(i)\)表示答案,那么\(\operatorname{ans}=\sumi\timesf(i)\)。然而式子中有\(\gcd\),于是考虑求\(g(i)\)表示\(i\mid\gcd\)的方案数,然后\(f(i)=g(i)-\sum_{j>i,i\midj}f(j)\)。对于\(g(i)\)......
  • CSP-S 模拟赛35
    CSP-S模拟赛35T1其实是傻逼题。常见的套路是枚举右端点,动态维护左端点的贡献。发现右端点移动一位只会对一种颜色有影响,那么考虑线段树维护区间的答案,区间加减每个颜色即时的贡献即可。代码:#include<bits/stdc++.h>#defineN1000005#defineM8005#defineintlonglong......
  • [10.11]CSP-S模拟赛
    宝贵经验:写题的时候想出时间正确的方法后千万注意计算空间,能不用数组的地方就不要用,否则可能会像我一样:\(35\to15\to0\)赛前小L说比上次简单。赛时T1一开始没有思路,但是注意到了两个关键条件:询问数\(\le300\)\(n,m\le10^9\)然后想到正解绝对不是去直接修改。注......
  • csp-s真题题解
    csp题目讲解P8818[CSP-S2022]策略游戏学习笔记感觉非常复杂?对于现在的我还是有深度的,首先第一个大坑就是并不需要真的求出c矩阵,这个题意就是让你在区间中选数,但要求乘积最大,所以要分讨。你假定\(a_i\ge0\),那这时如果\(min(b_i)\ge0\)取\(max(a_i)\),否则取\(min(a_i\ge......
  • [CSP-S2020] 函数调用
    这个题真的有那么简单吗?首先是cornercase,新建一个点连向1~n表示起点。显然这个图是DAG,然后考虑dp。全局mul的标记好算,主要是每次的加法到底会被mul如何影响。主要是你肯定无法直接维护每个函数的2操作集合,因为这可以到平方级别。所以我们直接维护每个2操作的操......