首页 > 其他分享 >海亮02/19杂题

海亮02/19杂题

时间:2024-02-19 13:55:45浏览次数:28  
标签:02 ch 海亮 times gethash forall 杂题 check

海亮02/19杂题

个人题单

T5

link

题意

设一个数组 \(a_{1,2,\dots,l}\) 是平衡的,当且仅当 \(\exists k\in[1,\frac{l - 1}{2}],\forall i\in[1,l - 2\times k],a_{i} + a_{i + 2\times k} = 2\times a_{i+k}\)。

现在给你一个数组 \(a\),你需要对 \(\forall l\in[1,n]\) 求出子序列 \(a_{1,2,\dots,l}\) 是不是平衡的。

\(n\le 2\times 10^6\)

题解

先想想最暴力的做法。

枚举 \(l,k\),然后对于区间 \([1,l]\),用 \(O(n)\) 的时间进行 \(check\)。总时间复杂度是 \(O(n^3)\) 的。

然后有一个神奇的 \(check\)。

你搞一下字符串 \(hash\),然后对于刚刚的 \(check\),你就可以直接在 \(hash\) 上进行加减。

然后你就可以 \(O(1)\) 的 \(check\) 了。(具体实现看代码)

但是还不够,怎么办?

我们发现,对于一个 \(k\),如果 \(l\) 不满足条件,那么 \(l+1\) 也一定不满足条件,于是就可以 \(O(n\log n)\) 的二分了,如果常数小的话可以直接过了。

但是还不够怎么办?

我们发现这里的 \(k\) 是 \(\exist k\),不是 \(\forall k\),于是可以维护一个右端点 \(l\)(不应该设 \(r\) 吗?不管了就这样吧。),不需要将这个指针向左移动。

然后就变成 \(O(n)\) 的了。

代码

#include<bits/stdc++.h>
using namespace std;
bool stmemory;
namespace Call_me_Eric{
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
int readbase62(){
    int x = 0;char ch = getchar();
    while(!isdigit(ch) && !islower(ch) && !isupper(ch))ch = getchar();
    while(isdigit(ch) || islower(ch) || isupper(ch)){
        x = x * 62;
        if(isupper(ch)){x += ch - 'A' + 36;}
        if(islower(ch)){x += ch - 'a' + 10;}
        if(isdigit(ch)){x += ch - '0' +  0;}
        ch = getchar();
    }
    return x;
}
const int maxn = 2e6 + 10;
typedef unsigned long long ull;
int n, a[maxn];
ull hsh[2][maxn], pw[2][maxn], base[2] = {1145141ull,1919810ull};
ull gethash(int l,int r,int opt){return (hsh[opt][r] - hsh[opt][l - 1] * pw[opt][r - l + 1]);}
bool check(int l,int k){
    if(2 * k + 1 > l)return 0;
    return gethash(1,l - 2 * k,0) + gethash(2 * k + 1,l,0) == 2ull * gethash(k + 1,l - k,0)
        && gethash(1,l - 2 * k,1) + gethash(2 * k + 1,l,1) == 2ull * gethash(k + 1,l - k,1);
}
bool ans[maxn];
void main(){
    n = read();for(int i = 1;i <= n;i++)a[i] = readbase62();
    pw[0][0] = pw[1][0] = 1;
    for(int i = 1;i <= n;i++){
        pw[0][i] = pw[0][i - 1] * base[0];pw[1][i] = pw[1][i - 1] * base[1];
        hsh[0][i] = hsh[0][i - 1] * base[0] + 1ull * a[i];
        hsh[1][i] = hsh[1][i - 1] * base[1] + 1ull * a[i];
    }
    int i = 1;
    for(int k = 1;k * 2 + 1 <= n;k++){
        i = max(i,2 * k + 1);
        while(i <= n && check(i,k)){ans[i++] = '1';}
    }
    for(int i = 1;i <= n;i++)putchar('0' + ans[i]);
    putchar('\n');
    return;
}
};
bool edmemory;
signed main(){
    auto stclock = clock();
    Call_me_Eric::main();
    auto edclock = clock();
    cerr << (&stmemory - &edmemory) / 1024.0 / 1024.0 << " Mib cost.\n";
    cerr << (edclock - stclock) * 1.0 / CLOCKS_PER_SEC << " Sec cost.\n";
    return 0;
}

