2xN Grid

题目:

题意解析:

现在有两个长度为 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值