首页 > 其他分享 >Yuno loves sqrt technology III

Yuno loves sqrt technology III

时间:2024-08-18 11:53:52浏览次数:9  
标签:int III void 个块 sqrt read using technology top

链接 : Yuno loves sqrt technology III

先考虑一道分块板子

[Violet] 蒲公英

在这道题中,将值离散化后,用了两个重要的数组

  1. \(p_{i,j}\) : 表示第\(i\)个块到第\(j\)个块的最小的众数
  2. \(s_{i,j}\) : 表示前\(i\)个块中\(j\)出现的次数

发现\(s\)的空间是\(O(n\sqrt{n})\)的

\(but\),\(\huge{n\le 5\times 10^5}\)

所以肯定不能有s数组。

沿用上面的思想,用一个\(s\)数组记录第\(i\)个块到第\(j\)个块中众数的出现次数。

这个东西暴力求就可以,时间复杂度为\(O(n\sqrt{n})\),这样就把整块的贡献算出来了。

然后考虑对散块的处理。

对于散块中的数,只需要判断这个值出现次数可否达到ans+1。

可以对于每一个值,开一个vector \(p\)记录这个值出现的位置。

记当前枚举到的值所在的位置在它所在的vector中的下标为\(p\)

对于左侧散块,如果\(p+ans\le r\) ,那么ans++

对于右侧散块,如果\(p-ans \ge l\) , 那么ans++;

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
namespace IO{
    char buf[1<<20],*p1,*p2;
    #define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
    #define pc putchar_unlocked
    template<typename T>
    inline void read(T &x){
        x = 0;bool f = false;char s = gc();
        for(;s < '0'||'9' < s;s = gc()) f|=(s=='-');
        for(;'0' <= s&&s <= '9';s = gc())
            x = (x<<1) + (x<<3) + (s^48);
        x = f?-x:x;
    }
    template<class T,class... Args>
    inline void read(T &x,Args& ...args){read(x);read(args...);}
    template<typename T>
    inline void write(T x){
        static char s[20],top;
        top = 0;
        if(x < 0) pc('-'),x = -x;
        do{s[++top] = x%10 + '0';}while(x/=10);
        while(top) pc(s[top--]);
    }
}using namespace IO;
const int N = 5e5 + 10,M = 720;
int n,m,a[N],pos[N],len,L[M],R[M];
int tot[N],w[N],mx[M][M];
vector<int> P[N];
inline void init(){
    read(n,m);
    for(int i = 1;i <= n; ++i) read(a[i]);
    len = sqrt(n);
    for(int i = 1;i <= len; ++i) L[i] = R[i - 1] + 1,R[i] = i*len;
    if(R[len] < n) len++,L[len] = R[len - 1] + 1,R[len] = n;
    vector<int> num;
    for(int i = 1;i <= n; ++i) num.emplace_back(a[i]);
    sort(num.begin(),num.end());
    num.erase(unique(num.begin(),num.end()),num.end());
    for(int i = 1;i <= n; ++i){
        a[i] = lower_bound(num.begin(),num.end(),a[i]) - num.begin() + 1;
        P[a[i]].emplace_back(i);
        w[i] = P[a[i]].size() - 1;
    }
    int V = num.size();
    for(int i = 1;i <= len; ++i){
        for(int j = 1;j <= V; ++j) tot[j] = 0;
        for(int j = L[i];j <= R[i]; ++j) pos[j] = i;
        for(int j = i;j <= len; ++j){
            int &res = mx[i][j];
            res = mx[i][j-1];
            for(int k = L[j];k <= R[j]; ++k)
                res = max(res,++tot[a[k]]);
        }
    }
    for(int i = 1;i <= V; ++i) tot[i] = 0;
}
inline int query(int left,int right){
    int p = pos[left],q = pos[right],res = 0;
    if(p == q){
        for(int i = left;i <= right; ++i)
            res = max(res,++tot[a[i]]);
        for(int i = left;i <= right; ++i) tot[a[i]] = 0;
        return res;
    }
    res = mx[p+1][q-1];
    for(int i = left;i <= R[p]; ++i){
        int it = w[i];
        while(it + res < P[a[i]].size() && P[a[i]][it + res] <= right) ++res;
    }
    for(int i = L[q];i <= right; ++i){
        int it = w[i];
        while(it - res >= 0 && P[a[i]][it - res] >= left) ++res;
    }
    return res;
}
inline void solve(){
    init();
    int lastans = 0;
    for(int i = 1,l,r;i <= m; ++i){
        read(l,r);
        l ^= lastans,r ^= lastans;
        write(lastans = query(l,r));
        pc('\n');
    }
}
signed main(){
    solve(); 
}

