LDUOJ 时间锁链 (状压+线段树 )
时间锁链
时间限制: 1 Sec 内存限制: 128 MB
[命题人:admin] [ Edit] [ TestData]
题目描述
当墨老师找到封闭时间环中最小的逆序对数后,他就可以将时间环展开成一个长L的时间锁链(我们可以将之看成是一根很长的管子),其中L是整数,所以我们可以将该管子分为L段,并从左到右标记为1,2,…,L。
现在对管子有两种操作:
“C A B C” 将A到B的数都标记为C(我们可形象的看成是染成C这种颜色)。
“P A B” 输出A和B之间不同颜色的数目。
颜色有T种,标记为1,2,3…,T,T是一个很小的值,初始时管子的颜色为1。
输入
第一行为L (1≤L≤100 000),T (1≤T≤30)和O (1≤O≤100 000),其中O表示操作数。随后O行为操作命令即"C A B C"或"P A B",其中A可能比B值大。
输出
输出操作的结果。
样例输入 Copy
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
样例输出 Copy
2
1
题意:
题意很简单,给你一个区间和两种操作,你可以更改区间的数或是查询区间里有多少种不同的数。
思路:
典型的区间修改和区间查询,用线段树维护一下就可以了。
因为颜色的总数目很小,我们可以开一个bool数组暴力记录(应该可以~),也可以把状态压缩成二进制数,表示的含义就是第i位为1时说明第i个颜色被涂上了。
代码:
注意一下pushdown的写法~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
struct node{int l,r;int sum;//二进制表示涂了多少种颜色int lazy;
}a[maxn];
void pushdown(int u){if(a[u].lazy){a[u<<1].lazy=a[u<<1|1].lazy=a[u].lazy;a[u<<1].sum=a[u<<1|1].sum=(1<<a[u].lazy);a[u].lazy=0;}
}
void build(int u,int l,int r){a[u].l=l;a[u].r=r;if(l==r) a[u].sum=1<<1;else{int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);a[u].sum=a[u<<1].sum|a[u<<1|1].sum;}
}
void update(int u,int z,int l,int r){if(a[u].l>r||a[u].r<l) return ;///完全不包含if(a[u].l>=l&&a[u].r<=r){//完全包含a[u].sum=1<<z;a[u].lazy=z;return ;}pushdown(u);update(u<<1,z,l,r);update(u<<1|1,z,l,r);a[u].sum=a[u<<1].sum|a[u<<1|1].sum;
}
int query(int u,int l,int r){if(a[u].l>r||a[u].r<l) return 0;if(a[u].l>=l&&a[u].r<=r) return a[u].sum;pushdown(u);return query(u<<1,l,r)|query(u<<1|1,l,r);
}
int main(){int n,t,o;cin>>n>>t>>o;build(1,1,n);while(o--){char op;int x,y;cin>>op>>x>>y;if(op=='P'){if(x>y) swap(x,y);int res=query(1,x,y);int sum=0;for(int i=1;i<=t;i++)if(res&(1<<i)) sum++;cout<<sum<<endl;}else if(op=='C'){int z;if(x>y) swap(x,y);cin>>z;update(1,z,x,y);}}return 0;
}
LDUOJ 时间锁链 (状压+线段树 )相关推荐
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- CCF201709-5 除法(100分)【树状数组+线段树】
试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...
- Galahad(板子:区间不重复数字的和,树状数组/线段树)
链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...
- NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)
P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
- POJ2182 HDU2711 Lost Cows【树状数组+线段树】
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...
- P2357 守墓人(树状数组/线段树)
题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...
最新文章
- 青茶什么时候拆_篮球:挡拆是艺术,绝知要躬行,最简单也是最复杂的篮球战术...
- Java中常用的类及其特点
- 专访友盟CEO叶谦:深挖海量终端用户数据的价值
- 使用Xcode和Instruments调试解决iOS内存泄露
- python 科学计算及数据可视化
- “约见”面试官系列之常见面试题之第六十一篇之IE和DOM事件流(建议收藏)
- 到底什么才是人生最大的投资
- nginx优化配置选项
- BDT在Mac(10.8.3)下找不到libfreetype.6.dylib
- 2018.12.24-bzoj-2565-最长双回文串
- 使用GDB调试Android NDK native(C/C++)程序-转
- nest.js 使用express需要提供多个静态目录的操作
- 简述电子计算机发展五个阶段,简述erp发展的5个阶段
- Java 去除字符串中的空白字符
- 拨测技术在哪些方面应用比较广泛?
- 华为鸿蒙源自那句话,华为鸿蒙系统名字源自山海经它的很多自主专利都源于这本古籍,为什么?...
- 3NF、BCNF和4NF基本概念和分解
- mysql中文名字段引起的触发器语法错误
- java is setter_为什么java需要getter/setter来获取私有属性?
- 初评《凉宫春日的忧郁》