题目:
题意解析:
现在有两个长度为 L 的序列a,b,找出有多少个下标 i 满足 ai=bi(1≤i≤L)。
由于 L 十分地大,因此 a 被体现为一个长度为 N1 的二元组序列。下面是二元组序列的生成方式:
- 对于所有 a 序列中的 ai=ai+1,我们在 (i,i+1) 中间切割一次。
- 最后 a 序列会被切割成 N1 块,每一块都是由 li 个相同的数 xi 组成的。我们将每一块表示成一个二元组 (xi,li),从左至右拼接起来即可得到一个长度为 N1 的二元组序列。
同理,b 被体现为一个长度为 N2 的二元组序列。
给出 L,N1,N2 以及两个二元组序列,解决本题开头的问题。
题解:
(1)使用a b两个数组来记录输入的第一个数组的情况,a数组记录当前数,b数组记录当前数的个数。
(2)在第二个数组输入的时候,用一个数来记录第一个数组进行到那个数的下标,一个数来记录相同的数的和。
(3)在第二个数组输入的时候,先判断当前下标的数量是不是为0,如果是的话下标向后走。
(4)第二个数组输入的长度与第一个数组下标位置的长度对比。
代码:
#include<bits/stdc++.h>
using namespace std;
long long int t,n,m;
vector<long long int> a,b;
int main() {
cin>>t>>n>>m;
long long int x,y;
for(int i=0; i<n; i++) {
cin>>x>>y;
a.push_back(x);
b.push_back(y);
}
long long int ans=0,j=0,k=a[0],l=b[0];
for(int i=0; i<m; i++) {
cin>>x>>y;
while(y!=0){
if(l==0){
j++;
k=a[j];
l=b[j];
}
if(l>=y){
if(k==x){
ans+=y;
}
l-=y;
y=0;
}else{
if(k==x){
ans+=l;
}
y-=l;
l=0;
}
}
}
cout<<ans;
return 0;
}