2018年6月4号(线段树(4))

  今天想和大家一起了解下今天我刚写的一道题:

  P1558 色板游戏

  题目背景

  阿宝上学了,今天老师拿来了一块很长的涂色板。

  题目描述

  色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格。并从左到右标记为1, 2, ... L。现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C。2. "P A B" 指老师的提问:A到 B号方格中有几种颜色。学校的颜料盒中一共有 T 种颜料。为简便起见,我们把他们标记为 1, 2, ... T. 开始时色板上原有的颜色就为1号色。 面对如此复杂的问题,阿宝向你求助,你能帮助他吗?

  输入输出格式

  输入格式:

  第一行有3个整数 L (1 <= L <= 100000), T (1 <= T <= 30) 和 O (1 <= O <= 100000). 在这里O表示事件数, 接下来 O 行, 每行以 "C A B C" 或 "P A B" 得形式表示所要做的事情(这里 A, B, C 为整数, 可能A> B)

  输出格式:

对于老师的提问,做出相应的回答。每行一个整数。

  输入输出样例

  输入样例#1: 复制

  2 2 4
  C 1 1 2
  P 1 2
  C 2 2 2
  P 1 2

  输出样例#1: 复制

  2
  1  这道题最主要的是处理颜色,首先我们可以想到暴力枚举颜色,经过多年的经验(其实就那么几天);绝对会超时;所以我去询问了我们班大佬,打听到一个好方法:用二进制代替有无用这种颜色;eg:10101表示用了1和3和5编号颜色,没有用其他;有人会问如何将左子树和右子树合并,所以我们就必须用或(|);有如下效果:  100|  001---------    101就进行合并了;所以代码就很好实现:
 1 #include<bits/stdc++.h>
 2 #define zhi 100001
 3 using namespace std;
 4 struct node{
 5     int l,r,dis,vis;
 6 }tree[zhi*4];
 7 int x,y,t;
 8 void buid(int p,int l,int r)
 9 {
10     tree[p].l=l;
11     tree[p].r=r;
12     tree[p].dis=1;
13     if(l==r)
14     return ;
15     buid(p*2,l,(l+r)/2);
16     buid(p*2+1,(l+r)/2+1,r);
17 }
18 int zhuang(int s)
19 {
20     int tot=0;
21     while(s!=0)
22     {
23         if(s%2)
24         tot++;
25         s/=2;
26     }
27     return tot;
28 }
29 void pdown(int p)
30 {
31     if(tree[p].vis)
32     {
33         tree[p*2].dis=tree[p].vis;
34         tree[p*2].vis=tree[p].vis;
35         tree[p*2+1].dis=tree[p].vis;
36         tree[p*2+1].vis=tree[p].vis;
37         tree[p].vis=0;
38     }
39 }
40 void xiugai(int p)
41 {
42     if(x<=tree[p].l&&y>=tree[p].r)
43     {
44         tree[p].dis=(1<<t);
45         tree[p].vis=tree[p].dis;
46         return ;
47     }
48     pdown(p);
49     int mid=(tree[p].l+tree[p].r)/2;
50     if(x<=mid)
51     xiugai(p*2);
52     if(y>mid)
53     xiugai(p*2+1);
54     tree[p].dis=tree[p*2].dis|tree[p*2+1].dis;
55 }
56 int ask(int p)
57 {
58     if(x<=tree[p].l&&y>=tree[p].r)
59     return tree[p].dis;
60     pdown(p);
61     int mid=(tree[p].l+tree[p].r)/2,a=0,b=0;
62     if(x<=mid)
63     a=ask(p*2);
64     if(y>mid)
65     b=ask(p*2+1);
66     return a|b;
67 }
68 int main()
69 {
70     char u;
71     int m,n,l,a,b;
72     cin>>n>>m>>l;
73     buid(1,1,n);
74     for(int i=1;i<=l;++i)
75     {
76         cin>>u;
77         cin>>a>>b;
78         x=min(a,b);
79         y=max(a,b);
80         if(u==‘C‘)
81         {
82             cin>>t;
83             t--;
84             xiugai(1);
85         }
86         else
87         printf("%d\n",zhuang(ask(1)));
88     }
89     return 0;
90 }

today is over!

原文地址:https://www.cnblogs.com/zssmg/p/9135608.html

时间: 2024-10-09 02:42:47

2018年6月4号(线段树(4))的相关文章

2018年5月31号(树状数组)

