zoukankan      html  css  js  c++  java
  • 51 Nod 2497 数三角形 二分

    小b有一个仅包含非负整数的数组a,她想知道有多少个三元组(i,j,k),满足i<j<k且a[i],a[j],a[k]可能作为某个三角形的三条边的边长。

     

    输入

    第一行输入一个正整数n,表示数组a中元素个数;
    第二行n个非负整数,表示a中元素,以空格隔开;
    其中0<n≤1000,a中任意元素a[i]满足0≤a[i]≤1000。

    输出

    输出一个数,表示满足题意的三元组个数

    输入样例

    4
    2 2 3 4

    输出样例

    3


    很容易想到一个O(n^2 * logn)的解法,我们将原来数组排完序后,枚举两个较小的边,然后二分出最长边的范围即可;
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<set>
    #include<map>
    using namespace std;
    #define maxn 100005
    #define rdint(x) scanf("%d",&x)
    typedef long long ll;
    
    int n;
    int a[1002];
    int main() {
    	rdint(n);
    	for (int i = 1; i <= n; i++)rdint(a[i]);
    	int tot = 0;
    	sort(a + 1, a + 1 + n);
    //	int nn = unique(a + 1, a + 1 + n) - (a + 1);
    	for (int i = 1; i < n; i++) {
    		for (int j = i + 1; j < n; j++) {
    			int l = j + 1;
    			int r = n;
    			int ans1 = -1;
    			while (l <= r) {
    				int mid = (l + r) / 2;
    				if (a[mid] > (a[j] - a[i])) {
    					r = mid - 1; ans1 = mid;
    				}
    				else {
    					l = mid + 1;
    				}
    			}
    			ans1 = upper_bound(a + 1 + j + 1, a + 1 + n, a[j] - a[i]) - (a + 1);
    			l = j + 1; r = n;
    			int ans2 = -1;
    			ans2 = lower_bound(a + 1 + j + 1, a + 1 + n, a[i] + a[j]) - (a + 1);
    //			cout << ans1 << ' ' << ans2 <<' '<< a[i] + a[j] << endl;
    			if (ans1 == -1 || ans2 == -1)continue;
    //			tot += (ans2 - ans1 + 1);
    
    			
    			else if (ans2 == ans1 && a[ans1] > a[i] + a[j]) {
    				tot += 0;
    			}
    			else if (ans2 == ans1 && a[ans2] < a[i] + a[j]) {
    //				cout << 2 << endl;
    				tot += (ans2 - ans1 + 1);
    			}
    			else if (ans2 > ans1 && a[ans2]<a[i]+a[j]) {
    				tot += (ans2 - ans1 + 1);
    			}
    			else if (ans2 > ans1&& a[ans2] >= a[i] + a[j]) {
    				tot += (ans2 - ans1);
    			}
    		}
    	}
    	printf("%d
    ", tot);
    //	system("pause");
    }
    

      

    
    
  • 相关阅读:
    python3中的文件操作
    python3网络爬虫实现有道词典翻译功能
    C++11 thread condition_variable mutex 综合使用
    goland scope pattern 设置
    Go 1.11 Module 介绍
    hustOJ 添加 golang 支持
    docker 搭建 hustoj
    最长重复字符串题解 golang
    golang 结构体中的匿名接口
    使用aliyun cli工具快速创建云主机
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/11116181.html
Copyright © 2011-2022 走看看