您的位置:首页 > 其它

[BZOJ 4184]shallot

2016-03-29 07:06 190 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=4184

将一个元素入队和出队看成时间轴上的一个区间。

每次进行区间覆盖,不用打标记,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位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: