hdu--4334-双指针

这个方法其实 蛮常用的 

一般给你3个集合  然后让你满足某个等式 a[x]+b[y] = c[z]

我们通常都是枚举一个集合 然后用两个指针分别指向另外2个集合中的一头一尾  然后进行大小比较来 指针移动

当然 这也是和 二分一样建立在 有序的基础之上进行的

这题 用这个方法解决 就可以了

当然 二分也可以

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int n;
 6 const int size = 210;
 7 typedef __int64 LL;
 8 LL sum1[size*size] , sum2[size*size] , sum3[size];
 9 LL a[10][size];
10 
11 bool solve( )
12 {
13     bool flag = false;
14     for( int i = 0 ; i<n ; i++ )
15     {
16         LL* st = sum1;
17         LL* end = sum2 + n*n-1 ;
18         while( st<=sum1+n*n-1 && end>=sum2 )
19         {
20             if( *st + *end  + sum3[i] == 0 )
21             {
22                 flag = true;
23                 break;
24             }
25             else if( *st + *end + sum3[i] < 0 )
26             {
27                 ++ st;
28             }
29             else
30             {
31                 -- end;
32             }
33         }
34         if( flag )
35         {
36             break;
37         }
38     }
39     return flag;
40 }
41 
42 int main()
43 {
44     cin.sync_with_stdio(false);
45     int t , cnt , tot;
46     bool ans;
47     cin >> t;
48     while( t-- )
49     {
50         cin >> n;
51         for( int i = 1 ; i<=5 ; i++ )
52         {
53             for( int j = 1 ; j<=n ; j++ )
54             {
55                 cin >> a[i][j];
56             }
57         }
58         tot = 0;
59         for( int j = 1 ; j<=n ; j++ )
60         {
61             for( int k = 1 ; k<=n ; k++ )
62             {
63                 sum1[tot++] = a[1][j] + a[2][k];
64             }
65         }
66         tot = cnt = 0;
67         for( int j = 1 ; j<=n ; j++ )
68         {
69             for( int k = 1 ; k<=n ; k++ )
70             {
71                 sum2[tot++] = a[3][j] + a[4][k];
72             }
73             sum3[cnt++] = a[5][j];
74         }
75         sort( sum1 , sum1+n*n );
76         sort( sum2 , sum2+n*n );
77         ans = solve( );
78         if( ans )
79             cout << "Yes" << endl;
80         else
81             cout << "No" << endl;
82     }
83     return 0;
84 }
View Code

 

today:

  约你出来

  你不出来

  放我鸽子

转载于:https://www.cnblogs.com/radical/p/4126963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值