求助ABC E

学术版

```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


|