首页 > 其他分享 >G69 前缀线性基+贪心法 CF1100F Ivan and Burgers

G69 前缀线性基+贪心法 CF1100F Ivan and Burgers

时间:2024-07-19 19:29:46浏览次数:14  
标签:前缀 CF1100F int pos Burgers ans Ivan include id

视频链接:G69 前缀线性基+贪心法 CF1100F Ivan and Burgers_哔哩哔哩_bilibili

 

 

 

Ivan and Burgers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 前缀线性基+贪心法 O(30*n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=500005;
int n,m,x,l,r;
int p[N][31];   //前缀线性基
int pos[N][31]; //第i位的基对应数的位置

void insert(int x,int id){
  for(int i=0;i<=30;i++){ //复制前一版
    p[id][i]=p[id-1][i];
    pos[id][i]=pos[id-1][i];
  }
  int P=id;
  for(int i=30;i>=0;i--){
    if(x>>i&1){
      if(!p[id][i]){ //不存在则加入
        p[id][i]=x;
        pos[id][i]=P;
        break;
      }
      // 存在则先交换,后异或
      if(pos[id][i]<P) 
        swap(p[id][i],x),swap(pos[id][i],P);
      x^=p[id][i];
    }
  }
}
int query(int l,int r){
  int ans=0;
  for(int i=30;i>=0;i--)
    if(pos[r][i]>=l)ans=max(ans,ans^p[r][i]);
  return ans;
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
    scanf("%d",&x);
    insert(x,i);
  }
  scanf("%d",&m);
  while(m--){
    scanf("%d%d",&l,&r);
    printf("%d\n",query(l,r));
  }
}

 

// 前缀线性基+贪心法 O(30*n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=500005;
int n,m,x,l,r,a[N];
int p[N][31],pos[N][31];

void insert(int id,int p[],int pos[]){
  int x=a[id];
  for(int i=30;i>=0;i--){
    if(x>>i&1){
      if(!p[i]){ //不存在则加入
        p[i]=x;
        pos[i]=id;
        break;
      }
      // 存在则先交换,后异或
      if(pos[i]<id) swap(p[i],x),swap(pos[i],id);
      x^=p[i];
    }
  }
}
int query(int l,int r){
  int ans=0;
  for(int i=30;i>=0;i--)
    if(pos[r][i]>=l) ans=max(ans,ans^p[r][i]);
  return ans;
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    for(int j=0;j<=30;j++) //复制基
      p[i][j]=p[i-1][j],pos[i][j]=pos[i-1][j];    
    insert(i,p[i],pos[i]); //插入基
  }
  scanf("%d",&m);
  while(m--){
    scanf("%d%d",&l,&r);
    printf("%d\n",query(l,r));
  }
}

 

// 前缀线性基+贪心法 O(30*n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=500005;
int n,m,x,l,r;

struct node{
  int p[31],pos[31];
  
  void insert(node A,int x,int id){
    *this=A; //复制前一版
    for(int i=30;i>=0;i--){
      if(x>>i&1){
        if(!p[i]){ //不存在则加入
          p[i]=x;
          pos[i]=id;
          break;
        }
        // 存在则先交换,后异或
        if(pos[i]<id) swap(p[i],x),swap(pos[i],id);
        x^=p[i];
      }
    }
  }
  int query(int l){
    int ans=0;
    for(int i=30;i>=0;i--)
      if(pos[i]>=l) ans=max(ans,ans^p[i]);
    return ans;
  }
}a[N];

int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
    scanf("%d",&x),a[i].insert(a[i-1],x,i);
  scanf("%d",&m);
  while(m--){
    scanf("%d%d",&l,&r);
    printf("%d\n",a[r].query(l));
  }
}

 

标签:前缀,CF1100F,int,pos,Burgers,ans,Ivan,include,id
From: https://www.cnblogs.com/dx123/p/18305887

相关文章

  • TDengine 荣获 2023 Frost & Sullivan 客户价值领导力奖
    近日,TDengine被国际知名咨询公司沙利文(Frost&Sullivan)评为全球最佳工业数据管理解决方案,赢得了2023年客户价值领导力奖(Frost&Sullivanduoxie),该奖项重点关注引领行业创新和增长的企业。这一奖项的授予也标志着TDengine在工业数据管理解决方案领域的能力获得了国际权威机构......
  • Codeforces Round 637 (Div. 2) - Thanks, Ivan Belonogov! A. Nastya and Rice
    纳斯塔亚掉了\(n\)个谷物,每个谷物的重量范围在\([a-b,a+b]\)。她猜测谷物的总重量范围在\([c-d,c+d]\)。询问她的猜测是否正确。显然,若\([n(a-b),n(a+b)]\)和\([c-d,c+d]\)有交,则她的猜测正确。view#include<bits/stdc++.h>typedeflonglongll;......
  • VeriSilicon's Vivante® Neural Network Processor (NPU) IP
    高度可扩展、可编程的计算机视觉和人工智能处理器 芯原Vivante的神经网络处理器(NPU)IP是高度可扩展、可编程的计算机视觉和人工智能处理器,支持终端、边缘端及云端设备的人工智能运算升级。VivanteNPUIP可满足多种芯片尺寸和功耗预算,是具成本效益的优质神经网络加速引擎解决......
  • codeforces 594 div2 Ivan the Fool and the Probability Theory (DP 推公式)
    题目大意:现在有n*m个格子。然后我们可以对这些格子染上黑色或者白色。规定每个格子最多允许相邻1个与它同样颜色的格子,问你我们有多少中不同的染色方案。解题思路:首先考虑1*......
  • Codeforces Round #757 (Div. 2) - D2. Divan and Kostomuksha (hard version)
    GCD+DP+调和级数/埃式筛[Problem-D-Codeforces](https://codeforces.com/contest/1610/problem/D)题意给出一个长度为\(n\;(1<=n<=10^5)\)的数组\(a[i]\;(1<......