又毁三观了.......虽然题目数据有坑:区间【a,b】可能会有a>b的情况,但是我一开始没有考虑它也能过。

此外莫名其妙的TLE

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <climits>
#define MAX 100005
#define INF 0x7FFFFFFF
#define REP(i,s,t) for(int i=(s);i<=(t);++i)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define L(x) x<<1
#define R(x) x<<1|1
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;
struct node {
int left,right,mid,value,add;
} edge[4*MAX]; int aa[MAX];
int vis[33];
int ans ;
void push_up(int x) {
if(edge[R(x)].add != edge[L(x)].add)
edge[x].add = 0;
} void build(int l,int r,int num) { edge[num].left = l;
edge[num].right = r;
edge[num].mid = (l+r) >> 1;
edge[num].add = 1;
if(l == r) {
edge[num].value = 1;
return ;
} build(l,edge[num].mid,num * 2); //左子树
build(edge[num].mid + 1,r,num*2+1); //右子树 push_up(num); } void push_down(int x) {
if(edge[x].add) {
//edge[L(x)].value = (edge[L(x)].right - edge[L(x)].left + 1 ) * edge[x].add ;
//edge[R(x)].value = (edge[R(x)].right - edge[R(x)].left + 1) * edge[x].add ;
edge[L(x)].add = edge[x].add ;
edge[R(x)].add = edge[x].add ;
edge[x].add = 0 ;
}
}
void update(int l, int r, int k, int num) {
if(edge[num].left >= l && edge[num].right <= r) {
//当前区间包含于更新区间
edge[num].add = k;
return;
}
push_down(num);
if(edge[num].mid < l) update(l, r, k, num*2+1);
else if(edge[num].mid >= r) update(l, r, k, num*2);
else {
update(l, edge[num].mid, k, num*2);
update(edge[num].mid + 1, r, k, num*2+1);
}
push_up(num); } void query(int l,int r,int num) {
//if(l == edge[num].left && r == edge[num].right) //很想知道加了这个判断后TLE,不加400ms以内是为什么,按理加它是没有问题的......
if(edge[num].add != 0) {
if(vis[edge[num].add] == 0) {
ans++;
vis[edge[num].add] = 1;
}
return ;
}
push_down(num);
if(r <= edge[num].mid)
query(l,r,num*2);
else if(l >= edge[num].mid + 1)
query(l,r,num *2+1);
else {
query(l,edge[num].mid,num*2);
query(edge[num].mid+1,r,num*2+1);
}
} int main() { int n,m,l,i,x,y,c;
char str[3] ;
cin >> n >> l >> m;
build(1,n,1);
for(i=1; i<=m; i++) {
scanf("%s",str);
if(str[0] == 'C') {
scanf("%d%d%d",&x,&y,&c);
if(x > y)
swap(x,y);
update(x,y,c,1);
}
if(str[0] == 'P') {
ans = 0;
scanf("%d%d",&x,&y);
if(x > y)
swap(x,y);
mem(vis,0);
query(x,y,1);
printf("%d\n",ans);
} }
return 0;
}

Poj 2777 Count Color(线段树基础)的更多相关文章

  1. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  2. poj 2777 Count Color(线段树)

    题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  3. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  4. poj 2777 Count Color(线段树、状态压缩、位运算)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38921   Accepted: 11696 Des ...

  5. POJ 2777 Count Color(线段树之成段更新)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...

  6. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  7. POJ P2777 Count Color——线段树状态压缩

    Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...

  8. POJ 2777 Count Color(段树)

    职务地址:id=2777">POJ 2777 我去.. 延迟标记写错了.标记到了叶子节点上.. . . 这根本就没延迟嘛.. .怪不得一直TLE... 这题就是利用二进制来标记颜色的种 ...

  9. poj 2777 Count Color

    题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...

  10. POJ 2777 Count Color(线段树染色,二进制优化)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42940   Accepted: 13011 Des ...

随机推荐

  1. Mysql 创建联合主键

    Mysql 创建联合主键2008年01月11日 星期五 下午 5:21使用primary key (fieldlist)      比如:   create table mytable (       ...

  2. makefile 里面 := 和 = 的区别

    此文版权属于作者所有,任何人.媒体或者网站转载.借用都必须征得作者本人同意! 参考:What is the colon equals sign ( := ) in makefiles? Makefil ...

  3. 学习日记之模板方法模式和 Effective C++

    模板方法模式: 定义:定义一个操作中的算法的骨架.而将一些步骤延伸到子类中.模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤. (1),用了继承,而且肯定这个继承有意义的情况下.就 ...

  4. 100% width CSS 在 iPad / iPhone Safari 背景被截断 / 显示不全

    Tips: 调试 iPad 或 iPhone 可在设置中启动调试模式,在 Mac 中的 Safari 浏览器 同样开启开发者模式后,进行联机调试.功能彪悍. 最近在做一个页面时,发现在 iPad 的 ...

  5. jvm的内存区域简介

    1.内存区域划分 jvm在执行java程序过程中会将管理的内存划分成若干不同的数据区域,他们分别是程序计数器,堆,方法区,虚拟机栈,本地方法栈. 1.1指令计数器 指令计数器是线程私有的,每个线程都有 ...

  6. WPF自学笔记

    WPF使用哪几种元素作为顶级元素: 1. Window元素 2. Page元素(与Window元素类似,用于可导航的应用程序) 3. Application元素(定义应用程序资源和启动设置) PS:在 ...

  7. SPOJ8222 Substrings( 后缀自动机 + dp )

    题目大意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.F(1)..F(Length(S)) 建出SAM, 然后求出Right, 求Right可以按拓扑序dp..Right ...

  8. 转:jQuery事件绑定.on()简要概述及应用

    前几天在看<jquery基础教程>,看到事件委托的时候,关于live()方法讲的不是很详细,就去搜了一下关于live()和delegate()的. 然后在一处看到live()已经被移除了, ...

  9. [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)

    原文 [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) 周银辉 点击窗口左上角图标时弹出来的菜单也就是这里所说的系 ...

  10. Ubuntu实现双网卡双IP双待机

    Ubuntu实现双网卡双IP双待机 待机是借用了手机中的说法,其实是电脑上有两个网卡,一个无线,一个有线的.要实现无线访问外网Google Baidu查资料,有线网卡直接连接开发板.在Ubuntu上配 ...