51nod 1267二分+优化试验场

最初,最开始的时候,万能的学姐曾经警告过我们,千万别用什么老狮子MAP,手撸map或者字典树。。。当时不甚理解。。。今天。。。这题直接卡掉了我的MAP,但是使用朴素方法进行二分。。。不加优化,,都不需要这个架势。。。直接相差了将近十倍,在我开了优化之后快了20倍左右。。。。

上代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const long long MAXN=1233;
 5
 6
 7 class node
 8 {
 9     public:
10     long long a,b,summ;
11
12 };
13 node nodes[MAXN*MAXN];
14 bool cmp(node n,node n1)
15 {
16     return n.summ<n1.summ;
17 }
18 long long n;
19 long long arr[MAXN];
20 long long app[MAXN];
21 long long appoint=0;
22 long long point=0;
23 bool check(node &n1,node &n2)
24 {
25     if(n1.a==n2.a)return false;
26     if(n1.a==n2.b)return false;
27     if(n1.b==n2.a)return false;
28     if(n1.b==n2.b)return false;
29     return true;
30 }
31 void init()
32 {
33     cin>>n;
34     for(int i=0;i<n;++i)
35     {
36         cin>>arr[i];
37     }
38
39     for(int i=0;i<n;++i)
40     {
41         for(int j=i+1;j<n;++j)
42         {
43             nodes[point].a=i;
44             nodes[point].b=j;
45             nodes[point].summ=arr[i]+arr[j];
46             point++;
47         }
48     }sort(nodes,nodes+point,cmp);
49 }
50
51 bool succ=0;
52 set<long long>s1;
53 int main()
54 {
55     cin.sync_with_stdio(false);
56     init();
57     for(int i=0;i<point;++i)
58     {
59         if(s1.count(nodes[i].summ))continue;
60         s1.insert(nodes[i].summ);
61         if()
62
63         node n1=nodes[i];
64         n1.summ=-n1.summ;
65         int pos=lower_bound(nodes,nodes+point,n1,cmp)-nodes;
66         while(nodes[pos].summ==n1.summ)
67         {
68             if(check(nodes[pos],n1))
69             {
70                 succ=1;
71                 break;
72             }pos++;
73         }
74         if(succ)break;
75 //        cout<<"target: "<<n1.summ<<"  answer: "<<nodes[pos].summ<<endl;
76     }
77     if(succ)cout<<"Yes"<<endl;
78     else cout<<"No"<<endl;
79     return 0;
80 }
时间: 2025-01-06 20:26:31

51nod 1267二分+优化试验场的相关文章

51nod 1267 二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:

最长上升子序列的二分优化

http://blog.csdn.net/wall_f/article/details/8295812 作者写的太好了,转载一下~ 我简单总结一下,我的理解. 最长上升子序列的转移方程:b[k]=max(max(b[j]|a[j]<a[k],j<k)+1,1); 其优化主要在求解当前最长长度是要查找前面的b数组中是否有最大的值,且当前期a[j]<a[k],因此就是要找小于当前值的最大值. 所以我们一般需要从1~k-1扫描一遍找到最大值,复杂度为o(n^2),耗时太长. 因此我们可以直接记

HDU 1025:Constructing Roads In JGShining&#39;s Kingdom(LIS+二分优化)

http://acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines.Half of these cities are r

硬币问题 (dp,多重背包的二分优化)

题目描述 给你n种硬币,知道每种的面值Ai和每种的数量Ci.问能凑出多少种不大于m的面值. 输入 有多组数据,每一组第一行有两个整数 n(1≤n≤100)和m(m≤100000),第二行有2n个整数,即面值A1,A2,A3,…,An和数量C1,C2,C3,…,Cn (1≤Ai≤100000,1≤Ci≤1000).所有数据结束以2个0表示. 输出 每组数据输出一行答案. 样例输入 3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0 样例输出 8 4 背包问题的复杂度是n*m,这题如果

POJ 3903:Stock Exchange(裸LIS + 二分优化)

http://poj.org/problem?id=3903 Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5983   Accepted: 2096 Description The world financial crisis is quite a subject. Some people are more relaxed while others are quite anxious. J

poj3258——二分优化

poj3258——二分优化 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8201   Accepted: 3531 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock

poj3273——经典的二分优化

poj3273——经典的二分优化 Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16522   Accepted: 6570 Description Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already

HDU 1025 LIS二分优化

题目链接: acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28755    Accepted Submission(s): 8149 Problem Description

51nod 1090 3个数和为0 &amp; 51nod 1267 4个数和为0(标记二分)

题目意思: 3个数的和为0: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 -