2022icpc 南京站 Stop, Yesterday Please No More - 二维差分

2023-11-07 16:04

本文主要是介绍2022icpc 南京站 Stop, Yesterday Please No More - 二维差分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题面

分析

题面很长,发现都是一些废话,最初不难想到可以先不看那个洞在哪,先进行处理,找出最后留下的袋鼠有多少,难点是接下来怎么操作能够来记录洞的移动,可以进行差分记录矩形的左上角位置,保证洞只会移动一次在一个位置,为了防止矩形出界,可以在第一次没有洞处理时,并不是真正模拟,只不过是消去相对的袋鼠,假如向上移动,那么第一行就会出界,所以相应操作就是删去第一行,类似这样,最后得到最终矩形,第二次就可以正常模拟,因为第一次模拟已经保证了不会出界,记录左上角的下标,最后通过对差分的统计,计算有多少个位置可以满足题意。

代码
#include <bits/stdc++.h>using namespace std;
using ll = long long;const int N = 1010;int b[N][N];
int vis[N][N];void insert(int x1, int y1, int x2, int y2) {b[x1][y1] ++;b[x2 + 1][y1] --;b[x1][y2 + 1] --;b[x2 + 1][y2 + 1] ++;
}void solve() {int n, m, k;cin >> n >> m >> k;memset(b, 0, sizeof b);memset(vis, 0, sizeof vis);string s;cin >> s;int u = 1;int l = 1;int r = m;int d = n;int U = u;int D = d;int R = r;int L = l;for(int i = 0; i < s.size(); i ++) {if(s[i] == 'U') U ++, D ++;else if(s[i] == 'D') D --, U --;else if(s[i] == 'L') L ++, R ++;else L --, R --;u = max(U, u);d = min(d, D);l = max(L, l);r = min(r, R);}int last = (d - u + 1) * (r - l + 1) - k;if(l > r || u > d) {if(k) cout << 0 << "\n";else cout << n * m << "\n";return ;}if(last < 0) {cout << 0 << "\n";return ;}insert(u, l, d, r);vis[u][l] = 1;for(int i = 0; i < s.size(); i ++) {if(s[i] == 'U') u --, d --;else if(s[i] == 'D') u ++, d ++;else if(s[i] == 'L') l --, r --;else l ++, r ++;//cout << u << ' ' << l << ' ' << d << ' ' << r << endl;if(vis[u][l]) continue;vis[u][l] = 1;insert(u, l, d, r);}for(int i = 1; i <= n; i ++) {for(int j = 1; j <= m; j ++) b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + b[i][j];}int ans = 0;for(int i = 1; i <= n; i ++) {for(int j = 1; j <= m; j ++) {if(b[i][j] == last) ans ++;}}cout << ans << "\n";
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while(T --) {solve();}
}

这篇关于2022icpc 南京站 Stop, Yesterday Please No More - 二维差分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364743

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin