时间锁链

时间限制: 1 Sec 内存限制: 128 MB
[命题人:admin] [ Edit] [ TestData]
题目描述
当墨老师找到封闭时间环中最小的逆序对数后,他就可以将时间环展开成一个长L的时间锁链(我们可以将之看成是一根很长的管子),其中L是整数,所以我们可以将该管子分为L段,并从左到右标记为1,2,…,L。

现在对管子有两种操作:

  1. “C A B C” 将A到B的数都标记为C(我们可形象的看成是染成C这种颜色)。

  2. “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 时间锁链 (状压+线段树 )相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. CCF201709-5 除法(100分)【树状数组+线段树】

    试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...

  3. Galahad(板子:区间不重复数字的和,树状数组/线段树)

    链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...

  4. NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)

    P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...

  5. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  6. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  7. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  8. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  9. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

最新文章

  1. 青茶什么时候拆_篮球:挡拆是艺术,绝知要躬行,最简单也是最复杂的篮球战术...
  2. Java中常用的类及其特点
  3. 专访友盟CEO叶谦:深挖海量终端用户数据的价值
  4. 使用Xcode和Instruments调试解决iOS内存泄露
  5. python 科学计算及数据可视化
  6. “约见”面试官系列之常见面试题之第六十一篇之IE和DOM事件流(建议收藏)
  7. 到底什么才是人生最大的投资
  8. nginx优化配置选项
  9. BDT在Mac(10.8.3)下找不到libfreetype.6.dylib
  10. 2018.12.24-bzoj-2565-最长双回文串
  11. 使用GDB调试Android NDK native(C/C++)程序-转
  12. nest.js 使用express需要提供多个静态目录的操作
  13. 简述电子计算机发展五个阶段,简述erp发展的5个阶段
  14. Java 去除字符串中的空白字符
  15. 拨测技术在哪些方面应用比较广泛?
  16. 华为鸿蒙源自那句话,华为鸿蒙系统名字源自山海经它的很多自主专利都源于这本古籍,为什么?...
  17. 3NF、BCNF和4NF基本概念和分解
  18. mysql中文名字段引起的触发器语法错误
  19. java is setter_为什么java需要getter/setter来获取私有属性?
  20. 初评《凉宫春日的忧郁》

热门文章

  1. wikioi 1014 装箱问题
  2. python牛顿法与拟牛顿法_python牛顿法
  3. 使用AspectJ LTW(Load Time Weaving)【转载】
  4. java.nio.ByteBuffer常用方法详解
  5. RelativeLayout中控件居中对齐
  6. android之ListView,GirdView和常用适配器
  7. 汤圆组合-一輩子的好閨蜜
  8. PyTorch笔记——FX
  9. 项目一 : 学优在线项目(海南憧憬互联网教育有限公司)
  10. 自建防火墙日志分析系统V1