HDU 4973 A simple simulation problem 线段树

比赛的时候写跪了……赛后拿数据对比才发现,一个地方的判断条件的顺序写反了…… 真是结结实实的坑了队友一把。当时我可以全程都在想这个题,并且有十足的把握想法是对的。

 

题意:

  最开始有n种不同细胞各一个排成一排。有两种操作:

    1. 使区间[l, r]里面的细胞加倍,并相应往后移动。

    2. 求区间[l, r]中相同细胞数量的最大值。

  对于每次2操作,输出相应的值。

 

思路:

  因为无论怎么加倍,相同的细胞总是在连续的一段。所以我们可以维护每一种细胞的数量,然后通过前缀和来知道这种细胞所在位置的开始点和结束点。这样,我们就可以很快的维护1操作了。然后前缀和可以用线段树来维护。本来树状数组来维护前缀和更简单的。但是因为查询前缀和与其他操作是一起的。所以2操作不太好实现。

  对于每个操作,我们可以用类似二分前缀和的方法求出区间的两个端点在哪段。中间的段也就必然在其中了。另外,两段的段可能区间不是完全在段中,所以要特殊处理。

 

代码:

  

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <cstdlib>
  5 #include <string>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <map>
  9 #include <set>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <functional>
 15 #include <cctype>
 16 
 17 using namespace std;
 18 
 19 #define LS p<<1, l, m
 20 #define RS p<<1|1, m+1, r
 21 
 22 typedef __int64 ll;
 23 
 24 const int MAXN = (int) 5e4+55;
 25 
 26 ll sum[MAXN<<2], MAX[MAXN<<2];
 27 int lazy[MAXN<<2];
 28 
 29 inline void pushUp(int p) {
 30     sum[p] = sum[p<<1]+sum[p<<1|1];
 31     MAX[p] = max(MAX[p<<1], MAX[p<<1|1]);
 32 }
 33 
 34 inline void pushDown(int p) {
 35     if (lazy[p]>0) {
 36         sum[p<<1] <<= lazy[p];
 37         sum[p<<1|1] <<= lazy[p];
 38         MAX[p<<1] <<= lazy[p];
 39         MAX[p<<1|1] <<= lazy[p];
 40         lazy[p<<1] += lazy[p];
 41         lazy[p<<1|1] += lazy[p];
 42         lazy[p] = 0;
 43     }
 44 }
 45 
 46 void build(int p, int l, int r) {
 47     if (l==r) {
 48         sum[p] = 1;
 49         MAX[p] = 1;
 50         return ;
 51     }
 52     int m = (l+r)>>1;
 53     build(LS);
 54     build(RS);
 55     lazy[p] = 0;
 56     pushUp(p);
 57 }
 58 
 59 void update(int p, int l, int r, ll x, ll L, ll R) { //x是当前点的起始坐标
 60     //这个区间是 [x, x+sum[p]-1]
 61     if (L<=x&&(x+sum[p]-1)<=R) {
 62         sum[p] <<= 1;
 63         MAX[p] <<= 1;
 64         lazy[p]++;
 65         return ;
 66     }
 67     if (l==r) {
 68         if (x<=L) { //左端点在这里
 69             sum[p] += min(x+sum[p]-1, R)-L+1;
 70         } else {
 71             sum[p] += R-x+1;
 72         }
 73         MAX[p] = sum[p];
 74         return ;
 75     }
 76 
 77     pushDown(p);
 78     int m = (l+r)>>1;
 79     ll M = x+sum[p<<1]-1;
 80     if (L<=M) update(LS, x, L, R);
 81     if (M< R) update(RS, M+1, L, R);
 82     pushUp(p);
 83 }
 84 
 85 ll query(int p, int l, int r, ll x, ll L, ll R) {
 86     if (L<=x&&(x+sum[p]-1)<=R) {
 87         return MAX[p];
 88     }
 89     if (l==r) {
 90         if (x<=L) {
 91             return min(R, x+sum[p]-1)-L+1;
 92         } else {
 93             return R-x+1;
 94         }
 95     }
 96 
 97     pushDown(p);
 98     int m = (l+r)>>1;
 99     ll M = x+sum[p<<1]-1;
100     ll res = 0;
101     if (L<=M) res = max(res, query(LS, x, L, R));
102     if (M <R) res = max(res, query(RS, M+1, L, R));
103     return res;
104 }
105 
106 int N, Q;
107 char str[10];
108 
109 void solve() {
110     ll L, R;
111     scanf("%d%d", &N, &Q);
112     build(1, 1, N);
113     for (int i = 0; i < Q; i++) {
114         scanf("%s%I64d%I64d", str, &L, &R);
115         if ('D'==str[0]) {
116             update(1, 1, N, 1, L, R);
117         } else {
118             printf("%I64d\n", query(1, 1, N, 1, L, R));
119         }
120     }
121 }
122 
123 int main() {
124     #ifdef Phantom01
125         freopen("HDU4973.in", "r", stdin);
126         freopen("my4973.out", "w", stdout);
127     #endif // Phantom01
128 
129     int T;
130     scanf("%d", &T);
131 
132     for (int i = 1; i<= T; i++) {
133         printf("Case #%d:\n", i);
134         solve();
135     }
136 
137     return 0;
138 }
View Code

 

转载于:https://www.cnblogs.com/Phantom01/p/3928378.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为中心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理中的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值