[BZOJ 4184]shallot
2016-03-29 07:06
190 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=4184
将一个元素入队和出队看成时间轴上的一个区间。
每次进行区间覆盖,不用打标记,dfs时向下传递即可
upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
将一个元素入队和出队看成时间轴上的一个区间。
每次进行区间覆盖,不用打标记,dfs时向下传递即可
#include <bits/stdc++.h> #define maxn 500010 using namespace std; int n; int a[maxn]; void read(int& num){ num = 0; char ch = getchar(); for(; ch < '!'; ch = getchar()); bool flag = 0; if(ch == '-'){flag = 1; ch = getchar();} for(; ch > '!'; ch = getchar()) num = (num << 3) + (num << 1) + (ch ^ 48); if(flag) num = -num; } struct Node{ int l, r; vector<int> d; }t[maxn << 2]; struct Point{ int a[31]; Point(){memset(a, 0, sizeof a);} int& operator[](const int& k){return a[31];} void Insert(int c){ for(int i = 30; i >= 0; i --){ if(c >> i & 1){ if(a[i])c ^= a[i]; else {a[i] = c; return;} } } } int ask(){ int now = 0; for(int i = 30; i >= 0; i --) if((now ^ a[i]) > now) now ^= a[i]; return now; } }; #define lc id<<1 #define rc id<<1|1 void build(int id, int l, int r){ t[id].l = l, t[id].r = r; if(l == r)return; int mid = l + r >> 1; build(lc, l, mid); build(rc, mid+1, r); } set<pair<int, int> >S; void update(int id, int l, int r, int val){ if(t[id].l == l && r == t[id].r){ t[id].d.push_back(val); return; } int mid = t[id].l + t[id].r >> 1; if(r <= mid)update(lc, l, r, val); else if(l > mid)update(rc, l, r, val); else{ update(lc, l, mid, val); update(rc, mid+1, r, val); } } void dfs(int id, Point c){ for(int i = 0; i < t[id].d.size(); i ++) c.Insert(t[id].d[i]); if(t[id].l == t[id].r){printf("%d\n", c.ask()); return;} dfs(lc, c); dfs(rc, c); } int main(){ read(n); for(int i = 1; i <= n; i ++) read(a[i]); build(1, 1, n); for(int i = 1; i <= n; i ++){ if(a[i] > 0)S.insert(make_pair(a[i], i)); else{ pair<int, int> q = *S.lower_bound(make_pair(-a[i], 0)); S.erase(q); update(1, q.second, i-1, -a[i]); } } set<pair<int, int> > :: iterator i; for(i = S.begin(); i != S.end(); i ++) update(1, (*i).second, n, (*i).first); dfs(1, Point()); return 0; }
关于set
lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
相关文章推荐
- mybatis4感
- 【bzoj1324】【Exca王者之剑】【最小割】
- LeetCode 318. Maximum Product of Word Lengths
- 【灵性的觉醒】复活节的精神之旅
- jQuery UI dialog
- delphi 组件容器TObjectList代替List
- mesos 安装
- Android动画之Interpolator和AnimationSet(三)
- 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考
- julia生成指定格式的字符串.jl
- 首款Ubuntu平板开启预订 售价1600元
- 文件查找
- 转载 ASP.NET常用的正则表达式
- Oracle 占用cpu过高的处理办法
- LeetCode 268: Missing Number
- kubernetes 网络
- LeetCode 260. Single Number III
- 29. Divide Two Integers
- 使用CocoaPods可能遇到的一些问题。
- LeetCode 136. Single Number