[东师培训D5T2] 公主的朋友

题目

题目背景

由于 Wulala 在上个问题中的精彩表现,公主认为 Wulala 是一个很棒的人,就把 Wulala 留在了 X 国。这时正好公主的一位传教士朋友来拜访公主,于是想找 wulala 帮忙。X 国如同一条直线,其中有 n 个城市, 从东向西分别编号为 1~n。而他的国家中有 m 种宗教,每个城市一定会有一种信仰的宗教。有时候有些城市为了获得更多的认可,会派出信仰本城市宗教的传教士前往其他国家。X 国的传教士都十分厉害,只要是他途经的地方都会改信他所传播的宗教。传教士们在路上碰到自己宗教的城市自然就不用传教了,可以停下来看看里番啥的,所以每一个传教士在旅行前都会计算自己可以在多少城市停下来(不包括起始的城市)。而传教士们都是文科僧,数学是很差的,所以他希望 Wulala 能帮他计算。可 Wulala 数学也不好,但他又不想在公主面前丢脸,你能帮帮他吗?

输入

第一行两个整数 n,m

第二行 n 个整数第 i 个整数代表第 i 各城市信仰的宗教

第三行一个整数 T 代表传教士的个数

接下来 T 行每行两个整数 x,y 代表 x 城向 y 城派遣了一个传教士(保证 x < y)

输出

输出 T 行,第 i 行代表第 i 个传教士询问的答案。

数据范围

对于 30%的数据 n <= 100000, m <= 10, T <= 100

对于 60%的数据 n <= 100000, m <= 10, T <= 100000

对于 100%的数据 n <= 100000, m <= 300, T <= 100000

想法

又臭又长的题目背景…

抽象来看,问题实质是维护一个序列,支持区间修改为同一值,并查询区间内某一值元素个数。所以是一道典型的线段树。但是考场上写挂了T_T… 调不出来,不得已写了暴力30分… 所以当天滚粗超级惨,还是来记录一下。

其实思想还是非常简单的。对区间打上懒标记(记为ch),表示该区间有没有被修改为同一值。如果有,ch就为被修改后的值,如果没有就记为0。

题解中顺便维护了区间最大值和最小值。这是为了在查询时判一下所查询的值是否在最小值和最大值中间,如果不在就不用继续在子树里找了,肯定返回0。一个小小的优化,似乎没有维护也可以A掉…

为了让传教士去传教,我们还得知道这个传教士信仰的是什么宗教,所以还得支持单点查询。随便搞一个就好了。

区间查询,主要是判到懒标记的时候,直接加上懒标记就好了,说明这个子树都信同一个宗教。

所以为什么会写挂呢… 玄学…

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)const int MAXN = 100005;
int n, m, q, rt = 1;struct Node
{int l, r, mn, mx, ch;Node() : mn(0), mx(0), ch(0) {}
} p[MAXN << 2];struct SegTree
{void build(int x, int l, int r);void update(int x, int v);void pushUp(int x);void pushDown(int x);int query(int x, int l, int r, int v);int value(int x, int p);void modify(int x, int l, int r, int v);
} st;void SegTree::build(int x, int l, int r)
{p[x].l = l;p[x].r = r;if (l == r){scanf("%d", &p[x].mx);p[x].mn = p[x].mx;return;}int mid = l + r >> 1;build(ls(x), l, mid);build(rs(x), mid + 1, r);pushUp(x);
}void SegTree::update(int x, int v)
{p[x].mx = p[x].mn = p[x].ch = v;
}void SegTree::pushUp(int x)
{p[x].mx = max(p[ls(x)].mx, p[rs(x)].mx);p[x].mn = min(p[ls(x)].mn, p[rs(x)].mn);
}void SegTree::pushDown(int x)
{if (p[x].ch){update(ls(x), p[x].ch);update(rs(x), p[x].ch);p[x].ch = 0;}
}int SegTree::query(int x, int l, int r, int v)
{if (p[x].mx < v || p[x].mn > v)return 0;if (p[x].mx == p[x].mn){if (p[x].mx == v) return r - l + 1;else return 0;}pushDown(x);int mid = p[x].l + p[x].r >> 1;if (r <= mid) return query(ls(x), l, r, v);else if (l > mid) return query(rs(x), l, r, v);else return query(ls(x), l, mid, v) + query(rs(x), mid + 1, r, v);
}int SegTree::value(int x, int pos)
{if (p[x].l == p[x].r) return p[x].mx;pushDown(x);int mid = p[x].l + p[x].r >> 1;if (pos <= mid) return value(ls(x), pos);else return value(rs(x), pos);
}void SegTree::modify(int x, int l, int r, int v)
{if (l == p[x].l && r == p[x].r){update(x, v);return;}pushDown(x);int mid = p[x].l + p[x].r >> 1;if (r <= mid) modify(ls(x), l, r, v);else if (l > mid) modify(rs(x), l, r, v);else{modify(ls(x), l, mid, v);modify(rs(x), mid + 1, r, v);}pushUp(x);
}int main()
{scanf("%d%d", &n, &m);st.build(rt, 1, n);scanf("%d", &q);while (q--){int l, r;scanf("%d%d", &l, &r);int v = st.value(rt, l);printf("%d\n", st.query(rt, l + 1, r, v));st.modify(rt, l + 1, r, v);}return 0;
}