标签:02,ch,海亮,times,gethash,forall,杂题,check
From: https://www.cnblogs.com/Call-me-Eric/p/18020933

相关文章

  • 2024/1/18
    查找某元素的下标功能:查找指定元素在列表的下标,如果找不到,报错ValueError语法:列表.index(元素)index就是列表对象(变量)内置的方法(函数)插入元素:语法:列表[inser(下标,元秦),在指定的下标位置,插入指定的元素 my_list=[1,2,3]my_list.insert(1,"itheima"print(my_list)#结果:[......
  • 2024/1/20
    while循环和for循环,都是循环语句,但细节不同:在循环控制上:while循环可以自定循环条件,并自行控制for循环不可以自定循环条件,只可以一个个从容器内取出数据在无限循环上:while循环可以通过条件控制做到无限循环for循环理论上不可以,因为被遍历的容器容量不是无限的在使用场景上:whi......
  • 2024/1/13
     注释的分类单行注释:以#开头,#右边的所有文字当作说明,而不是真正要执行的程序,起辅助说明作用#我是单行注释print("Helloworld")注意,#号和注释内容一般建议以一个空格隔开多行注释:以一对三个双引号引起来("""注释内容""")来解释说明一段代码的作用使用方法type()语句的使用......
  • 2021/1/14
    可以看出,for循环是将字符串的内容:依次取出所以,for循环也被称之为:遍历循环 同while循环不同,for循环是无法定义循环条件的只能从被处理的数据集中,依次取出内容进行处理所以,理论上讲,Python的for循环无法构建无限循环(被处理的数据集不可能无限大 range语句语法1:range(nu......
  • 2024/1/15
    1.什么是NoneNone是类型'NoneType’的字面量用于表示:空的、无意义的2.函数如何返回None不使用return语句即返回None主动returnNone3.使用场景函数返回值if判断变量定义 ......
  • 2024/1/16
    函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。我们可以给函数添加说明文档,辅助理解函数的作用语法如下:deffunc(x,y):"""函数说明:paramx:形参x的说明:paramy:形参y的说明:return :返回值的说明"""函数体return返回值......
  • 在 Visual Studio 2022 中创建一个类似于旧版本 Visual Studio 中的 Win32 Console Ap
    以下内容来自AI的回答,实测有效在VisualStudio2022中创建一个项目,其自动生成的源文件内容包含#include"stdafx.h"和使用_tmain作为入口点,意味着你需要创建一个基于Windows的传统控制台应用程序,这通常与旧版本的VisualStudio(如VisualStudio2005或更早)和使用预......
  • 布莱切利宣言 The Bletchley Declaration 2023年11月1日 学习ing
    ArtificialIntelligence(AI)presentsenormousglobalopportunities:ithasthepotentialtotransformandenhancehumanwellbeing,peaceandprosperity.Torealisethis,weaffirmthat,forthegoodofall, AI shouldbedesigned,developed,deployed,and......
  • ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年
    Promise.withResolvers使用Promise.withResolvers()关键的区别在于解决和拒绝函数现在与Promise本身处于同一作用域,而不是在执行器中被创建和一次性使用。这可能使得一些更高级的用例成为可能,例如在重复事件中重用它们,特别是在处理流和队列时。这通常也意味着相比在执行器内......
  • 2024/2/18
    先来强化一下强连通分量luoguP1407[国家集训队]稳定婚姻题意:给n对现在的夫妻和m对曾经相爱的人。如果有一对夫妻分开了,有没有可能这两个人和另外的几对夫妻组成新的组合。如果可能输出‘unsafe’,否则输出‘safe’思路:看完题之后我懵了,我看了一眼题解描述的题意才明白这......