2017-2018 8th BSUIR Open Programming Contest. Semifinal C题Good subset.

训练上做了三个小时硬肝出来,先写的trie,然后知道铁用线性基,线性基考场现学真刺激hhh

大概题意是n个操作,每个操作往队列队尾加一个数(x属于[0,42]),或者删掉队首的数,每次操作输出能否在已有的数中选出若干个数求得异或和为42

思路:离线操作,时间做区间用线段树维护每个时间点的线性基,从而就避免了线性基的删除操作。但感觉不是正解???

线性基的d不能开太大,会卡空间,还有maxn也是。

明天学线性基和高斯消元

线性基板子参考:https://blog.csdn.net/baodream/article/details/83025285

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
struct L_B{int d[8];L_B(){memset(d,0,sizeof(d));}bool insert(int val){for (int i=7;i>=0;i--)if (val&(1<<i)){if (!d[i]){d[i]=val;break;}val^=d[i];}return val>0;}void clear(){memset(d,0,sizeof(d));}
};
L_B merge(const L_B &n1,const L_B &n2)
{L_B ret=n1;for (int i=7;i>=0;i--)if (n2.d[i])ret.insert(n2.d[i]);return ret;
}
struct node{L_B xxj;int left,right;bool tag_judge;L_B tag;
}tree[maxn<<2];
struct lx{int tL,tR;int num;lx(int _tL,int _tR,int _num){tL=_tL;tR=_tR;num=_num;}
};
vector<lx> a;
void build(int root,int left,int right)
{tree[root].left=left,tree[root].right=right;tree[root].tag_judge=false;if(left==right){return;}int mid=(left+right)>>1;build(root<<1,left,mid);build(root<<1|1,mid+1,right);
}
void pushdown(int root)
{if(!tree[root].tag_judge) return;tree[root<<1].tag=merge(tree[root<<1].tag,tree[root].tag),tree[root<<1].tag_judge=true;tree[root<<1].xxj=merge(tree[root<<1].xxj,tree[root].tag);tree[root<<1|1].tag=merge(tree[root<<1|1].tag,tree[root].tag),tree[root<<1|1].tag_judge=true;tree[root<<1|1].xxj=merge(tree[root<<1|1].xxj,tree[root].tag);tree[root].tag.clear(); tree[root].tag_judge=false;
}
void add(int root,int left,int right,int k)
{if(tree[root].left>=left && tree[root].right<=right){tree[root].xxj.insert(k);tree[root].tag.insert(k);tree[root].tag_judge=true;return;}pushdown(root);if(tree[root<<1].right>=left) add(root<<1,left,right,k);if(tree[root<<1|1].left<=right) add(root<<1|1,left,right,k);tree[root].xxj=merge(tree[root<<1].xxj,tree[root<<1|1].xxj);
}
L_B search(int root,int left,int right)
{if(tree[root].left>=left&&tree[root].right<=right) return tree[root].xxj;pushdown(root);L_B sum;sum.clear();if(tree[root<<1].right>=left) sum=merge(sum,search(root<<1,left,right));if(tree[root<<1|1].left<=right) sum=merge(sum,search(root<<1|1,left,right));return sum;
}
void init()
{a.clear();for(int i=0;i<maxn<<2;i++){tree[i].xxj.clear();}
}
int main()
{int n;while(cin>>n){init();queue<int> q; while(!q.empty()) q.pop();queue<int> q2; while(!q2.empty()) q2.pop();char s[5];int num;int start;for(int i=1;i<=n;i++){scanf("%s",s);if(s[0]=='+'){scanf("%d",&num);q.push(num);q2.push(i);}else{num=q.front();q.pop();start=q2.front();q2.pop();a.push_back(lx(start,i-1,num));}}while(!q.empty()){num=q.front(),q.pop();start=q2.front(),q2.pop();a.push_back(lx(start,n,num));}build(1,1,n);for(int i=0;i<a.size();i++){add(1,a[i].tL,a[i].tR,a[i].num);}for(int i=1;i<=n;i++){L_B temp=search(1,i,i);if(temp.insert(42)) printf("No\n");else printf("Yes\n");}    }return 0;
}

