首页 > 其他分享 >Luogu P3674 小清新人渣的本愿 题解

Luogu P3674 小清新人渣的本愿 题解

时间:2022-09-18 12:11:39浏览次数:97  
标签:int 题解 belong 人渣 MAXN bitset Luogu include

P3674 小清新人渣的本愿

lxl大爷的题,%%%%%
以及CSP rp++!!!

前言:

其实是这题的名字吸引了我,毕竟人渣的本愿里的角色我觉得多多少少都沾点,哪来的小清新啊《人渣的本愿》,又名《只要是【】子,睡过了也没问题是吗》

解析:

一个 bitset 的小技巧(亦或是一种套路?)。

区间询问,不带修改,可以离线,并且是毒瘤lxl的题,考虑莫队。

在常规的莫队维护桶之外,用 bitset 来维护区间中的数用没有出现过,考虑查询时维护答案。

对于减法操作,若当前序列中存在

\[a - b = x \]

可移项得:

\[a = b + x \]

设一个 bitset 为 \(s\),则有 s[b] = trues[b + x] = true,则相当于 \(s \operatorname{\And}(s << x)\) 中存在一个 \(1\)。

对于加法操作,若当前序列中存在

\[a + b = x \]

我们设 \(b^{'} = N - b\),其中 \(N\) 为一个常数,有:

\[a - b^{'} = a + b - N = x - N \]

然后我们移项可得

\[a + (N - x) = N - b \]

之后,仿照我们减法操作的处理形式:s[a] = true,同时 s[a + (N - x)] = true,即 \(s \And (s << (N - x))\) 存在一个 \(1\)。这时为了防止加减法操作相互影响,我们再开一个 bitset 维护下 \(N - b\) 出现过没有即可。

因为 bitset 不能维护负数(没有负下标),所以 \(N\) 要是一个极大值,让 \(N\) 顶着数据范围即可。

对于乘法操作,我们直接枚举,只有 \(\sqrt{n}\) 个约数,所以单次查询的复杂度是 \(O(\sqrt{n})\) 的,由于 bitset 自带 \(\frac{1}{w}\) 的常数,所以总复杂度是 \(O(\frac{nm}{w})\) 的,可以通过本题。

Code

#include<cmath>
#include<cstdio>
#include<bitset>
#include<algorithm>

using namespace std;

const int MAXN = 1e5 + 10;
int n, m, siz, lim;
int num[MAXN];
int belong[MAXN], temp[MAXN], ans[MAXN];
bitset<MAXN> add, cut;

struct Question{
    int opt, l, r, x, id;
}q[MAXN];

bool cmp(const Question &a, const Question &b){
    if(belong[a.l] != belong[b.l]) return belong[a.l] < belong[b.l];
    if(belong[a.l] & 1) return a.r < b.r;
    return a.r > b.r;
}

inline int read(){
    int x = 0, f = 1;
    char c = getchar();

    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
	
    return x * f;
}

void Add(int x){
    ++temp[x];
    if(temp[x] == 1){
        add[x] = 1;
        cut[lim - x] = 1;
    }	
}

void Del(int x){
    --temp[x];
    if(temp[x] == 0){
        add[x] = 0;
        cut[lim - x] = 0;
    }
}

void Modify(int l, int r){
    for(register int i = 1; i <= m; i++){
        while(l < q[i].l) Del(num[l++]);
        while(l > q[i].l) Add(num[--l]);
        while(r < q[i].r) Add(num[++r]);
        while(r > q[i].r) Del(num[r--]);
		
        int opt = q[i].opt, x = q[i].x;
        if(opt == 1) ans[q[i].id] = (add & (add << x)).any();
        else if(opt == 2) ans[q[i].id] = (cut & (add << (lim - x))).any();
        else{
            for(register int d = 1; d * d <= x; d++){
                if(x % d != 0) continue;
                if(add[d] && add[x / d]){
                    ans[q[i].id] = 1;
                    break;
                 }
            }
        }
    }
}

void init(){
    siz = sqrt(n);
    for(register int i = 1; i <= siz; i++){
        int st = n / siz * (i - 1) + 1;
        int ed = n / siz * i;
		
        for(register int j = st; j <= ed; j++)
            belong[j] = i;
    }
}

int main(){
    n = read(), m = read();
    for(register int i = 1; i <= n; i++)
        num[i] = read();
    lim = MAXN;
    
    init();
        
    for(register int i = 1; i <= m; i++){
        q[i].opt = read();
        q[i].l = read(), q[i].r = read(), q[i].x = read();
        q[i].id = i;
    }	
    sort(q + 1, q + 1 + m, cmp);
	
    Modify(1, 0);
	
    for(register int i = 1; i <= m; i++){
        if(ans[i]) puts("hana");
        else puts("bi");
    }
	
    return 0;
}

标签:int,题解,belong,人渣,MAXN,bitset,Luogu,include
From: https://www.cnblogs.com/TSTYFST/p/16704466.html

相关文章

  • 牛客题解 约瑟夫环
    链接:https://ac.nowcoder.com/acm/problem/22227来源:牛客网题解作者岛田小雅正统的约瑟夫环我不会,看了一眼范围直接开始乱搞了。我选择的方法是模拟,用递归函数实现(虽......
  • 2022上半年软件设计师真题解析
    选择题 ......
  • AtCoder Beginner Contest 269 (A-F)题解
    A-AnywayTakahashi这里我还是关了ll的C开了忘了关害的F多了一发罚时#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+10;constintM=9982443......
  • 题解【CF1702G2 Passable Paths (hard version)】
    题目传送门。考虑建立虚树然后再上面搞树形DP。于是这道题就变成分讨题。设\(f_i\)表示\(i\)子树内的答案。若\(f_i=1\),表示\(i\)子树内的特殊点可以被一条链覆......
  • CF1718D 题解
    设\(k\)为\(a\)中的空位数量。首先咱们转化这个“相似”的条件,发现它其实是说,笛卡尔树的结构相同。那么我们把p建笛卡尔树然后把a的数往上填。如果此时有上面小于下......
  • Android安卓浏览器视频层级永远顶层问题解决方案
    在安卓手机上,使用video播放视频有个问题,video控件层级会永远在顶层,不利于视频互动H5开发,而IOS手机上不会有此问题。腾讯给出了如下解决方案:<videosrc="http://xxx.mp4......
  • AtCoder Beginner Contest 267 题解
    只会\(A\simG\)主观难度:\(A<B<C<E<D<F<G<Ex\)A-Saturday分别对周一到周五判断即可。#include<bits/stdc++.h>usingnamespacestd;inlineintread(){int......
  • CF1305F Kuroni and the Punishment 题解
    一道比较简单的题,我居然调了这么久。思路看一眼这个题,发现好像没有什么思路。考虑来用一些巧妙的手法,比如随机化。首先证明一个结论,至少有一半的数只会被操作一次或者......
  • CF1715E Long Way Home 题解
    CF1715E题解题意一个带边权无向图,可以沿着边走,需要边权的花费或从任意点\(u\)飞到\(v\),需要\((u-v)^2\)的花费。求从点\(1\)到所有\(i\)的最少花费。最多飞\(......
  • CF1515E Phoenix and Computers 题解
    感觉这样的\(\text{dp}\)题还比较多,思路都比较的神奇。个人感觉比较像区间\(\text{dp}\)的一类变种。但又和区间\(\text{dp}\)的维护方式极不一样。对于此类\(\t......