「 Luogu P2574 」 XOR的艺术——线段树
# 解题思路
这题不难,但是原谅我一开始的傻逼想法,一会儿再给大家透露透露。
先说怎么做这题。
显然对于 $0$ 和 $1$ 来说,异或无非也就只有两种变化
- 异或了奇数次,$0$ 就会变成 $1$,$1$ 就会变成 $0$。
- 异或了偶数次,$0$ 和 $1$ 都不变。
那只需要在下传标记的时候下传修改了几次就可以。
好,下面说说我那傻逼的操作。我在下传标记的时候没有给子节点的 sum 进行异或,而是只下传了标记,并且在回溯的时候没有更新父节点的 sum 值。
然后我成功的没过样例,然鹅这并不傻逼,改过来就行了吗,对吧,但是,傻逼的来了,我改的时候没有按照上面的来改,而是在进行更新时,沿途将节点打一个flag标记,假装这一段区间需要更改。
哈哈哈哈哈,然后我成功的获得了 T 四个点的好成绩。
什么鬼,我居然忘记更新父节点,果然还是我太菜了。
我决定还是把这个代码放上吧。
# 附上代码
放上我的傻逼错误代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m;
const int maxn = 2e5+;
struct node {int l, r, sum, t, tag, flag;}tree[maxn << ];
struct Tree {
#define Lson (k << 1)
#define Rson ((k << 1) | 1)
template <typename T> inline void read(T &x) {
x = ; T f = ; char c = getchar();
while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while (c <= '' && c >= '') {x = x* + c-''; c = getchar();}
x *= f;
}
void build(int k, int ll, int rr) {
tree[k].l = ll, tree[k].r = rr;
tree[k].flag = tree[k].t = ;
if(tree[k].l == tree[k].r) {
scanf("%1d", &tree[k].sum);
return ;
}
int mid = (tree[k].l + tree[k].r) >> ;
build(Lson, tree[k].l, mid);
build(Rson, mid+, tree[k].r);
tree[k].sum = tree[Lson].sum + tree[Rson].sum;
}
void push_down(int k) {
tree[Lson].t += tree[k].tag;
tree[Rson].t += tree[k].tag;
tree[Lson].tag += tree[k].tag;
tree[Rson].tag += tree[k].tag;
tree[k].tag = ;
}
void update(int k, int L, int R) {
if(tree[k].l >= L && tree[k].r <= R) {
tree[k].t ++;
tree[k].tag ++;
return;
}
tree[k].flag = ;
if(tree[k].tag) push_down(k);
int mid = (tree[k].l + tree[k].r) >> ;
if(L <= mid) update(Lson, L, R);
if(R > mid) update(Rson, L, R);
}
int query(int k, int L, int R) {
int ans = ;
if(tree[k].l >= L && tree[k].r <= R && tree[k].flag == ) {
if(tree[k].t % == ) return (tree[k].r-tree[k].l+)-tree[k].sum;
else return tree[k].sum;
}
if(tree[k].tag) push_down(k);
int mid = (tree[k].l + tree[k].r) >> ;
if(L <= mid) ans += query(Lson, L, R);
if(R > mid) ans += query(Rson, L, R);
return ans;
}
Tree () {
read(n), read(m);
build(, , n);
int opt, l, r;
for(int i=; i<=m; i++) {
read(opt), read(l), read(r);
if(opt == ) update(, l, r);
else printf("%d\n", query(, l, r));
}
}
}T;
int main() {return ;}
好,我们再来看看正确的代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m;
const int maxn = 2e5+;
struct node {int l, r, sum, t, tag, flag;}tree[maxn << ];
struct Tree {
#define Lson (k << 1)
#define Rson ((k << 1) | 1)
template <typename T> inline void read(T &x) {
x = ; T f = ; char c = getchar();
while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while (c <= '' && c >= '') {x = x* + c-''; c = getchar();}
x *= f;
}
void build(int k, int ll, int rr) {
tree[k].l = ll, tree[k].r = rr;
tree[k].flag = tree[k].t = ;
if(tree[k].l == tree[k].r) {
scanf("%1d", &tree[k].sum);
return ;
}
int mid = (tree[k].l + tree[k].r) >> ;
build(Lson, tree[k].l, mid);
build(Rson, mid+, tree[k].r);
tree[k].sum = tree[Lson].sum + tree[Rson].sum;
}
void push_down(int k) {
if(tree[k].tag % == )
tree[Lson].sum = (tree[Lson].r-tree[Lson].l+)-tree[Lson].sum,
tree[Rson].sum = (tree[Rson].r-tree[Rson].l+)-tree[Rson].sum;
tree[Lson].tag += tree[k].tag;
tree[Rson].tag += tree[k].tag;
tree[k].tag = ;
}
void update(int k, int L, int R) {
if(tree[k].l >= L && tree[k].r <= R) {
tree[k].tag ++;
tree[k].sum = (tree[k].r-tree[k].l+)-tree[k].sum;
return;
}
if(tree[k].tag) push_down(k);
int mid = (tree[k].l + tree[k].r) >> ;
if(L <= mid) update(Lson, L, R);
if(R > mid) update(Rson, L, R);
tree[k].sum = tree[Lson].sum + tree[Rson].sum;
}
int query(int k, int L, int R) {
int ans = ;
if(tree[k].l >= L && tree[k].r <= R)
return tree[k].sum;
if(tree[k].tag) push_down(k);
int mid = (tree[k].l + tree[k].r) >> ;
if(L <= mid) ans += query(Lson, L, R);
if(R > mid) ans += query(Rson, L, R);
return ans;
}
Tree () {
read(n), read(m);
build(, , n);
int opt, l, r;
for(int i=; i<=m; i++) {
read(opt), read(l), read(r);
if(opt == ) update(, l, r);
else printf("%d\n", query(, l, r));
}
}
}T;
int main() {return ;}
「 Luogu P2574 」 XOR的艺术——线段树的更多相关文章
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...
- LOJ 2991 「THUSC 2016」补退选——trie+线段树合并或vector
题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...
- 【LOJ6620】「THUPC 2019」不等式 / inequality(线段树)
点此看题面 大致题意: 给你两个长度为\(n\)的数组\(a_i\)和\(b_i\),定义\(f_k(x)=\sum_{i=1}^k|a_ix+b_i|\),对于\(k=1\sim n\)的每个\(f ...
- 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...
- 【洛谷P2574】XOR的艺术
XOR的艺术 题目链接 用线段树维护sum, 修改时 tag[p]^=1; sum=r-l+1-sum; 详见代码 #include<iostream> #include<cstdi ...
- 「Luogu 3792」由乃与大母神原型和偶像崇拜
更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- 「POI2011 R2 Day2」Tree Rotations【线段树合并】
题目链接 [BZOJ] [洛谷] [LOJ] 题解 由于是前序遍历,那么讨论一棵树上的逆序对的情况. 两个节点都在左子树上 两个节点都在右子树上 两个节点分别在不同的子树上. 前两种情况其实也可以归结 ...
随机推荐
- 利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑
最近项目上试运行发现,很多时候网站出了问题或者某个功能不正常,常常需要运维人员去服务器里面查看一下日志,看看日志里面会产生什么异常,这样导致每次都要去远程服务器很不方便,有时服务器是客户保管的不能让我 ...
- 洛谷 - P2055 - 假期的宿舍 - 最大流
https://www.luogu.org/problemnew/show/P2055 这是一个错误的示范. 一开始觉得就找一条路从外校同学连到本校同学然后最终从周末回家的同学流出,每个人睡后一个人的 ...
- ACM中java的使用
ACM中java的使用 转载自http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输 ...
- Codeforces - 909C - Python Indentation - 简单dp
http://codeforces.com/problemset/problem/909/C 好像以前做过,但是当时没做出来,看了题解也不太懂. 一开始以为只有上面的for有了循环体,这里的state ...
- 704. Binary Search
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...
- poj2229【完全背包-规律Orz...】
挑战DP 题意: 被组合数只能是2的整数幂,然后给出一个数问有多少种组合(mod1e10): 思路: 完全背包做啊-还是蛮简单的-(这里取膜要改成加法,省时间-) dp[i]代表对于j的方案数 贴一发 ...
- java 发送get,post请求
package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- JVM的参数详解
今天就整理下JVM的参数!相对而已JVM有很多参数,但对于一般开发人员执行知道和堆栈大小,GC.远程调试的参数即可. JVM Parameters 首先需要说明的是JVM的参数形式: -X 开头的参数 ...
- the little schemer 笔记(10)
第十章 What Is the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...
- python之操作mysql(一)
使用python操作mysql的思路: 1. 连接数据库:ip,端口号,密码,账号,数据库 2. 建立游标 3.执行sql语句 4.获取执行结果 5.关闭游标,关闭连接 conn = pymysql. ...