首页 > 其他分享 >F. MEX Queries

F. MEX Queries

时间:2022-11-03 17:34:44浏览次数:78  
标签:int ll all0 tr all1 Queries cov1 MEX

F. MEX Queries

分析

不得不说,题目不算难。但是非常考验选手的基础。我会把我出的问题放出到最后,给大家一些错误提示。

我们使用动态开点维护权值线段树。

我们先来看四个操作。

1.把 [l,r] 中在集合中没有出现过的数添加到集合中。

直接区间覆盖,将区间[l,r]区间覆盖为1。加一个懒标记cov1

2.把 [l,r] 中在集合中出现过的数删除。

直接区间覆盖,将区间[l,r]区间覆盖0。加一个懒标记cov0

3.把 [l,r] 中在集合中没有出现过的数添加到集合中,并且将出现过的数删除。

直接区间取反。加一个懒标记tag

4.询问集合中最小的没有出现过的正整数

我们添加两个标记,all0all1,来统计区间是否全部都为01

我们关于树中结点的设计方面就是

struct Node
{
    bool tag,all1,all0,cov0,cov1;
}tr[N*200];
int ls[N*200],rs[N*200];

然后就是常规的pushdownpushup什么的了。这点不说了。

一些细节

我直接给大家展示我结构体的一步步变化。

除了最后答案中可以乘200,下面列举的其他的都不可以乘200,但不乘又会RE,我会一步步讲变化

struct Node
{
    int l,r;
    bool tag,all1,all0;
    int cov;
}tr[N*200];

最开始是这样写的,我用一个cov表示覆盖的是0还是1。不出所料的不行。

我就说省一下空间。

改成了这样。

struct Node
{
    int l,r;
    bool tag,all1,all0,cov1,cov0;
}tr[N*200];

不出所料还是寄了,这个原因是因为结构体有对齐操作。

也就是说我以为我的bool值只占了一个bit,其实占了好多个。

因此就把int类型的l,r直接提出来了。

struct Node
{
    bool tag,all1,all0,cov0,cov1;
}tr[N*200];
int ls[N*200],rs[N*200];

就过啦。

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
const ll inf = 2e18;

struct Node
{
    bool tag,all1,all0,cov0,cov1;
}tr[N*200];
int ls[N*200],rs[N*200];
int n,idx,root,m;

int init(int u)
{
    ls[u] = rs[u] = 0;
    tr[u].tag = tr[u].all1 = tr[u].cov0 = tr[u].cov1 = 0;
    tr[u].all0 = 1;
    return u;
}

void pushup(int u)
{
    tr[u].all1 = tr[ls[u]].all1 & tr[rs[u]].all1;
    tr[u].all0 = tr[ls[u]].all0 & tr[rs[u]].all0;
}

void changecov(Node &u,int k,ll l,ll r)
{
    u.tag = 0;
    if(k) u.cov1 = 1,u.cov0 = 0;
    else u.cov0 = 1,u.cov1 = 0;
    if(k) u.all1 = 1,u.all0 = 0;
    else u.all0 = 1,u.all1 = 0;
}

void changetag(Node &u,ll l,ll r)
{
    if(u.all0) u.all1 = 1,u.all0 = 0;
    else if(u.all1) u.all0 = 1,u.all1 = 0;
    u.tag ^= 1;
}

void pushdown(int u,ll l,ll r)
{
    if(!ls[u]) ls[u] = init(++idx);
    if(!rs[u]) rs[u] = init(++idx);
    auto &root = tr[u],&left = tr[ls[u]],&right = tr[rs[u]];
    ll mid = l + r >> 1ll;
    if(root.cov0||root.cov1)
    {
        int k = 0;if(root.cov1) k = 1;
        changecov(left,k,l,mid);
        changecov(right,k,mid+1,r);
        root.cov0 = root.cov1 = 0;
    }
    if(root.tag)
    {
        changetag(left,l,mid);
        changetag(right,mid+1,r);
        root.tag = 0;
    }
}

