P1884 [USACO12FEB]Overplanting S——洛谷

news/2024/12/13 17:56:47/

在这里插入图片描述
解题思路: 离散化 + 差分矩阵
解题步骤:
在这里插入图片描述
因为原始坐标系与差分的坐标系不同,所以要进行坐标系的变换
在这里插入图片描述
离散化处理缩小查找空间
在这里插入图片描述
图中坐标离散化后,再转化为格子的坐标,因为之前存贮的坐标是点的坐标,每个格子存储一个矩形
在这里插入图片描述

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int N = 2020;
vector<int> allx, ally;//存放所有点的横纵坐标
map<int, int> mapx, mapy;//映射坐标对应的下标
vector<PII> rec[2];//存放矩形
int a[N][N], b[N][N];
void insert(int x1, int y1, int x2, int y2, int c)
{b[x1][y1] += c;b[x2 + 1][y1] -= c;b[x1][y2 + 1] -= c;b[x2 + 1][y2 + 1] += c;
}
int main()
{int n; cin >> n;//输入所有的x, y 坐标到数组allx和ally中, 准备离散化allx.push_back(0);ally.push_back(0);for(int i = 0; i < n; i++){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;rec[0].push_back({y2, x1}); //注意坐标系的转换rec[1].push_back({y1, x2});allx.push_back(y1);allx.push_back(y2);ally.push_back(x1);ally.push_back(x2);}//排序, 去重sort(allx.begin() + 1, allx.end());allx.erase(unique(allx.begin() + 1, allx.end()), allx.end());sort(ally.begin() + 1, ally.end());ally.erase(unique(ally.begin() + 1, ally.end()), ally.end());//建立x 和y坐标的map映射for(int i = 1; i < allx.size(); i++) mapx[allx[i]] = i;for(int i = 1; i < ally.size(); i++) mapy[ally[i]] = i;//差分矩阵for(int i = 0; i < n; i++){int x1, y1 , x2, y2;x1 = rec[0][i].first;//点的实际坐标y1 = rec[0][i].second;x2 = rec[1][i].first;y2 = rec[1][i].second;insert(mapx[x1], mapy[y1], mapx[x2] - 1, mapy[y2] - 1, 1);//映射为格子下标}//求前缀和矩阵for(int i = 1; i <= allx.size(); i++)for(int j = 1; j <= ally.size(); j++)a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];//将前缀和矩阵中被覆盖的格子,还原成原坐标系中的矩阵,进行面积求和LL area = 0;for(int i = 1; i <= allx.size(); i++)for(int j = 1; j <= ally.size(); j++){if(a[i][j]){int x1, y1, x2, y2;x1 = allx[i];y1 = ally[j];x2 = allx[i + 1];y2 = ally[j + 1];area += (LL)(x2 - x1) * (y2 - y1);}}cout << area << endl;return 0;
}

http://www.ppmy.cn/news/628808.html

相关文章

dfs-1756:八皇后及1700:八皇后问题

总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚&#xff1a;皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上&#xff08;有8 * 8个方格&#xff09;&#xff0c;使它们谁也不能被吃掉&#xff01;这就是著名的八皇后问题…

uva705 - Slash Maze 【转化+dfs】

题目&#xff1a;uva705 - Slash Maze 题意&#xff1a;给出一个迷宫&#xff0c;看题目给出的图就知道&#xff0c;由 \ 和 / 组成&#xff0c;让你求有几个环&#xff0c;然后最大的环由几个矩形组成。 分析&#xff1a;这是一道很灵活的题目&#xff0c;关键在于对题目给出…

洛谷 P2895 [USACO08FEB]Meteor Shower S(BFS与时间)

题目 https://www.luogu.com.cn/problem/P2895#submit 思路 有一些问题与时间有关&#xff0c;往往题目描述是&#xff1a;每隔一段时间&#xff0c;一些点就被摧毁而不能走了&#xff0c;问能够到达指定点或者到达指定点的时间&#xff1f; 这类问题可以使用BFS求解&#xf…

洛谷CF1551B

#include<stdlib.h> #include<stdio.h> using namespace std; int t; char data[55]; int flag[26];//标记所有字母是否出现过 int num1; int num2; int num; int main() { scanf("%d",&t); char temp; scanf("\n"); for(…

洛谷P2888 [USACO07NOV]Cow Hurdles S 题解

洛谷P2888 [USACO07NOV]Cow Hurdles S 题解 题目链接&#xff1a;P2888 [USACO07NOV]Cow Hurdles S 题意&#xff1a;Farmer John 想让她的奶牛准备郡级跳跃比赛&#xff0c;贝茜和她的伙伴们正在练习跨栏。她们很累&#xff0c;所以她们想消耗最少的能量来跨栏。 显然&#x…

洛谷P2768

二分真的好难/(ㄒoㄒ)/~~&#xff01; 首先看题&#xff0c;题目中我们可以知道选手跳跃最短距离的最大值&#xff0c;所以我们可以使用二分。 判断是否需要二分可以看题目中是否有类似求最短距离的最大值或者最大距离的最小值。 那么本题怎么进行二分呢 我们可以以整段距离…

Buffalo框架的使用

【整体介绍&#xff0c;建议先看完下面的内容在回过来看这个介绍】当用户输入账号密码后&#xff0c;点击“提交”按钮&#xff0c;则执行JSh中的getInfo()方法&#xff0c;该方法会调用Buffalo框架中的remoteCall("UserService.getInfo",[username,password],functi…

洛谷 AT_abc178_b [ABC178B] Product Max

洛谷 AT_abc178_b [ABC178B] Product Max 1、题目题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示制約Sample Explanation 1Sample Explanation 2 2、翻译题面&#xff1a; AC代码&#xff…