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

莫队算法/二分查找 FZU 2072 Count

 

题目传送门

题意:问区间内x的出现的次数
分析:莫队算法:用一个cnt记录x的次数就可以了。还有二分查找的方法

 

代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
struct Data
{
    int b, l, r, x;
    int id;
}data[MAXN];
int a[MAXN];
int cnt[MAXN];
int ans[MAXN];
int n, q;

bool cmp(Data x, Data y)
{
    if (x.b == y.b)    return x.r < y.r;
    return x.b < y.b;
}

void Modui(void)
{
    memset (cnt, 0, sizeof (cnt));

    int l = 1, r = 0;
    for (int i=1; i<=q; ++i)
    {
        while (data[i].l < l)    cnt[a[--l]]++;
        while (data[i].l > l)    cnt[a[l]]--, l++;
        while (data[i].r > r)    cnt[a[++r]]++;
        while (data[i].r < r)    cnt[a[r]]--, r--;

        ans[data[i].id] = cnt[data[i].x];
    }

    for (int i=1; i<=q; ++i)
    {
        printf ("%d\n", ans[i]);
    }
}

int main(void)        //FZU 2072 Count
{
    while (scanf ("%d%d", &n, &q) == 2)
    {
        int block = (int) sqrt (n * 1.0);
        for (int i=1; i<=n; ++i)    scanf ("%d", &a[i]);
        for     (int i=1; i<=q; ++i)
        {
            scanf ("%d%d%d", &data[i].l, &data[i].r, &data[i].x);
            data[i].b = data[i].l / block;    data[i].id = i;
        }

        sort (data+1, data+1+q, cmp);

        Modui ();
    }

    return 0;
}

 

代码(二分查找):

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;

const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int a[MAXN];
int n, q;
vector<int> cnt[MAXN];

int cal(int x, int r)
{
    if (!cnt[x].size ())    return 0;
    int pos = upper_bound (cnt[x].begin (), cnt[x].end (), r) - cnt[x].begin () - 1;
    return pos;
}

int main(void)        //FZU 2072 Count
{
//    freopen ("A.in", "r", stdin);

    while (scanf ("%d%d", &n, &q) == 2)
    {
        for (int i=1; i<=n; ++i)
        {
            scanf ("%d", &a[i]);
        }
        for (int i=1; i<=n; ++i)    cnt[a[i]].clear ();
        for (int i=1; i<=n; ++i)    cnt[a[i]].push_back (i);

        for (int i=1; i<=q; ++i)
        {
            int l, r, x;    scanf ("%d%d%d", &l, &r, &x);
            printf ("%d\n", cal (x, r) - cal (x, l - 1));
        }
    }

    return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4650189.html

相关文章:

  • python 搭建环境
  • 在Xcode6.4中使用OpenCV
  • @property括号内属性讲解
  • PHP自毁程序
  • 使用javascript实现html文字不可选
  • 大型数据库 实用解决方案
  • [家里蹲大学数学杂志]第409期与正弦对数有关的一个积分不等式
  • 初学者应学会如何加快seo
  • 网页的重绘和回流
  • Skype for Business Server 2015系列(三)部署前端服务器-2
  • 3.2.用户空间客体管理器
  • Nginx的流媒体插件nginx-rtmp-module
  • iOS开发UITableView基本使用方法总结
  • centos6.5下postgres-XC集群安装与配置(有standby案例)
  • 最近用到Bootstrap Multiselect来详细了解一下
  • 深入了解以太坊
  • Android组件 - 收藏集 - 掘金
  • Centos6.8 使用rpm安装mysql5.7
  • Cumulo 的 ClojureScript 模块已经成型
  • docker python 配置
  • Javascript设计模式学习之Observer(观察者)模式
  • Java多线程(4):使用线程池执行定时任务
  • JSONP原理
  • JS题目及答案整理
  • laravel5.5 视图共享数据
  • Linux各目录及每个目录的详细介绍
  • Netty源码解析1-Buffer
  • node-glob通配符
  • Python学习之路13-记分
  • uva 10370 Above Average
  • 百度小程序遇到的问题
  • 排序算法之--选择排序
  • 小程序开发之路(一)
  • gunicorn工作原理
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ![CDATA[ ]] 是什么东东
  • #{} 和 ${}区别
  • #define、const、typedef的差别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)windows配置JDK环境
  • (六)软件测试分工
  • (南京观海微电子)——COF介绍
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十一)c52学习之旅-动态数码管
  • (转)Scala的“=”符号简介
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .a文件和.so文件
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Family_物联网
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net FrameWork总结
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?