题目の传送门:
luogu:https://www.luogu.org/problem/show?pid=1558
poj:http://poj.org/problem?id=2777

题目大意:给有个长度为L的区间,支持区间染色和区间查询颜色数。

非常水的线段树。一眼看出,然后30min AC(尽管我luogu上交了四遍)(我太辣鸡了orz)

这里我们显然可以状态压缩。用(1 << x) 不过要记住初始颜色1的值要设为2(1<<1)就因为这个我WA了两遍。。(然后又因为线段树忘了开四倍RE了一遍)
然后区间覆盖直接打标记覆盖就好,区间查询的话用到了神奇的or运算,把他们全or起来就是一个数了,然后统计这个数中1的个数即可。。
统计1的时候,我的方法是不断xor lowbit,这样的效率要比一位一位扫快一丢丢(虽然并快不了多少)。。
代码就是下面的query,自己看下就行了。。
好吧,然后下面直接上代码即可,这真的是一道非常的线段树。。

#include <cstdio>
const int MAXN=400101;
int t[MAXN],lz[MAXN];
inline void swap(int &a,int &b)
{
int c=a;a=b;b=c;
}
inline int getnum()
{
int a=0;char c=getchar();bool f=0;
for(;(c<'0'||c>'9')&&c!='-'&&c!='C'&&c!='P';c=getchar());
if(c=='C') return -1;
if(c=='P') return -2;
if(c=='-') c=getchar(),f=1;
for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0';
if(f) return -a; return a;
}
inline void update(int x)
{
t[x]=t[x<<1]|t[x<<1|1];
}
inline void pushdown(int x)
{
if(!lz[x]) return;
t[x<<1]=lz[x<<1]=t[x<<1|1]=lz[x<<1|1]=lz[x];
lz[x]=0;
}
void build(int x,int l,int r)
{
if(l==r)
{
t[x]=2;
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
update(x);
}
void change(int x,int l,int r,int L,int R,int w)
{
if(L<=l&&r<=R)
{
t[x]=1<<w;
lz[x]=1<<w;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) change(x<<1,l,mid,L,R,w);
if(R>mid) change(x<<1|1,mid+1,r,L,R,w);
update(x);
}
int findans(int x,int l,int r,int L,int R)
{
int ans=0;
if(L<=l&&r<=R) return t[x];
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) ans|=findans(x<<1,l,mid,L,R);
if(R>mid) ans|=findans(x<<1|1,mid+1,r,L,R);
return ans;
}
int query(int ans)
{
int cnt=0;
for(;ans;ans^=(ans&-ans)) cnt++;
return cnt;
}
int main()
{
int n=getnum(),t=getnum(),m=getnum();
build(1,1,n);
while(m--)
{
int opt=getnum();
if(opt==-1)
{
int a=getnum(),b=getnum(),c=getnum();
if(a>b) swap(a,b);
change(1,1,n,a,b,c);
}
else
{
int a=getnum(),b=getnum();
if(a>b) swap(a,b);
printf("%d\n",query(findans(1,1,n,a,b)));
}
}
}

【学术篇】luogu1558&&poj2777 色板游戏的更多相关文章

  1. luogu 1558 色板游戏

    写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路..... 色板游戏 色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格.并从左到 ...

  2. P1558 色板游戏

    P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  3. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  4. AC日记——色板游戏 洛谷 P1558

    色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tre ...

  5. P1558 色板游戏 状压线段树

    P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...

  6. 【学术篇】一些水的不行的dp

    最近做了几道非常水非常水的dp...... 之后刷的一些水dp也会写在这里...... 此篇题目难度不递增!!! Emmmm....... 1.luogu1043数字游戏 以前看过这个题几遍,没做这个 ...

  7. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》

    3.暂停游戏 暂停游戏概述: 在游戏进行时,玩家有可能会遇到多种突发事件.在跑酷游戏中突发状况的发生对游戏的影响更甚,游戏进行时玩家死亡,游戏只能从头开始,那么如果因为外界因素而影响游戏的进行,显然是 ...

  8. 【pygame游戏编程】第四篇-----打字测速游戏

    下面我们一起用pygame编写一个打字测速游戏 这是一个很实用的有趣的小游戏: 开始之前先来学习几个小函数: 1. ord(ch) python内置函数,传入一个字符,返回字符的ascii码 2.ch ...

  9. Luogu P1558 色板游戏

    (此题与POJ2777重题) 为了加深对线段树的记忆,然后开始搞这道题. TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见) 这道题只需要在线段树的板子上改一些地方就可以了 ...

随机推荐

  1. NOIp2018集训test-9-5(pm)

    老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...

  2. NX二次开发-UFUN按类选择对话框UF_UI_select_with_class_dialog

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //按类选择对话框 char sCue[] = "按类选择对话 ...

  3. NX二次开发-UFUN获取图纸视图最大边界和视图中心点UF_DRAW_ask_view_borders

    NX9+VS2012 //获得视图的最大边界 ]; UF_DRAW_ask_view_borders(view_tag[j], view_borders); //获得视图原点 ]; ViewOrigi ...

  4. [JZOJ 5818] 做运动

    题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...

  5. [JZOJ 5813] 计算

    题意:求满足题意的方案数. 思路: 显然的计数类\(dp\). 不难发现,令$f(x) = \prod_{i=1}^{2m}{x_i} \(. 在找一个\)x'\(使得\)f(x') = \prod_ ...

  6. idea中选中了一个变量名,会高亮显示位于别的地方的这个变量名,那么怎么修改其他地方的高亮颜色

  7. python 数据结构之冒泡排序

    def bubble_sort(alist): # 外层循环冒泡排序进行的次数(len-1) for i in range(len(alist) - 1, 0, -1): # 内层循环控制冒泡的比较: ...

  8. Python匹马行天下之运算符

    什么事运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算 ...

  9. 数据分析相关概念(numpy)

    矢量 矢量是指一堆形成的集合. 多维数组也叫做矢量化计算. 单独一个数叫做标量 例: import datetime as dt import numpy as np n2=10000 start2 ...

  10. EFCore学习记录笔记

    1:连接slqlocaldb数据库 (1)在CMD下可以输入sqllocaldb info 查看本机安装的所有的localdb实例 (2)数据库连接字符串为:“Server=(localdb)\\MS ...