【USACO 2008 Nov Gold】 3.Light Switching(lites 开关灯) 区间修改线段树

题意:

n、m,n个灯,m次操作

两种操作 0: 这段区间全部状态取反,初始全部为0

1: 询问这段区间有几个灯是亮的。

裸线段树,弱爆了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
#define inf 0x3f3f3f3f
using namespace std;

struct Segment_Tree
{
	int l,r,x;
	bool flag;
}s[N<<2];
int n,m;
void pushup(int x){s[x].x=s[x<<1].x+s[x<<1|1].x;}
void pushdown(int x)
{
	if(s[x].flag)
	{
		s[x].flag=0;
		if(s[x].l<s[x].r)
		{
			s[x<<1].flag^=1;
			s[x<<1|1].flag^=1;
		}
		s[x].x=s[x].r-s[x].l+1-s[x].x;
	}
}
void build(int note,int l,int r)
{
	s[note].l=l;
	s[note].r=r;
	if(l==r)return ;
	int mid=l+r>>1;
	build(note<<1,l,mid);
	build(note<<1|1,mid+1,r);
}
void add(int note,int l,int r)
{
	if(s[note].l==l&&s[note].r==r)
	{
		s[note].flag^=1;
		pushdown(note);
		return ;
	}
	pushdown(note);
	int mid=s[note].l+s[note].r>>1;
	if(r<=mid)add(note<<1,l,r),pushdown(note<<1|1);
	else if(l>mid)add(note<<1|1,l,r),pushdown(note<<1);
	else add(note<<1,l,mid),add(note<<1|1,mid+1,r);
	pushup(note);
}
int query(int note,int l,int r)
{
	pushdown(note);
	if(s[note].l==l&&r==s[note].r)return s[note].x;
	int mid=s[note].l+s[note].r>>1;
	if(r<=mid)return query(note<<1,l,r);
	else if(l>mid)return query(note<<1|1,l,r);
	else return query(note<<1,l,mid)+query(note<<1|1,mid+1,r);
}
int main()
{
	int i,j,k;
	int a,b,c;
	scanf("%d%d",&n,&m);
	build(1,1,n);
	while(m--)
	{
		scanf("%d%d%d",&a,&b,&c);
		if(a==0)add(1,b,c);
		else printf("%d\n",query(1,b,c));
	}
	return 0;
}

复制去Google翻译翻译结果

时间: 2024-10-31 09:46:07

【USACO 2008 Nov Gold】 3.Light Switching(lites 开关灯) 区间修改线段树的相关文章

【BZOJ1229】【USACO 2008 Nov Gold】 4.Toys sadstory 三分+贪心

sad story:我们自己oj的数据貌似有点问题.标程WA了5% 题解: 复制去Google翻译翻译结果 首先引一下VFK神犇的证明来证明一下这道题是三分.. { 我来告诉你世界的真相 = = 因为这题能最小费用最大流 每次最短路长度不降 所以是单峰的 最短路长度就是差分值.. 所以一阶导不降.. 是不是简单粗暴 你要证函数是单峰的. 当然是证斜率什么的 } 三分完初始买了多少个玩具,然后就是贪心. 首先我想说这个贪心真动规.虽然它真的是贪心. 首先先说一种错误的贪心. 就是从前往后扫,优先用

【USACO 2008 Nov Gold】 1.Mixed Up Cows 状压DP、

题解: 首先考虑dfs,但是看到答案的"64bit"就放弃了吧. 所以肯定是组合数.状压DP什么的,尤其是那个16,标准的状压数. 好吧,就是状压DP. f[i][j]表示i是状压的01串表示哪个取了哪个没取,然后j是结尾字符, 虽然水,但是时间复杂度是可以过的. 代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include &

【USACO 2008 Nov Gold】 2.Cheering up the Cows 最小生成树、

题意:可以理解为给你一个图,让你建一个树,然后从某根开始走,每走一条边就要消耗两边点权+边的边权.最后再加上一个根的点权,问最少花多少代价. 题解:改变边权然后做最小生成树. #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define inf 0x3f3f3f3f us

Light Switching(SPOJ LITE)—— 线段树成段更新异或值

题目连接:http://www.spoj.com/problems/LITE/en/. 题意:有若干个灯泡,每次对一段操作,这一段原先是亮的,就关了:原先是关着的,就打开.询问某一段的打开的灯泡的个数. 分析:很显然的成段更新,但是一开始想着用某段是不是相同的来维护,敲了很长时间都没有实现.后来经过大力学长知道,对有懒惰标记的节点的亮着的灯泡的和这么更新即可:c[o]=r-l+1-c[o]; 简直奥义! 另外,从这题可以看出,我对于成段更新的懒惰标记理解不够深刻.应该理解如下:对某点进行push

Light OJ 1080 - Binary Simulation - (线段树区间更新 单点查询)

Description Given a binary number, we are about to do some operations on the number. Two types of operations can be here. 'I i j'    which means invert the bit from i to j (inclusive) 'Q i'    answer whether the ith bit is 0 or 1 The MSB (most signif

【POJ3659】【USACO 2008 Jan Gold】 3.Cell Phone Network 树上最小支配集/贪心 两种做法

题意:求树上最小支配集 最小支配集:点集,即每个点可以"支配"到相邻点,求最少点数可以使所有点被支配. 图上的最小支配集是NP的,但是树上的可以DP做,是O(n)的. 暴力做就好了, f[i]表示此 点被选时的子树全支配的最小代价 g[i]表示其父亲节 点被选时的子树全支配的最小代价 h[i]表示其某子节 点被选时的子树全支配的最小代价 然后暴力转移. (v是子节点) f[x]=∑(min(f[v],min(g[v],h[v])))+1; g[x]=∑(min(f[v],h[v]));

【POJ3666】【USACO 2008 Feb Gold】 2.Cow Game 动规

题意:有若干个数,然后可以花费i的代价让某个数+i或者-i. 现在要求让你把序列排成不升或者不降,问最小代价. 题解: 首先可以证明,最优花费下最后所有的数都可以是现在的某个数: 证:如果两个数调整后在两个数中间,那么可以把两个数都变为其中一个数,而代价显然是等同的. 这个出来后就好做了. 我们可以先离散化一下,然后f[i][j]表示第i个数变为j时1~i这些数保持非严格单调的最小花费 转移时f[i][j]不必n*n枚举,可以维护一个前缀最优(非常水),然后O(1)转移. 然后做一遍非升,一遍非

【BZOJ1589】【USACO 2008 Dec Gold】 1.Trick or Treat on the Farm 基环树裸DP、

没测样例一遍A这真是-- 题意:每个点都有且仅有一个出边(可以出现自环),然后这样一个点出发就会走过且一定走过某些点. 问每个点出发都会走过几个点. 首先这是基环树无疑. 然后就是裸DP了. 这个的关键就是找环,仅此. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 using namespace std; int n

【POJ3657】【USACO 2008 Jan Gold】 1.Haybale Guessing 二分答案,并查集check

题意: 输入n.m表示数列长度为n,有m条有序的限制{l,r,x}. 限制:l~r间所有数最小值为x. 问到第几条限制开始出现矛盾,都不出现输出"0". 题解: 首先这题比较厉害,正常解有点难,不妨转化成二分答案. 我们二分"答案",也就是第ans条出现矛盾. 考虑到若一条限制S所在区间被另一个限制Seg包含,且Seg这条限制的x又比S.x大, 那么也就是意为 ① [Seg.l,Seg.r]间最小值为Seg.x ② [S  .l,S  .r]间最小值为S  .x ③