又毁三观了.......虽然题目数据有坑:区间【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. nexus REST API /artifact/maven/[resolve|redirect] returns unexpected for v=LATEST

    Novice nexus oss (2.0.0) user here – getting unexpected results when requesting v=LATEST artifact fr ...

  2. Never-build package 'XXXX' requires always-build package 'EhLib70'

    控件包使用了DbGridEh.Requies也加入了ehlib70.dcp就是编译时不通过,提示:      Never-build   package   'XXXX'   requires   a ...

  3. 不重新编译PHP文件的情况下php GD库扩展库的编译安装(centos)

    gd-2.0.33.tar.gz http://www.boutell.com/gd/ jpegsrc.v6b.tar.gz http://www.ijg.org/ libpng-1.2.7.tar. ...

  4. 在C#中使用 Win32 和其他库

    C# 用户经常提出两个问题:“我为什么要另外编写代码来使用内置于 Windows® 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?”当框架小组构建他们的 .NET 部分时,他们评估了为使 ...

  5. Nlog的简单使用

    Nlog是.net平台下的开源日志组件,相当于log4net用法配置更简单.用途可以将日志输出到数据库,文本文件,控制台等.首先引用NLog.dll,顺便也将NLog.xml丢到运行目录准备工作完后, ...

  6. the convertion between string and BlobColumn

    It's hard to find some samples about the convertion between string and BlobColumn.AddBlobData. It's ...

  7. win7如何快速设置开机启动项?

    添加开机启动项方法: 找到windows开始菜单->所有程序->启动,右键打开, 进入C:\Users\Ocean\AppData\Roaming\Microsoft\Windows\St ...

  8. Centos6.4安装JDK

    链接地址:http://www.iteye.com/topic/1130311 1.先看看OpenJDK的安装包 $ rpm -qa |grep javatzdata-java-2013b-1.el6 ...

  9. Aptana Studio 3 官方汉化包汉化

    Babel Language Pack Update Site for Helios This URL is an Eclipse software repository:http://downloa ...

  10. codeforces 629D. Babaei and Birthday Cake

    题目链接 大意就是给出一个序列, 然后让你从中找出一个严格递增的数列, 使得这一数列里的值加起来最大. 用线段树, 先将数列里的值离散,然后就是线段树单点更新, 区间查询最值. 具体看代码. #inc ...