今天,老师讲了树状数组,本蒟蒻有点懵懵懂懂,但是基本模板我还是记到的: 先是讲下原理: 今晚学了树状数组…所以呢我来总结一下自己对它的理解…    这图是在网上随便找找的…  由图可以得出:  c1=a1;  c2=c2+c1=a1+a2;  c3=a3;  c4=c4+c3+c2=a1+a2+a3+a4;  c5=a5;  c6=c6+c5=a5+a6;  c7=a7;  c8=c8+c7+c6+c4=a1+a2+a3+a4+a5+a6+a7+a8; 前k项和:  s1=c1=a1;  s2=

2018年6月1号(线段树(1))

今天是六一儿童节,先祝各位六一儿童节快乐 今天想和大家一起学习一下线段树: 1. 创建线段树 对于线段树我们可以选择和普通二叉树一样的链式结构.我们可以用数组来存储,下面的讨论及代码都是数组来存储线段树,节点结构如下(注意到用数组存储时,有效空间为2n-1,实 际空间确不止这么多,比如上面的线段树中叶子节点1.3虽然没有左右子树,但是的确占用了数组空间,实际空间是满二叉树的节点数目. 是树的高度,但是这个空间复杂度也是 O(n) 的 ). 定义包含n个节点的线段树 SegTreeNode seg

【转帖】intel 2018年1 月2号爆出漏洞分析 知乎匿名用户

作者:匿名用户链接:https://www.zhihu.com/question/265012502/answer/288407097来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 首先要明确的是:1)这个漏洞不是去年说的Intel ME的漏洞:2)这个漏洞不是很多答主说的依靠时间推测内核加载地址的问题. 这是一个新爆出的漏洞,虽然看起来不是1月2号才暴露出来.因为Linux和Windows早在去年11月份左右就有动作开始修补了. 下面是科普时间: 首先我们需要知

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间. 题解:类似HDU 5726,可以先看一下这个blog:https://blog.csdn.net/u013569304/article/details/51987053 考虑离线,先预处理出[ 1,n ]之间所有的GCD,同时需要记录每种 GCD 的区间,方法是固定一个右端点R,对于区间[ L,R

2018年11月17号第一次参加源创会记录

前言 昨天下午,到网易大厦参加了源创会的微信小程序技术沙龙.之前也参加过一些技术沙龙,但是原创会的还是第一次,总体感觉,还是很不错的. 细雨纷飞,准时来到会场之后,竟然发觉早已经人满为患,后边陆续还有不少参会者进场,后来的人就只能够站着听了. 主题 一共有四个主题,基本都与微信小程序和前端开发相关的.其实我也不知道为什么选题主要都和小程序或者前端相关,也许可能微信总部在广州吧,又或者广州这个城市比较着重商贸,所以微商或者搞前端这些讲求快捷实用的小公司更多吧.毕竟大部份的科技巨头都集中在北京上海深

2018年3月7号 认识html

<!doctype html>(声明为 HTML5 文档)<html>(标签限定了文档的开始点和结束点)<head>(带有最基本的必需的元素.定义文档的头部)<meta charset="utf-8">(规定 HTML 文档的字符编码:)<title>无标题文档</title>(标题)</head><body> (包含了可见的页面内容.定义文档的身子)</body></ht

2018年3月12号 学习内容

选择器: 标签选择器:根据标签名找 id选择器:根据id的属性值来找元素 #id的属性值 class选择器:根据class的属性值来找元素 .class的属性值 并列 关键符号(,)形式:选择器1(,)选择器2{} 后代  关键符号(空格)形式:父选择器(空格)子选择器 css层叠样式表 用来美化页面 css分类: 1. 内联(行内):写在标签里面 以属性的形式 属性名是style 注:不推荐但是优先级最高 2.内嵌: 写在head标签内 以标签的的形式表现 标签名是link <link rel

2018年3月13号

float:浮动 clear:both 消除浮动 要浮动的标签用div包起来 给div设宽高 设行高 设行高垂直居中: #div{ width:100%; height:30px; link-height:30px;// 行高 默认垂直居中 (这里的高要跟设的高一个样) } link-height:最好对一行使用 如果换行了 标签的高度就变了 兼容:将最外层的标签设宽高 里面用百分比 盒子模型: 从内到外,内容,内边距(填充物),边框,外边距(和别的物品的距离) html        padd

2018年3月23号 Dom操作

Dom操作 dom操作:找到元素 操作元素          找元素(标签对象)                   标签名                       document.getElementsByTagName();                   属性                       document.getElementById();    id属性值                       document.getElementsByName();