【map/map扩充】和数检测
题目描述
给定n个正整数d1, d2, …, dn。如果取出其中的任意两个数(可以相同),则可以得到这两个数的和。对于n个数,则至多可以产生(n×(n+1))/2种不同的和。
给出正整数m,你需要判断:是否存在两个整数u, v,满足du + dv = m。
给出正整数m,你需要判断:是否存在两个整数u, v,满足du + dv = m。
输入
本题一个输入中包含多组数据。输入第一行为一个整数T,表示数据组数。
对于每组数据,输入的第一行为两个正整数n, m,输入的第二行为n个正整数d1, d2, …, dn。
对于每组数据,输入的第一行为两个正整数n, m,输入的第二行为n个正整数d1, d2, …, dn。
输出
输出T行,每行一个整数。如果正整数u, v存在,则输出1;否则输出0。
#include <bits/stdc++.h> #define ll long long using namespace std; int n,m,t; int a[1000005]; int scan() { int res = 0, flag = 0; char ch; if ((ch = getchar()) == '-') { flag = 1; } else if(ch >= '0' && ch <= '9') { res = ch - '0'; } while ((ch = getchar()) >= '0' && ch <= '9') { res = res * 10 + (ch - '0'); } return flag ? -res : res; } void Out(int a) { if (a < 0) { putchar('-'); a = -a; } if (a >= 10) { Out(a / 10); } putchar(a % 10 + '0'); } int main() { scanf("%d",&t); while(t--) { unordered_map<int,int> mp; n=scan(); m=scan(); int f=1; int x; for(int i=0;i<n;i++) { a[i]=scan(); if(f){ if(mp[m-a[i]]==1) { f=0; } if(mp[m-a[i]]!=1) { mp[a[i]]=1; mp[m-a[i]]=2; } if(mp[a[i]]==2) { f=0; } } //cout<<mp[a[i]]<<" "<<mp[m-a[i]]<<endl; } if(f) printf("0\n"); else printf("1\n"); } return 0; }