POJ 2777 线段树

链接:

http://poj.org/problem?id=2777

题意:

有L个气球,开始颜色为1,每次给l,r之间的气球染色x,然后询问l,r区间有多少种不同的颜色

题解:

因为颜色最多有30种,所以对这30中颜色状态压缩一下,放在线段树里面,这样就容易更新了

最后只要计算一下query返回值得数有多少个1就行了

代码:

 31 int L, T, O;
 32 int Tree[MAXN << 2];
 33 int Lazy[MAXN << 2];
 34 
 35 int BitCount(int n) {
 36     int c = 0;
 37     for (c = 0; n; ++c) n &= (n - 1);
 38     return c;
 39 }
 40 
 41 void pushup(int rt) {
 42     Tree[rt] = Tree[rt << 1] | Tree[rt << 1 | 1];
 43 }
 44 
 45 void pushdown(int rt) {
 46     if (Lazy[rt]) {
 47         Tree[rt << 1] = Lazy[rt];
 48         Tree[rt << 1 | 1] = Lazy[rt];
 49         Lazy[rt << 1] = Lazy[rt];
 50         Lazy[rt << 1 | 1] = Lazy[rt];
 51         Lazy[rt] = 0;
 52     }
 53 }
 54 
 55 void build(int l,int r,int rt) {
 56     if (l == r) {
 57         Tree[rt] = 1;
 58         return;
 59     }
 60     int m = (l + r) >> 1;
 61     build(lson);
 62     build(rson);
 63     pushup(rt);
 64 }
 65 
 66 void update(int L, int R, int x, int l, int r, int rt) {
 67     if (L <= l && r <= R) {
 68         Tree[rt] = (1 << x);
 69         Lazy[rt] = (1 << x);
 70         return;
 71     }
 72     pushdown(rt);
 73     int m = (l + r) >> 1;
 74     if (L <= m) update(L, R, x, lson);
 75     if (R > m) update(L, R, x, rson);
 76     pushup(rt);
 77 }
 78 
 79 int query(int L, int R, int l, int r, int rt) {
 80     if (L <= l && r <= R) return Tree[rt];
 81     pushdown(rt);
 82     int m = (l + r) >> 1;
 83     int ret = 0;
 84     if (L <= m) ret |= query(L, R, lson);
 85     if (R > m) ret |= query(L, R, rson);
 86     return ret;
 87 }
 88 
 89 int main() {
 90     ios::sync_with_stdio(false), cin.tie(0);
 91     cin >> L >> T >> O;
 92     build(1, L, 1);
 93     while(O--) {
 94         char c;
 95         cin >> c;
 96         if (c == 'C') {
 97             int a, b, x;
 98             cin >> a >> b >> x;
 99             if (a > b) swap(a, b);
100             update(a, b, x - 1, 1, L, 1);
101         }
102         else {
103             int a, b;
104             cin >> a >> b;
105             if (a > b) swap(a, b);
106             cout << BitCount(query(a, b, 1, L, 1)) << endl;
107         }
108     }
109     return 0;
110 }

 

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值