题目链接如下:
http://codeforces.com/contest/988/problem/C
题目大意是给你k个序列,你从中找出两个序列,使得这两个序列各自去掉一个数字以后的和相等。
学到了map的操作,每一次输入时计算sum,接着遍历所有的sum-a[i]的情况,如果这个数值出现过,就不用再进行后面的判断了,直接继续输入就好。注意分析题目,所有的n相加不超过2*10^5,所以复杂度不会T。
代码如下:
#include<bits/stdc++.h> using namespace std; map<int,map<int,int> > p; map<int,int> vis; #define N 200005 int main() { int k,a[N],flag=0,ans11,ans12,ans21,ans22; cin>>k; vis.clear(); for(int i=0;i<k;i++) { int n,sum=0; cin>>n; for(int j=0;j<n;j++) { cin>>a[j]; sum+=a[j]; } if(flag) continue; for(int j=0;j<n;j++) { int tmp=sum-a[j]; if(vis[tmp]==0||p[tmp][1]==i) { vis[tmp]=1; p[tmp][1]=i; p[tmp][2]=j; } else { flag=1; ans11=p[tmp][1]; ans12=p[tmp][2]; ans21=i; ans22=j; } } } if(flag==0) printf("NO "); else { printf("YES "); printf("%d %d ",ans11+1,ans12+1); printf("%d %d ",ans21+1,ans22+1); } return 0; }