[东师培训D5T2] 公主的朋友相关推荐

  1. 软件工程_东师站_第六周作业

    1. PSP Date Type Job Start Int(min) End Total(min) 20160407 编码 抢答器重构 19:00 30 20:50 80   站立会议 " ...

  2. 「分块系列」公主的朋友 解题报告

    公主的朋友 Description Problem 由于\(Wulala\)在上个问题中的精彩表现,公主认为\(Wulala\)是一个很棒的人,就把\(Wulala\)留在 了\(X\)国.这时正好公 ...

  3. 东师计算机教育综合,2021年东北师范大学学前教育专硕考研必看成功上岸前辈复习经验谈...

    东北师范大学学前教育考研初.复试经验谈 一.择校问题 我的专业是学前教育,是教育类专业.那么考研时首选是教育部直属的六所院校,分别是北京师范大学.华东师范大学.东北师范大学.华中师范大学.陕西师范大学 ...

  4. 分块 公主的朋友

    问题 B: 公主的朋友 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于 Wulala 在上个问题中的精彩表现,公主认为 Wulala 是一个很棒的人,就把 Wulala 留在了 X ...

  5. 计算机基础18春在线作业1,东师-计算机应用基础18春在线作业1-1.docx

    东师计算机应用基础18春在线作业1 1.A 2.A 3.C 4.D 5.B 一.单选题共25题,62.5分 1.I/O接口位于 A总线和I/O设备之间 BCPU和I/O设备之间 C主机和总线之间 DC ...

  6. 18春东师计算机应用基础,东师计算机应用基础18春在线作业31.docx

    东师计算机应用基础18春在线作业3 1.A 2.A 3.D 4.D 5.C 一.单选题共25题,62.5分 1.解释程序的功能是 A解释执行高级语言程序 B解释执行汇编语言程序 C将汇编语言程序编译成 ...

  7. 计算机应用基础18春在线作业1答案,东师计算机应用基础-18春在线作业1.docx

    东师计算机应用基础18春在线作业1 1.A 2.C 3.C 4.C 5.B 一.单选题共25题,62.5分 1.国际区位.全拼双音.五笔字型和自然码是不同种类的汉字 A外码 B内码 C字型码 D交换码 ...

  8. 奥鹏东师计算机应用基础18,免费在线作业答案奥鹏东师计算机应用基础15秋在线作业1试卷及答案(1)...

    奥鹏东师计算机应用基础15秋在线作业1试卷及答案(1) 一.单选题(共25道试题,共62.5分.) 1.在Excel 中保存的工作簿默认的文件扩展名是(). A. XLS B. DOC C. DBF ...

  9. 东师2016年秋季计算机基础,东师2016年秋季《计算机基础》期末考核答案(1).doc

    文档介绍: EvaluationWarning:ThedocumentwascreatedwithSpire..东师2016年秋季<计算机基础>期末考核答案(1)期末作业考核<计算机 ...

最新文章

  1. SQL 主键 自动编号 主键自增
  2. C# 多线程之List的线程安全问题
  3. Java之杨辉三角的实现
  4. 如何使用Bitwarden在Active Directory上进行密码保护
  5. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
  6. Centos6.5 mysql折腾记
  7. 基于CSS class的事件监听管理机制 (转)
  8. TCP——TCP报文分析及TCP状态机、非法TCP报文标志组合
  9. 网络语言y c,惊为天人!当网络流行语翻译成诗词,中文歌曲翻译成英文......
  10. 7年老Android一次操蛋的面试经历
  11. 《影响力》(你为什么会说“是”?)读书
  12. 【CSDN英雄会】囯炬CEO张代浩:做写架构的人,做制定游戏规则的人
  13. Xcode 12 Beta 3 更新记录SwiftUI2
  14. 4G双卡工业CPE及MIFI
  15. 计算机的风扇参数,电脑静音高效有诀窍 选购对风扇不可少
  16. 弘辽科技:拼多多关键词怎么添加?店铺没转化咋办?
  17. KAIST : Multispectral Pedestrian Detection: Benchmark Dataset and Baseline
  18. 2 评价类算法:TOPSIS法笔记(附Python代码)
  19. Driver和Master交互原理解析,Driver消息循环体的产生
  20. hy3208中文参数_HY-MOSFET-产品目录表

热门文章

  1. 【香橙派4B】6、测试串口
  2. 中国电商远征军:俄罗斯人民需要你
  3. android 相机工程模式,松下数码相机工程模式
  4. Python实现某站热门评论情感分析----NLP自然语言处理
  5. java基于springboot的游戏光盘租赁系统
  6. 3.3.2 最小生成树的扩展应用
  7. 黑马(9)baseline交替最小二乘优化
  8. python科学计算实验2
  9. 英语----时态---将来时态的四种对比
  10. Idea如何导入eclipse的聚合工程的项目