【解题报告】2017-2018 8th BSUIR Open Programming Contest-C Good subset 线性基+线段树相关推荐

  1. [Gym 102135][B - Freebie]2017-2018 8th BSUIR Open Programming Contest

    description 就是生日悖论的改造 周六周日生日的推迟到周一去举行,现在有n人(n<=200)在今年过生日 问2019年有多少天(期望) 有至少两个人一起过生日 已知2019.1.1在周 ...

  2. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

  3. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

  4. 2016-2017 7th BSUIR Open Programming Contest. Final 补题

    题目链接 https://codeforces.com/gym/102133 参考题解 A - Tree Orientation 简要题意: 给定 nnn 个结点的无向树,根为 111 号点,问有多少 ...

  5. 解题报告——2017年C/C++ A组第五题 字母组串(递归)

    题目描述: 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA","A ...

  6. 2018 ACM-ICPC, Syrian Collegiate Programming Contest

    这是2018年叙利亚大学程序设计赛,星期一没什么比赛就拿这套题目练了一下手,在这里写几道我做出来的里面还算有点难度的题目(实力有限好多题看都没看) 比赛链接 http://codeforces.com ...

  7. 2018 ACM-ICPC Syrian Collegiate Programming Contest(部分题解,待补)

    传送门 2018 ACM-ICPC 叙利亚大学生程序设计竞赛 Problem A: Hello SCPC 2018! 签到题 Problem B: Binary Hamming 简单题 #includ ...

  8. The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon

    通过这个题知道了余弦定理的使用.cos A=(b*b+c*c-a*a)/(2*b*c);   之后通过acos(cos A)就可以得出弧度来了. 弧度乘以半径就是轨距.再把多个轨迹相加就得出答案了. ...

  9. 2018 ACM-ICPC Syrian Collegiate Programming Contest

    Problem H: Bugged System 思路来源**(https://blog.csdn.net/Mitsuha_/article/details/84455292)** Mr. Light ...

最新文章

  1. 写一个函数返回参数二进制中 1 的个数
  2. undi是什么意思_undefined是什么意思啊
  3. 各种震撼的慢镜头,奇怪的知识又增加了!​
  4. 亲身体验Intellij Idea从卡顿到顺畅
  5. 懒惰的JSF Primefaces数据表分页–第2部分
  6. Hadoop学习之MapReduce
  7. Android ARM指令学习
  8. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
  9. php response响应,9. 响应 (Response)
  10. SpringBoot2.1.5(34)--- SpringBoot 实例
  11. 现在的女孩找男朋友都是怎么考虑的?
  12. 局域网传文件_手机和电脑之间互传比较大的文件,哪种方式比较好?
  13. 一个月的java工作总结
  14. 3650m5设置u盘启动_联想启天M425台式机设置u盘启动两种模式(支持uefi/bios双启动)...
  15. 网络转载的小波框架总结
  16. Perl语言的多线程(一)
  17. 初识、初使 MySQL
  18. Java基础学习:尚硅谷项目三 开发团队调度软件
  19. 终极解决-office应用商店打不开!!!
  20. IoT 物联网碎片化是云厂商的桎梏,中小企业的机会

热门文章

  1. 未来的计算机更加聪明,雷蒙德·库兹韦尔认为,在未来计算机不仅能变得聪明,而且会比人类还要聪明。...
  2. java php nodejs python旅游网站设计与开发需求分析Springboot SpringcloudVue汇总一览
  3. 腾讯地图api_腾讯位置服务JavaScript API GL正式版发布 免费向开发者开放
  4. eslint报错no-octal-escape.js:41
  5. 手机vr玩电脑上的3d游戏以及看视频
  6. 程序人生 - 太突然!浙江重大宣布!真的不敢相信!
  7. 长尾序列用户行为建模中可转移参数的学习(KDD-2020)
  8. cent os 安装
  9. Android FrameWork学习(一)Android 7.0系统源码下载\编译
  10. 刷机升级Android版本,ROM之家简析:Android手机系统怎么升级