void modify(int &u, ll l, ll r, ll L, ll R,int ty,int k) 
{
    if(R<l||L>r) return ;
    if(!u) u = init(++idx);
    if(L <= l && R >= r) {
        if(ty==1) 
        {
            changecov(tr[u],k,l,r);
            if(k) tr[u].cov1 = 1,tr[u].cov0 = 0;
            else tr[u].cov0 = 1,tr[u].cov1 = 0;
        }
        else changetag(tr[u],l,r);
        return ;
    }
    pushdown(u,l,r);
    ll mid = l + r >> 1ll;
    modify(ls[u], l, mid, L, R, ty, k);modify(rs[u], mid + 1, r, L, R, ty, k);
    pushup(u);
}

ll query(int u,ll l,ll r)
{
    if(!u) return l;
    if(l==r) return l;
    pushdown(u,l,r);
    ll mid = l + r >> 1ll;
    if(!tr[ls[u]].all1) return query(ls[u],l,mid);
    return query(rs[u],mid+1,r);
}

int main()
{
    ios;
    int n;cin>>n;
    while(n--)
    {
        ll op,l,r;cin>>op>>l>>r;
        if(op==1) modify(root,1,inf,l,r,1,1);
        else if(op==2) modify(root,1,inf,l,r,1,0);
        else modify(root,1,inf,l,r,2,0);
        cout<<query(root,1,inf)<<"\n";
    }   
    return 0;
}

标签:int,ll,all0,tr,all1,Queries,cov1,MEX
From: https://www.cnblogs.com/aitejiu/p/16855239.html

相关文章

  • sap系统登录时报错,提示hostnameXXXunknown
    用了网上的方法,解决了原因不知道为什么,就是把那个路由器的那一串填上之后,那个大写的W会自动变成小写的w,然后就报错了,无论怎么改都不行,然后网上说去那个配置文件改:C:\User......
  • LeetCode 2458. Height of Binary Tree After Subtree Removal Queries
    原题链接在这里:https://leetcode.com/problems/height-of-binary-tree-after-subtree-removal-queries/题目:Youaregiventhe root ofa binarytree with n node......
  • F. MEX vs MED
    F.MEXvsMEDYouaregivenapermutation$p_1,p_2,\dots,p_n$oflength$n$ofnumbers$0,\dots,n−1$.Countthenumberofsubsegments$1\leql\leqr\le......
  • MEX 相关
    基础理解静态求mex:O(n)。动态加点/删点求mex:我们维护一个set表示没有出现过的集合。那么O(n\logn)。CF1732D2https://zhuanlan.zhihu.com/p/576620849......
  • MyBatisSystemException 【exception】
    org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.type.TypeException:Couldnotsetparametersformapping:ParameterMapping{prop......
  • ABC246Ex 01? Queries 题解
    ABC246Ex01?QueriesSolution目录ABC246Ex01?QueriesSolution更好的阅读体验戳此进入浅谈DDP与广义矩阵乘法(戳此进入)引入例题#1广义矩阵乘法DDP例题#0例题#0.5......
  • Entity Framework教程-LINQ查询(LINQ for Queries and Projections)
    更新记录转载请注明出处:2022年10月17日发布。2022年10月10日从笔记迁移到博客。懒加载与预加载默认情况下,EF是懒加载的,能只取一行数据就只取一行如果需要预先加......
  • Prefix Function Queries
    传送门感觉字符串只会hash了。这里提几点易错点:①字符串能不用string就不用。反正这道题因为string的size(不能正常清空)和读入Wa飞了②hash都写双模数。......
  • Codeforces1695 D1.+D2 Tree Queries
    题意给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点。S包括k个询问节点。询问返回的值也为k个值,每个值为X点到每个询问节点的最短路......
  • Add and Mex(时间复杂度,枚举)
    题意给定一个包含\(N\)个元素的序列\(A=(A_1,\dots,A_N)\)。下述操作执行\(M\)次:对于每个\(i,(1\leqi\leqN)\),将\(A_i\)加上\(i\)。然后求序列的mex。题目链接......