题目链接:E - 2xN Grid
题意:给我们一面长度为L的墙,分为上下两部分,每个部分都会有L列。现如今我们给出一个N1和N2,N1代表的上面墙给出的数据组数,N2表示的是下面的墙有多少组数据。每一组数据都是由两个数组成的,分别是数和长度。例如1 2表示的就是在开始的位置连续两个方块都是1。3 2表示的就是从上一次结束的位置开始我们由2块方块上写着3。最后让我们求出一共会有多少列的数据是一样的。
如果题意没看明白的可以自己对着下面的图模拟一下。
大体思路:
我们可以枚举所有的组数,当上面的墙的开始位置和下面的墙的开始位置是对应上的时候我们的结果就加上上面长度和下面长度的最小值。当上下两个的结尾不一样的时候我们就分情况讨论一下,当上面的连续长度大于下面的连续长度,这时候我们就可以让长的那一个部分减去上下墙长度的公共长度,并且让短的哪一个部分,往后走一位,这样就能实现我们的目的了。
具体的代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';
typedef pair<int, int> PII;
typedef long long ll;
const int N = 2e5 + 10, mod = 998244353;
ll a[N], b[N];
void solve()
{
ll l, n, m;
cin >> l >> n >> m;
for (ll i = 0; i < n; i++)
cin >> a[i] >> b[i];
for (ll i = n; i < n + m; i++)
cin >> a[i] >> b[i];
ll c = 0, d = n, res = 0;
for (ll i = 0; i < n + m; i++)
{
if (a[c] == a[d])
res += min(b[c], b[d]);
if (b[c] < b[d])
{
b[d] -= b[c];
c++;
}
else
{
b[c] -= b[d];
d++;
}
}
cout << res << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(0);
solve();
return 0;
}