然后就可以拿这篇代码改一改水掉大爷的字符串题

标签:int,III,void,个块,sqrt,read,using,technology,top
From: https://www.cnblogs.com/hzoi-Cu/p/18365448

相关文章

  • 在相思树下 III 题解
    前言题目链接:洛谷。赛时脑子坨成一坨了,估计是T1的影响,写一篇题解来理清思路。题意简述给你一个长为\(n\)的序列\(a_{1\dotsn}\),你需要对它进行两种操作共\(n-1\)次。对一个长度为\(l\)的序列\(b_{1\dotsl}\)进行一次操作将会把序列变为一个长为\(l-1\)的序列......
  • 题解:P10781 【MX-J1-T1】『FLA - III』Spectral
    P10781【MX-J1-T1】『FLA-III』Spectral题解(非正解,正解应该是数学题。)这道题很简单,分析题意就可以得出核心代码:for(inti=1;i<=n;i++){ans=k+ans/i;}那么恭喜你获得$40$pts。为什么呢?因为题目需要的是最高温度,而烧碳获得的温度可能小于烧炭时减低的温度。简单说......
  • UCOSIII信号量详解
    目录​编辑前言一、信号量的类型二、信号量的使用方法2.1创建信号量2.2请求信号量:2.3释放信号量:三、信号量的作用四、注意事项五、信号量的API函数六、代码实现6.1创建信号量6.2使用信号量前言UCOSIII信号量是UCOSIII操作系统中用于任务同步和互斥访问共......
  • leetcode递归(LCR 141. 训练计划 III)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。递归大部分题解可以使用迭代方式求解,使用递归是为了熟悉递归的解题思路。描述给定一个头节点为 head 的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录......
  • EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2) 补题记录(A~D1,E)
    A容易发现答案为\(\min(n,k)\min(m,k)\)。#include<bits/stdc++.h>#defineintlonglong#definepbpush_backusingnamespacestd;constintN=1000100;inta[N];signedmain(){intT;cin>>T;while(T--){intn,m,k;cin>>n&g......
  • LeetCode 216. 组合总和 III 回溯写法详解
    216.组合总和III216.组合总和III题目来源题目分析题目难度题目标签题目限制解题思路核心算法步骤代码实现代码解读性能分析测试用例扩展讨论优化写法其他实现总结216.组合总和III题目来源216.组合总和III题目分析题目要求找出所有相加之和为n的k......
  • 嵌入式实时操作系统(RT-Thread、FreeRTOS、UCOSIII)
    实时操作系统(RT-Thread、FreeRTOS、UCOSIII)文章目录`实时操作系统(RT-Thread、FreeRTOS、UCOSIII)``专有名词概念``1、什么是嵌入式``嵌入式系统的特点``2、什么是实时``3、什么是操作系统``操作系统主要功能和特性``常见的操作系统类型包括``4、嵌入式实时操作系统``关......
  • 算法力扣刷题记录 六十四【216.组合总和III】
    前言回溯第二篇。回顾:上一篇学了回溯的基础知识和模版;组合练习题一应用了一次模版。本文继续组合问题练习:记录六十四【216.组合总和III】。一、题目阅读找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效......
  • TypeError:ufunc 的循环不支持 dict 类型的参数 0,该类型没有可调用的 sqrt 方法
    我遇到了一个错误:psi_out_norm.append(np.sqrt(sorted_probs))TypeError:loopofufuncdoesnotsupportargument0oftypedictwhichhasnocallablesqrtmethod不知道如何解决此错误。下面是我正在处理的代码:num_qubits=2sorted_probs={'00':0.182613164......
  • *算法训练(leetcode)第三十五天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 I
    刷题记录*121.买卖股票的最佳时机贪心*动态规划122.买卖股票的最佳时机II贪心*动态规划*123.买卖股票的最佳时机III*121.买卖股票的最佳时机leetcode题目地址贪心找左侧最小值、右侧最大值(与最小值求差最大),求差即为最大利润。时间复杂度:......