```cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll v[maxn][4],l[maxn][4],s[maxn],len,L=1,R,posl,posr,ans;
int n1,n2;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>len>>n1>>n2;
for(int i=1;i<=n1;i++)
cin>>v[i][1]>>l[i][1];
for(int i=1;i<=n2;i++)
cin>>v[i][2]>>l[i][2];
for(int i=1;i<=n1;i++)
s[i]=s[i-1]+l[i][1];
s[n1+1]=s[n1]+1;
for(int i=1;i<=n2;i++){
int c=v[i][2];
R=L+l[i][2]-1;
posl=lower_bound(s+1,s+n1+2,L)-s;
posr=upper_bound(s+1,s+n1+2,R)-s;
if(s[posr-1]>=R) posr--;
if(posl==posr){
if(v[posl][1]==c) ans+=(R-L+1);
L+=l[i][2];
continue;
}
for(int j=posl+1;j<posr;j++)
if(v[j][1]==c) ans+=l[j][1];
int cnt=s[posl]-L+1;
if(v[posl][1]==c) ans+=cnt;
cnt=R-s[posr-1];
if(v[posr][1]==c) ans+=cnt;
L+=l[i][2];
}
cout<<ans;
return 0;
}
```
by aCssen @ 2023-03-19 22:04:55
```cpp
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int val1[N]; ll pos1[N];
int val2[N]; ll pos2[N];
int main()
{
ll sum, ans = 0;
int n1, n2;
scanf("%lld%d%d", &sum, &n1, &n2);
vector <ll> vec; vec.push_back(0);
for (int i = 1; i <= n1; i++) scanf("%d%lld", &val1[i], &pos1[i]), pos1[i] += pos1[i - 1], vec.push_back(pos1[i]);
for (int i = 1; i <= n2; i++) scanf("%d%lld", &val2[i], &pos2[i]), pos2[i] += pos2[i - 1], vec.push_back(pos2[i]);
sort(vec.begin(), vec.end());
for (int i = 1, siz = vec.size(); i < siz; i++)
{
int col1 = val1[lower_bound(pos1 + 1, pos1 + n1 + 1, vec[i]) - pos1];
int col2 = val2[lower_bound(pos2 + 1, pos2 + n2 + 1, vec[i]) - pos2];
if (col1 == col2) ans += (vec[i] - vec[i - 1]);
}
cout << ans;
return 0;
}
```
by liangbowen @ 2023-03-19 22:06:50
@[yjx2049](/user/372426) 模拟,楼上代码很清楚了
by Xy_top @ 2023-03-19 22:08:46
给另一个思路。
```cpp
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=10000050;
int v[maxn],v1[maxn],l1[maxn],r1[maxn],l2[maxn],r2[maxn];
signed main() {
int len,n,m;
cin>>len>>n>>m;
int now=1;
for(int i=1;i<=n;i++){
int l;
cin>>v[i]>>l;
l1[i]=now;
r1[i]=now+l-1;
now=r1[i]+1;
}
now=1;
for (int i=1;i<=m;i++){
int l;
cin>>v1[i]>>l;
l2[i]=now;
r2[i]=now+l-1;
now=r2[i]+1;
}
int h1=1,h2=1;
int ans=0;
while(h1<=n&&h2<=m){
if(v[h1]==v1[h2])
ans+=min(r1[h1],r2[h2])-max(l1[h1],l2[h2])+1;
if(r1[h1]<=r2[h2])h1++;
else h2++;
}
cout<<ans;
return 0;
}
```
by _zzzzzzy_ @ 2023-03-19 22:16:13
![](//图.tk/1)原来如此,感谢各位
by yjx2049 @ 2023-03-19 22:16:34
真不是直接双指针?真不是直接双指针?真不是直接双指针?
```cpp
#include <iostream>
using namespace std;
using LL = long long;
using Pll = pair<LL, LL>;
const int kN = 1e5 + 1;
LL l;
int n, m, h = 1;
Pll a[kN];
LL ans;
int main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> l >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i].first >> a[i].second;
}
for (int i = 1; i <= m; ++i) {
int v;
LL c;
cin >> v >> c;
for (; c; ) {
LL _c = min(c, a[h].second);
if (v == a[h].first) {
ans += _c;
}
c -= _c, a[h].second -= _c;
if (!a[h].second) {
++h;
}
}
}
cout << ans;
return 0;
}
```
by bykem @ 2023-03-19 22:18:12
@[yjx2049](/user/372426)
```
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll n,m,k;
ll l[2][N],r[2][N];
ll ans=0;
int main(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++)cin>>l[0][i]>>r[0][i];
for(int i=1;i<=k;i++)cin>>l[1][i]>>r[1][i];
ll lt=0,rt=0,ls=0,rs=0,rw=0;
for(int i=1;i<=m;i++){
lt=rt+1,rt=lt+r[0][i]-1;
if(l[0][i]==l[1][rw])ans+=min(rs,rt)-lt+1;
while(rs<=rt&&rw<=k){
rw++;if(rw>k)break;
ls=rs+1,rs=r[1][rw]+ls-1;//if(rs>rt)break;
if(l[0][i]==l[1][rw])ans+=min(rs,rt)-ls+1;
}
}printf("%lld\n",ans);
return 0;
}
```
by _____________1 @ 2023-03-19 22:19:26
用双指针的做法。
by _____________1 @ 2023-03-19 22:19:47
谢谢大家。鉴定为人菜了![](//图.tk/0)
by yjx2049 @ 2023-03-19 22:27:04