首页 > 其他分享 >C. Binary Search

C. Binary Search

时间:2023-04-05 21:02:05浏览次数:40  
标签:Binary Search int mid les ans size mod

题目

题意

  • 给一个数字n,构造出一个全排列的数组a,满足上面二分结果为true
  • 请求出不同全排列数组a的数量,答案模1e9+7

思路

  • 模拟:按照二叉查找树的思路,模拟这个二分所有可能遇到的mid,使得判断条件成立(为什么落在最后的点上?因为是折半查找,搜索树上没有重复的节点)
  • 这样得到了必须大于等于x位置的数量,和必须小于x位置的数量,也就是知道了剩下没有遇到的位置该如何排列(全排列)
  • ans = C[Cles][les.size()] * fact[les.size()] % mod;计算小于的数量(特殊处理遇到pos节点的位置,即忽略)
    ans = (ans * (C[Cgre][gre.size()] * fact[gre.size()] % mod)) % mod;计算大于的数量
    ans = (ans * fact[n - les.size() - gre.size() - 1]) % mod;计算剩余的排列数量
  • 需要用到组合数和计数原理,和二分

代码

const double PI = acos(-1.0);
const int N = 1010, mod = 1e9 + 7;
int C[N][N];
int fact[N];
void solve()
{
    int n, x, pos;
    cin >> n >> x >> pos;
    vector<int> gre, les;
    vector<int> idx;
    int l = 0, r = n;
    while(l < r)
    {
        int mid = l + r >> 1;
        idx.push_back(mid);
        if(mid <= pos)
        {
            l = mid + 1;
            if(mid != pos)les.push_back(mid);
        }
        else
        {
            r = mid;
            gre.push_back(mid);
        }
        // debug1(mid);
    }
    
    int Cles = x - 1;
    int Cgre = n - x;
    // debug2(Cles, Cgre);
    // debug2(les.size(), gre.size());
    int ans = C[Cles][les.size()] * fact[les.size()] % mod;
    ans = (ans * (C[Cgre][gre.size()] * fact[gre.size()] % mod)) % mod;
    ans = (ans * fact[n - les.size() - gre.size() - 1]) % mod;
    cout << ans << endl;
}

signed main()
{

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    C[0][0] = fact[0] = 1;
    for (int i = 1; i <= 1000;i ++)
    {
        C[i][0] = C[i][i] = 1;
        fact[i] = (fact[i - 1] * i) % mod;
        for (int j = 1; j < i;j ++)
        {
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
        }
    }

        // caseT
        solve();

    return 0;
}

标签:Binary,Search,int,mid,les,ans,size,mod
From: https://www.cnblogs.com/cfddfc/p/17290875.html

相关文章

  • [LeetCode] 1339. Maximum Product of Splitted Binary Tree 分裂二叉树的最大乘积
    Giventhe root ofabinarytree,splitthebinarytreeintotwosubtreesbyremovingoneedgesuchthattheproductofthesumsofthesubtreesismaximized.Return themaximumproductofthesumsofthetwosubtrees.Sincetheanswermaybetoolarge,re......
  • 分布式搜索引擎Elasticsearch的架构分析
    一、写在前面 ES(Elasticsearch下文统一称为ES)越来越多的企业在业务场景是使用ES存储自己的非结构化数据,例如电商业务实现商品站内搜索,数据指标分析,日志分析等,ES作为传统关系型数据库的补充,提供了关系型数据库不具备的一些能力。ES最先进入大众视野的是其能够实现全文搜索的能力,也......
  • ElasticSearch常用api文档
    搜索引擎实现实现步骤搜集例如google、baidu都是根据爬虫爬取网页数据分析根据爬取的数据分词解析,建立临时索引等索引通过分析阶段产生的临时索引构建倒排索引,用于查询查询响应用户请求,根据倒排索引获取相关网页信息,计算权重等倒排索引正排索引:文档中包含了哪......
  • ElasticSearch 7.x (一 ~ 二)
    ElasticSearch7.x一、ElasticSearch概述1.1ElasticSearch是什么Elasticsearch是一个分布式、RESTful风格的  搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为ElasticStack的核心,Elasticsearch会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析......
  • SearchInRotatedSortedArray
    packageBisectionMethod;/***33.搜索旋转排序数组*在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,*使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。*例如,[0,1,2,4,5......
  • SearchRange
    packageBisectionMethod;/***34.在排序数组中查找元素的第一个和最后一个位置*给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。*如果数组中不存在目标值target,返回[-1,-1]。*你必须设计并实......
  • SearchInsert
    packageBisectionMethod;/***35.搜索插入位置*给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。*请必须使用时间复杂度为O(logn)的算法。***/publicclassSearchInsert{publi......
  • ES005-Elasticsearch核心概念
    1、cluster***1.1代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个......
  • ES002-Elasticsearch环境安装
    1、Elasticsearch安装java版本要求:最低1.7下载地址:   https://www.elastic.co/downloads/past-releases/1-4-4启动   cd/usr/local/elasticsearch-1.4.4   ./bin/elasticsearch   bin/elasticsearch-d(后台运行)2、ES安装......
  • laravel8 elasticsearch 配置搭建使用
     laravel8框架 扩展elasticsearch  首先 elasticsearch 的版本号 需要和 扩展的版本号对应composerrequireelasticsearch/elasticsearch 然后是配置到common 调用文件<?phpnamespaceApp\Es;useElasticsearch\ClientBuilder;classMyEs{//......