题目描述

The season for Snuke Festival has come again this year. First of all, Ringo will perform a ritual to summon Snuke. For the ritual, he needs an altar, which consists of three parts, one in each of the three categories: upper, middle and lower.
He has N parts for each of the three categories. The size of the i-th upper part is Ai, the size of the i-th middle part is Bi, and the size of the i-th lower part is Ci.
To build an altar, the size of the middle part must be strictly greater than that of the upper part, and the size of the lower part must be strictly greater than that of the middle part. On the other hand, any three parts that satisfy these conditions can be combined to form an altar.
How many different altars can Ringo build? Here, two altars are considered different when at least one of the three parts used is different.

Constraints
1≤N≤105
1≤Ai≤109(1≤i≤N)
1≤Bi≤109(1≤i≤N)
1≤Ci≤109(1≤i≤N)
All input values are integers.

输入

Input is given from Standard Input in the following format:
N
A1 … AN
B1 … BN
C1 … CN

输出

Print the number of different altars that Ringo can build.

样例输入

2
1 5
2 4
3 6

样例输出

3

提示

The following three altars can be built:
Upper: 1-st part, Middle: 1-st part, Lower: 1-st part
Upper: 1-st part, Middle: 1-st part, Lower: 2-nd part
Upper: 1-st part, Middle: 2-nd part, Lower: 2-nd part

binary函数写的太麻烦了,不如分开写,不过总算是通过了。

在数据量很大的时候,使用sort函数排序之后在用二分法是很快的。

代码:

#include <iostream>     
#include <algorithm>         
using namespace std;
typedef long long ll;
const int inf=1e5+10;
int A[inf],B[inf],C[inf];

ll binary(int *arr,int low,int high,int temp,int flag)  
{
    while(low<=high)  
    {
        int middle=(low+high)/2;
        if(arr[middle]==temp)      
        {
            if(flag==1)
            {
                high=middle;
                while(low<=high)
                {
                    middle=(low+high)>>1;
                    if(arr[middle]>=temp) high=middle-1;
                    else low=middle+1;
                } 
                return high+1;     
            }    
            else
            {
                low=middle;
                while(low<=high)
                {
                    middle=(low+high)>>1;
                    if(arr[middle]<=temp)low=middle+1;  
                    else high=middle-1;
                }
                return low-1;                           
            }
        }
        if(arr[middle]<temp)
            low=middle+1;
        if(arr[middle]>temp)
            high=middle-1;    
    }
    return high;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&A[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&B[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&C[i]);
    sort(A+1,A+n+1);
    sort(B+1,B+n+1);    
    sort(C+1,C+n+1);
    long long sum=0; 
    for(int i=1;i<=n;i++)
    {                                    
        ll ans1=binary(A,1,n,B[i],1);      
        if(A[ans1]==B[i])
            ans1--; 
        ll ans2=binary(C,1,n,B[i],3);        
        ans2=n-ans2;
        sum=sum+ans1*ans2;        
    }
    printf("%lld\n",sum);                 
    return 0;
}

Snuke Festival(二分法)相关推荐

  1. 搜索 —— 暴力搜索

    [暴力搜索] 暴力搜索,就是将所有情况都举出,并判断其是否符合题目条件.其基本方法是分析题意后,找到一个合适的维度列举每一个元素,以完成题目. 一般主流的 OJ 中,1000ms 的时间限制下可以运行 ...

  2. 数据结构 单词查找 二分法-索引表-Hash表

    问题说明: 从标准输入中读入一个英文单词及查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt中查找该单词,返回查找结果(查找到返回1,否则返回0)和查找过程中单词的比较次数 ...

  3. 左神讲算法——二分法及其拓展

    目录 1. 经典二分例题 2. 拓展例题一:寻找大于等于某数最左侧位置 3. 拓展例题二:局部最小值问题 参考链接:2021最新左神数据结构算法全家桶 1. 经典二分例题 题目一:在一个有序数组中,找 ...

  4. Java 二分法查找

    二分法查找的步骤 1 查找前元素先排序 2 确定中间区域的位置mid=(low+high)/2 3 比较 如果等于要查找的值则直接返回,如果大于查找的值,那么则去小的部分查找每次则会减1 如果要查找的 ...

  5. C语言---二分法搜索

    //一维数组二分法 #include <stdio.h> int search(int number,int dict[],int length); //二分法搜索函数声明,返回下标 in ...

  6. 二分法:search insert position 插入位置

    问题描述: 给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里 出现,则返回target所在下标,如果target在nums里未出现,则返回target应该 插入 ...

  7. python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...

    查找是指在大量的信息中寻找一个特定的信息.在计算机中,查找是非常重要的一个应用,比如"百度".查找算法的好坏直接影响查找的速度. 常用的查找算法主要有顺序查找和折半(二分法)查找: ...

  8. 7-5 二分法求多项式单根 (20分)

    二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f( r )=0. 二分法的步骤为: 检查区间长度,如 ...

  9. 【二级java】 二分法查找

    例题1 :对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为______. 解析: 如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功 查找次数为1 如果线形表中不存在该数 ...

最新文章

  1. pup 流程控制语句(下)
  2. 08查找满足条件的n个数
  3. 解决EditText在ListView Item中,第一次点击无法获取焦点问题
  4. 揭秘重度MMORPG手游后台性能优化方案
  5. SAP Cloud for Customer的Contact和Account的从属关系
  6. php 判断update返回为0_PHP进行数据库更新update操作,返回状态
  7. ssas 分区 设置_分区SSAS多维数据集的好处
  8. spring mvc请求的时候是如何找到正确的Controller
  9. python能做什么-大家都在学的 Python,可以用来干什么?
  10. 桶排序(bucket sort)
  11. js 加载html文件内容,js读取txt文件内容
  12. HBase 官方文档0.97.0
  13. 《计算机入门》模拟卷 b卷,《计算机入门》模拟试卷B.doc
  14. 墨刀产品设计大赛获奖名单出炉了!作品都太强了,速来围观
  15. IObit Uninstaller(电脑软件彻底卸载, 包含注册表) 彻底解决软件卸载不干净的问题
  16. UVM-sequence
  17. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十)-Java反序列化漏洞(2)
  18. 如何打开.pt文件?
  19. 艾森哲面试 Accenture
  20. 总有你不知道的,你说呢?

热门文章

  1. maven 上传jar 包含源码
  2. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!...
  3. 创建分辨率自适应的Windows Phone 8应用程序
  4. 第三章 Selenide测试框架(三)
  5. BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
  6. 我们距离“云”还有多远?
  7. jQuery的Autocomplete插件的远程url取json数据的问题
  8. java--Hibernate添加数据save
  9. linux故障排除与修复(troubleshooting)
  10. 使用open flash chart的BarGlass时遇到的问题