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

此外莫名其妙的TLE

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <set>
  10. #include <map>
  11. #include <queue>
  12. #include <stack>
  13. #include <climits>
  14. #define MAX 100005
  15. #define INF 0x7FFFFFFF
  16. #define REP(i,s,t) for(int i=(s);i<=(t);++i)
  17. #define ll long long
  18. #define mem(a,b) memset(a,b,sizeof(a))
  19. #define mp(a,b) make_pair(a,b)
  20. #define L(x) x<<1
  21. #define R(x) x<<1|1
  22. # define eps 1e-5
  23. //#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
  24. using namespace std;
  25. struct node {
  26. int left,right,mid,value,add;
  27. } edge[4*MAX];
  28.  
  29. int aa[MAX];
  30. int vis[33];
  31. int ans ;
  32. void push_up(int x) {
  33. if(edge[R(x)].add != edge[L(x)].add)
  34. edge[x].add = 0;
  35. }
  36.  
  37. void build(int l,int r,int num) {
  38.  
  39. edge[num].left = l;
  40. edge[num].right = r;
  41. edge[num].mid = (l+r) >> 1;
  42. edge[num].add = 1;
  43. if(l == r) {
  44. edge[num].value = 1;
  45. return ;
  46. }
  47.  
  48. build(l,edge[num].mid,num * 2); //左子树
  49. build(edge[num].mid + 1,r,num*2+1); //右子树
  50.  
  51. push_up(num);
  52.  
  53. }
  54.  
  55. void push_down(int x) {
  56. if(edge[x].add) {
  57. //edge[L(x)].value = (edge[L(x)].right - edge[L(x)].left + 1 ) * edge[x].add ;
  58. //edge[R(x)].value = (edge[R(x)].right - edge[R(x)].left + 1) * edge[x].add ;
  59. edge[L(x)].add = edge[x].add ;
  60. edge[R(x)].add = edge[x].add ;
  61. edge[x].add = 0 ;
  62. }
  63. }
  64. void update(int l, int r, int k, int num) {
  65. if(edge[num].left >= l && edge[num].right <= r) {
  66. //当前区间包含于更新区间
  67. edge[num].add = k;
  68. return;
  69. }
  70. push_down(num);
  71. if(edge[num].mid < l) update(l, r, k, num*2+1);
  72. else if(edge[num].mid >= r) update(l, r, k, num*2);
  73. else {
  74. update(l, edge[num].mid, k, num*2);
  75. update(edge[num].mid + 1, r, k, num*2+1);
  76. }
  77. push_up(num);
  78.  
  79. }
  80.  
  81. void query(int l,int r,int num) {
  82. //if(l == edge[num].left && r == edge[num].right) //很想知道加了这个判断后TLE,不加400ms以内是为什么,按理加它是没有问题的......
  83. if(edge[num].add != 0) {
  84. if(vis[edge[num].add] == 0) {
  85. ans++;
  86. vis[edge[num].add] = 1;
  87. }
  88. return ;
  89. }
  90. push_down(num);
  91. if(r <= edge[num].mid)
  92. query(l,r,num*2);
  93. else if(l >= edge[num].mid + 1)
  94. query(l,r,num *2+1);
  95. else {
  96. query(l,edge[num].mid,num*2);
  97. query(edge[num].mid+1,r,num*2+1);
  98. }
  99. }
  100.  
  101. int main() {
  102.  
  103. int n,m,l,i,x,y,c;
  104. char str[3] ;
  105. cin >> n >> l >> m;
  106. build(1,n,1);
  107. for(i=1; i<=m; i++) {
  108. scanf("%s",str);
  109. if(str[0] == 'C') {
  110. scanf("%d%d%d",&x,&y,&c);
  111. if(x > y)
  112. swap(x,y);
  113. update(x,y,c,1);
  114. }
  115. if(str[0] == 'P') {
  116. ans = 0;
  117. scanf("%d%d",&x,&y);
  118. if(x > y)
  119. swap(x,y);
  120. mem(vis,0);
  121. query(x,y,1);
  122. printf("%d\n",ans);
  123. }
  124.  
  125. }
  126. return 0;
  127. }

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. viewpager的layout_width="wrap_content"无效问题

    在viewpager当中直接使用layout_width="wrap_content"是无效的,扩展了一下.解决这个问题. package com.soulagou.ui; imp ...

  2. document.execCommand()函数可用参数解析

    隐藏在暗处的方法-execCommand() 关键字: javascript document document.execCommand()方法可用来执行很多我们无法实现的操作. execComman ...

  3. 打造自己的sublime text

    博主今天正在了解学习LESS,在找相关资源的过程中,发现自己的sublime text和别人差别有点大,突然脑海中一股逼格的气息油然而生,于是查找了相关资料,并打造了一下风格. 下面开始正文. 首先是 ...

  4. UIAlertView笔记

    链接地址:http://www.cnblogs.com/scandy-yuan/archive/2013/03/11/2954194.html 1. 最简单的用法 UIAlertView*alert ...

  5. (待解决问题)nowrap在table和td都设置了宽度的时候仍然有效

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. win7 VMware Workstation Centos6.5虚机桥接上网设置 详解(靠谱)

    1.VMware Workstation 设置 2. vim /etc/sysconfig/network-scripts/ifcfg-eth0 NAME="System eth0" ...

  7. LinkList Operation

    链表典型数据结构: #define ElemType int typedef struct LinkNode{ ElemType value; struct LinkNode* next; }; 相比 ...

  8. hibernate Criteria查询 2.3

    Criteria对象提供了一种面向对象的方式查询数据库.Criteria对象需要使用Session对象来获得一个Criteria对象表示对一个持久化类的查询 查询所有 Session session ...

  9. linux中grep的用法

    http://www.9usb.net/200902/linux-grep.html http://blog.51yip.com/linux/1008.html http://blog.csdn.ne ...

  10. 质因数分解的rho以及miller-rabin

    一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法, ...