zoukankan      html  css  js  c++  java
  • 【BZOJ4184】shallot 线性基

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184

    此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题。

    但是此题会删除元素,且允许离线。

    我最初的想法是开一个线段树,然后通过两个线性基的合并去更新答案。

    后来发现,一个元素出现的时间段其实是确定的。

    我们种一棵线段树,用来维护哪些元素在哪些时间段出现过。

    我们在线段树的每个节点上开一个vector,用来存储哪些元素在该节点所表示的时间段上出现过。

    最后统计答案一个dfs即可。

    第一次交上去我被卡常了,后来换了静态链表才过了。

     1 #include<bits/stdc++.h>
     2 #define M 500005
     3 using namespace std;
     4 int n,m,num[M]={0},q[M]={0}; 
     5 struct edge{int u,next;}e[M*20]={0}; int head[M*4]={0},use=0;
     6 void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;}
     7 void updata(int x,int ll,int rr,int l,int r,int k){
     8     if(l<=ll&&rr<=r){add(x,k);return;}
     9     int mid=(ll+rr)>>1;
    10     if(l<=mid) updata(x<<1,ll,mid,l,r,k);
    11     if(mid<r) updata(x<<1|1,mid+1,rr,l,r,k);
    12 }
    13 struct node{
    14     int a[31];
    15     node(){memset(a,0,sizeof(a));}
    16     void insert(int x){
    17         for(int i=30;~i;i--)
    18         if(x&(1<<i)){
    19             if(!a[i]) {a[i]=x; return;}
    20             else x^=a[i];
    21         }
    22     }
    23     int ans(){
    24         int ans=0;
    25         for(int i=30;~i;i--)
    26         ans=max(ans,a[i]^ans);
    27         return ans; 
    28     }
    29 };
    30 map<int,int> mp;
    31 void dfs(int x,int l,int r,node k){
    32     for(int i=head[x];i;i=e[i].next) k.insert(e[i].u);
    33     if(l==r){
    34         printf("%d
    ",k.ans());
    35         return;
    36     }
    37     int mid=(l+r)>>1;
    38     dfs(x<<1,l,mid,k); dfs(x<<1|1,mid+1,r,k);
    39 }
    40 int main(){
    41     scanf("%d",&m);
    42     for(int i=1;i<=m;i++){
    43         int x; scanf("%d",&x);
    44         if(x>0) mp[x]=i;
    45         else{
    46             int l=mp[-x];
    47             updata(1,1,m,l,i-1,-x);
    48             mp.erase(-x);
    49         }
    50     }
    51     map<int,int>::iterator it;
    52     for(it=mp.begin();it!=mp.end();it++){
    53         int l=it->second,x=it->first;
    54         //cout<<l<<' '<<x<<endl; 
    55         updata(1,1,m,l,m,x);
    56     }
    57     node hh; 
    58     dfs(1,1,m,hh);
    59 }
  • 相关阅读:
    python 随机字符串
    Ajax
    Django (Form)
    Django (项目)
    Django (二)
    Django (一)
    Django 学生管理系统
    地理坐标系 与 投影坐标系
    shapefile
    图表绘制工具--Matplotlib 3
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/8783670.html
Copyright © 2011-2022 走看看