BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

线段树..

---------------------------------------------------------------------------------

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<iostream>

#define rep( i , n ) for( int i = 0 ; i < n ; ++i )

#define clr( x , c ) memset( x , c , sizeof( x ) )

#define L( x ) ( x << 1 )

#define R( x ) ( L( x ) ^ 1 )

#define LC( x ) tree[ L( x ) ]

#define RC( x ) tree[ R( x ) ]

#define mid( l , r ) ( ( l + r ) >> 1 )

using namespace std;

const int maxn = int( 1e5 ) + 5;

struct Node {

int l , r;

int sum;

bool s;

Node() : sum( 0 ) {

s = false;

}

};

Node tree[ maxn << 2 ];

void maintain( int x ) {

Node &o = tree[ x ];

o.sum = o.r - o.l + 1 - o.sum;

}

void pushdown( int x ) {

Node &o = tree[ x ];

if( o.s ) {

o.s = false;

maintain( L( x ) );

maintain( R( x ) );

LC( x ).s ^= 1;

RC( x ).s ^= 1;

}

}

int L , R;

void update( int x ) {

Node &o = tree[ x ];

pushdown( x );

if( L <= o.l && o.r <= R ) {

o.s = true;

maintain( x );

} else {

int m = mid( o.l , o.r );

if( L <= m ) update( L( x ) );

if( m < R) update( R( x ) );

o.sum = LC( x ).sum + RC( x ).sum;

}

}

int query( int x ) {

Node &o = tree[ x ];

if( L <= o.l && o.r <= R )

return o.sum;

pushdown( x );

int m = mid( o.l , o.r );

int ans = 0;

if( L <= m )

ans += query( L( x ) );

if( m < R )

ans += query( R( x ) );

return ans;

}

void build( int x , int l , int r ) {

Node &o = tree[ x ];

o.l = l , o.r = r;

if( l == r ) return;

int m = mid( l , r );

build( L( x ) , l , m );

build( R( x ) , m + 1 , r );

}

int main() {

// freopen( "test.in" , "r" , stdin );

int n , m;

cin >> n >> m;

build( 1 , 1 , n );

while( m-- ) {

int op;

scanf( "%d%d%d" , &op , &L , &R );

if( op )

printf( "%d\n" , query( 1 ) );

else

update( 1 );

}

return 0;

}

---------------------------------------------------------------------------------

1230: [Usaco2008 Nov]lites 开关灯

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1181  Solved: 604
[Submit][Status][Discuss]

Description

Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <= M <= 100,000)条指令, 每个指令都是两个整数中的一个(0 <= 指令号 <= 1). 第1种指令(用0表示)包含两个数字S_i和E_i (1 <= S_i <= E_i <= N), 它们表示起始开关和终止开关. 奶牛们只需要把从S_i到E_i之间的按钮都按一次, 就可以完成这个指令. 第2种指令(用1表示)同样包含两个数字S_i和E_i (1 <= S_i <= E_i <= N), 不过这种指令是询问从S_i到E_i之间的灯有多少是亮着的. 帮助FJ确保他的奶牛们可以得到正确的答案.

Input

* 第 1 行: 用空格隔开的两个整数N和M

* 第 2..M+1 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号, S_i 和 E_i

Output

第 1..询问的次数 行: 对于每一次询问, 输出询问的结果.

Sample Input

4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4

输入解释:
一共有4盏灯; 5个指令. 下面是执行的情况:

1 2 3 4
Init: O O O O O = 关 * = 开
0 1 2 -> * * O O 改变灯 1 和 2 的状态
0 2 4 -> * O * *
1 2 3 -> 1 输出在2..3的范围内有多少灯是亮的
0 2 4 -> * * O O 改变灯 2 ,3 和 4 的状态
1 1 4 -> 2 输出在1..4的范围内有多少灯是亮的

Sample Output

1
2

HINT

Source

Gold

时间: 2024-12-09 09:58:06

BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )的相关文章

B1230 [Usaco2008 Nov]lites 开关灯 线段树

就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <=

【BZOJ1230】 [Usaco2008 Nov]lites 开关灯 线段树

递归不要加inline 会出现神奇的错误..... 1 #include <iostream> 2 #include <cstdio> 3 #define N 100010 4 using namespace std; 5 struct Tree 6 { 7 int size,rev,l,r; 8 }seg[N*4]; 9 int n,m; 10 inline int read() 11 { 12 char c; 13 int ans=0,f=1; 14 while (!isdig

1230: [Usaco2008 Nov]lites 开关灯

1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1162  Solved: 589[Submit][Status] Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关

bzoj1230 [Usaco2008 Nov]lites 开关灯

1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1615  Solved: 847[Submit][Status][Discuss] Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候

【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯

Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <= M <= 100,000)条指令, 每个指令都是两个整数中的一个(0 <= 指令号 <= 1).

P1230: [Usaco2008 Nov]lites 开关灯

嗯嗯,这是一道线段树的题,询问区间内亮着的灯的个数,我们可以把区间修改的线段树改一下,原本的求和改成若有奇数次更改则取反(总长度-亮着的灯个数),而判断是否奇数次只要数组加一个delta的值,update的时候delta xor 1 就够了,代码如下. 1 type 2 tpoint=record 3 l,r,sum,delta,mid:longint; 4 end; 5 var n,m,s,e,i,j,c,sum:longint; 6 tree:array[0..300000] of tpoi

BZOJ 1230--lites 开关灯(线段树)

1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1682  Solved: 876[Submit][Status][Discuss] Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列

1593: [Usaco2008 Feb]Hotel 旅馆 (线段树)

1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 451  Solved: 262[Submit][Status][Discuss] Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排