Poj 2777 Count Color(线段树基础)
又毁三观了.......虽然题目数据有坑:区间【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(线段树基础)的更多相关文章
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- poj 2777 Count Color(线段树、状态压缩、位运算)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38921 Accepted: 11696 Des ...
- POJ 2777 Count Color(线段树之成段更新)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- POJ P2777 Count Color——线段树状态压缩
Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...
- POJ 2777 Count Color(段树)
职务地址:id=2777">POJ 2777 我去.. 延迟标记写错了.标记到了叶子节点上.. . . 这根本就没延迟嘛.. .怪不得一直TLE... 这题就是利用二进制来标记颜色的种 ...
- poj 2777 Count Color
题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...
- POJ 2777 Count Color(线段树染色,二进制优化)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42940 Accepted: 13011 Des ...
随机推荐
- BZOJ 1000 A+B Problem (I/O)
#include<cstdio> int main(){ int a,b; scanf("%d%d",&a,&b); printf("%d&q ...
- 常用 API
运行 Java 程序的参数.使用 Scanner 获取键盘输入.使用 BufferedReader 获取键盘输入.System类.Runtime类.Object类.Java 7新增的 Objects ...
- Sicily-1152 回溯算法
一.题意: 走日字,每个位置都有有8种新位置,从起点开始刚好过29步遍历其他位置一遍. 二.代码 // // main.cpp // Sicily-1152 回溯算法 // // Created by ...
- HDOJ 2102 A计划(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 ...
- javascript - Get page source code - Stack Overflow
javascript - Get page source code - Stack Overflow Get page source code
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- Reverse Integer - Palindrome Number - 简单模拟
第一个题目是将整数进行反转,这个题实现反转并不难,主要关键点在于如何进行溢出判断.溢出判断再上一篇字符串转整数中已有介绍,本题采用其中的第三种方法,将数字转为字符串,使用字符串比较大小的方法进行比较. ...
- typeof操作符的返回值
使用typeof操作符 对一个值使用typeof操作符可能返回下列某个字符串: 1):undefined——如果这个值未定义 2):boolean——如果这个值是布尔值 3):string——如果这个 ...
- Visual C++ 6.0编程环境的使用
1.1 编制并运行程序的四部曲 (1)编辑(把程序代码输入,交给计算机). (2)编译(成目标程序文件.obj).编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟 ...
- 瀑布流的三种实现方式(原生js+jquery+css3)
前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写.最近闲来没事,就自己写个.大致思路理清楚,还是挺好实现的... 原生javascript版 ...