UVA11402 - Ahoy, Pirates!(线段树)

option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2397" target="_blank" style="">题目链接

题目大意:给你n个01串,每一个串拼接m次得到新串。最后在把这n个新串拼接起来得到终于的目标串。

然后给你四种操作:

F a b :把位置a到b都置为1;

E a b :把位置a到b都置为0。

I a b :把位置a到b上的数字翻转(0,1互换);

S a b :查询位置a到b有多少个1.

解题思路:线段树节点内部附加信息:setv:标记这个结点范围内有set值。而且须要传递到这个节点的孩子。resv:标记这个节点范围内有翻转。而且也须要传递到这个节点的孩子。

注意:setv和resv标记的范围是节点u的孩子,并不包含本身,所以还须要依据父亲节点附加信息处理这个节点的值。还有这题的时间非常紧。对于那些常常须要调用的函数加上inline能够加高速度。

代码:

#include <cstdio>
#include <cstring> #define lson(x) (x<<1)
#define rson(x) ((x<<1) + 1) const int maxn = 1100000;
int v[maxn]; struct Node { int l, r, v;
int setv, resv;
void set (int l, int r, int v, int setv, int resv) { this->l = l;
this->r = r;
this->v = v;
this->setv = setv;
this->resv = resv;
}
}node[4 * maxn]; inline void pushup (int u) { node[u].set(node[lson(u)].l, node[rson(u)].r, node[lson(u)].v + node[rson(u)].v, -1, 0);
} inline void set_node(int u, int v) { node[u].setv = v;
node[u].resv = 0;
node[u].v = v * (node[u].r - node[u].l + 1);
} inline void res_node(int u) { node[u].resv ^= 1;
node[u].v = node[u].r - node[u].l + 1 - node[u].v;
} inline void pushdown (int u) { if (node[u].setv >= 0) { set_node(lson(u), node[u].setv);
set_node(rson(u), node[u].setv);
node[u].setv = -1;
} if (node[u].resv) { res_node(lson(u));
res_node(rson(u));
node[u].resv = 0;
}
} void build (int u, int l, int r) { if (l == r)
node[u].set(l, r, v[l - 1], -1, 0);
else { int m = (l + r) / 2;
build (lson(u), l, m);
build (rson(u), m + 1, r);
pushup(u);
}
} void update (int u, int l, int r, int v) { if (node[u].l >= l && node[u].r <= r) {
set_node(u, v);
return;
}
int m = (node[u].l + node[u].r) / 2; pushdown(u);
if (l <= m)
update (lson(u), l, r, v);
if (r > m)
update (rson(u), l, r, v);
pushup(u);
} void reserve (int u, int l, int r) { if (node[u].l >= l && node[u].r <= r) {
res_node(u);
return;
} int m = (node[u].l + node[u].r) / 2; pushdown(u);
if (l <= m)
reserve(lson(u), l, r);
if (r > m)
reserve(rson(u), l, r);
pushup(u);
} int query (int u, int l, int r) { if (node[u].l >= l && node[u].r <= r)
return node[u].v; int m = (node[u].l + node[u].r) / 2; int ret = 0;
pushdown(u);
if (l <= m)
ret += query (lson(u), l, r);
if (r > m)
ret += query (rson(u), l, r);
pushup(u); return ret;
} int main () { int T, n, t, q;
int x, y;
int N, len;
char s[100]; scanf ("%d", &T); for (int i = 1; i <= T; i++) { printf ("Case %d:\n", i);
memset (v, 0, sizeof (v));
len = 0; scanf ("%d", &n);
while (n--) { scanf ("%d%s", &t, s);
N = strlen (s);
for (int j = 0; j < t; j++)
for (int k = 0; k < N; k++) {
if (s[k] == '1')
v[len] = 1;
len++;
}
} build(1, 1, len); scanf ("%d", &q);
int cas = 0;
while (q--) {
scanf ("%s%d%d", s, &x, &y);
if (s[0] == 'F')
update(1, x + 1, y + 1, 1);
else if (s[0] == 'E')
update (1, x + 1, y + 1, 0);
else if (s[0] == 'I')
reserve(1, x + 1, y + 1);
else
printf ("Q%d: %d\n", ++cas, query(1, x + 1, y + 1));
}
}
return 0;
}

UVA11402 - Ahoy, Pirates!(线段树)的更多相关文章

  1. UVA 11402 - Ahoy, Pirates!(段树)

    UVA 11402 - Ahoy, Pirates! 题目链接 题意:总的来说意思就是给一个01串,然后有3种操作 1.把一个区间变成1 2.把一个区间变成0 3.把一个区间翻转(0变1,1变0) 思 ...

  2. 线段树(I tree)

    Codeforces Round #254 (Div. 2)E题这题说的是给了一个一段连续的区间每个区间有一种颜色然后一个彩笔从L画到R每个区间的颜色都发生了 改变然后 在L和R这部分区间里所用的颜色 ...

  3. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  4. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

随机推荐

  1. 火焰图&perf命令

    最近恶补后端技术,发现还是很多不懂,一直写业务逻辑容易迷失,也没有成长.自己做系统,也习惯用自己已知的知识来解决,以后应该多点调研,学到更多的东西应用起来. 先学一个新的性能分析命令. NAME pe ...

  2. c++源文件后缀名问题

    VC里用cpp作后缀名, 在GCC里默认采用C.cc.cxx作为后缀名 .cpp, .h (VS file).cc, .h (GCC file)   C中: 头文件后缀名: .h 源文件后缀名: .c ...

  3. [BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)

    建出对偶图,删除一条边时将两边的格子连边.一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可. #include<cstdio> #include<algorithm> ...

  4. [CodeForces-440D]Berland Federalization

    题目大意: 给你一棵树,你可以删掉一些边,使得分除去的子树中至少有一棵大小为k. 问最少删去多少边,以及删边的具体方案. 思路: 树形DP. f[i][j]表示以i为根,子树中去掉j个点最少要删边的数 ...

  5. C# -- 学习笔记之基础篇

    由于要做一个系统,需要用到搜索引擎开发的很多知识点.对于开发语言的选择,我一般不是擅长什么才选择什么的,而是通过对比之后,考虑开发时间和难易程度来选择.尽管现在的开发经验还不足,也只能凭借自己弱弱的判 ...

  6. [转]Android中自定义checkbox样式

    android中自定义checkbox的图片和大小   其实很简单,分三步: 1.在drawable中创建文件checkbox_selector.xml: <?xml version=" ...

  7. Matlab 曲线绘制之线型和颜色 示例

    估计很多人会碰到,当绘制的曲线特别多的时候,需要用不同的颜色和线型区分开这些曲线.根据STC论文,自己整理了一个颜色和线型的例子,供大家直接使用,直接引用PlotStyle这个数据结构就可以了. 示例 ...

  8. Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)

    使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库.所有有时候大家就直接使用它来完成一些简单(或复杂)的功能.但是你活在伟大的{print ...

  9. IDA 中文字符串

    http://www.pediy.com/kssd/pediy05/pediy50528.htm Ida Pro 的默认设置里对中文字串的支持比较差,对于首字节大于'E0'的都显示成?了.其实...  ...

  10. 对 dpif_class 结构体的一点认识

         类 dpif_class 抽象的是OVS交换机用户空间和内核层datapath的通信接口(通过netlink),分层是出于性能和生产效率的考虑,通过接口dpif_class,用户层ovs-v ...