当前位置: 首页 > article >正文

二分模板题

题目传送门

主要思路:

  • 暴力会tle n的3次方了
  • 然后 二分可以找中间然后去二分枚举两边
    最后结果 ans+=a小于它的数*c大于它的数 注意要判断是否符合条件 即如果a的小于它的数还大于它就不成立 或者c的数小于它也不成立
  • 结果 要注意转long long ans+=(long long)tp1*tp2; int->longlong
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100009],b[100009],c[100009];
//找到第一个大于该数字的数
int get_max(int *num,int x){
   int l=1;int r=n; int mid=0;
   while(l<r){
       mid=(l+r)/2;
       if(num[mid]>x) r=mid;
       else l=mid+1;
   }
   return l;
}
// 得到第一个小于它的数
int get_min(int *num,int x)
{
   int l=1;
   int r=n; 
   int mid=0;
   while(l<r){
       mid=(l+r+1)/2;
       if(num[mid]<x) l=mid;
       else r=mid-1;
   }
   return l;
}
int main(){
       cin>>n;
       for(int i=1;i<=n;i++){
           cin>>a[i];
       }
       for(int i=1;i<=n;i++){
           cin>>b[i];
       }
       for(int i=1;i<=n;i++){
           cin>>c[i];
       }
       sort(a+1,a+1+n);
       sort(c+1,c+1+n);
     long long ans=0;
       for(int i=1;i<=n;i++){
           // cout<<get_max(c,b[i])<<endl;
           // cout<<get_min(a,b[i])<<endl;
           // if(b[i]<=a[1]||b[i]>=c[n]) continue;
           int tp1=n-get_max(c,b[i])+1;
           int tp2=get_min(a,b[i]);
           if(c[get_max(c,b[i])]<=b[i]||a[get_min(a,b[i])]>=b[i]) continue;
           ans+=(long long)tp1*tp2;
       }
       cout<<ans<<endl;
       return 0;
}
// #include <iostream>
// #include <cstdio>
// #include <algorithm>
// using namespace std;

// typedef long long LL;
// const int N = 1e5+10;
// int num[3][N];

// int main() {
//     int n;
//     scanf("%d", &n);
//     for(int i = 0; i < 3; ++i) 
//         for(int j = 1; j <= n; ++j) 
//             scanf("%d", &num[i][j]);
//     // for(int i = 0; i < 3; ++i)
//         sort(num[0]+1, num[0]+n+1);
//         sort(num[2]+1, num[2]+n+1);
//     LL ans = 0;
//     //枚举B,寻找A满足的个数以及C满足的个数相乘
//     for(int i = 1; i <= n; ++i) {
//         int key = num[1][i];
//         //A中二分查找第一个小于key的数的下标
//         int pos1 = lower_bound(num[0]+1, num[0]+n+1, key)-num[0]-1;
//         //C中二分查找第一个大于key的数的下标
//         int pos2 = upper_bound(num[2]+1, num[2]+n+1, key)-num[2];
//         if(pos1 >= 1 && pos2 <= n) {
//             ans += (LL)pos1*(n-pos2+1);
//         }
//     }
//     cout<<ans<<endl;
//     return 0;
// }



http://www.kler.cn/a/429155.html

相关文章:

  • Redis可视化工具--RedisDesktopManager的安装
  • 本地仓库管理之当前分支内的操作
  • 【数据库初阶】MySQL中表的约束(上)
  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • Web渗透测试之伪协议与SSRF服务器请求伪装结合? 能产生更多的效果
  • 【c++继承篇】--继承之道:在C++的世界中编织血脉与传承
  • 在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问
  • JMeter Java请求开发方法
  • Ubuntu 22.04加Windows AD域
  • 【Ubuntu】清理、压缩VirtualBox磁盘空间大小
  • 探索 Webpack:前端工程化的核心驱动力与应用场景全解析
  • 高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?
  • 【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
  • C++运算符重载的使用——实现日期类
  • Leaflet Marker的突出显示,以及聚合
  • 医院专家抽取系统——未来之窗行业应用跨平台架构
  • Android开发-----Could not install Gradle distribution from- gradle
  • 在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208
  • 泷羽sec学习打卡-brupsuite4
  • 高级数据结构-树状数组
  • Halcon_数据类型_ROI_仿射变换_投影变换
  • 设计模式 在SCM系统的应用场景介绍
  • ISO45001职业健康安全管理体系认证流程
  • springboot整合lua脚本在Redis实现商品库存扣减
  • 关系型数据库(RDBMS)和非关系型数据库(NoSQL)
  • 使用 Trace 实现 onnx 的导出 - 学习记录