我发现我学数据结构学傻啦。。看题和数据范围就会想到些数据结构。。。

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。
在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1。
小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

看题和范围就开始想贪心写线段树。。。然后就A了。。然后这题stdO(n)。

对于目标大厦有波峰有波谷,我们发现如果这一次比上次高。那么肯定需要额外次数来垒起来,这层比上层低,那么肯定就在上次搭的时候一起搭了。。所以O(n)统计差值就好了。

//我的暴力线段树
#include<bits/stdc++.h>
using namespace std;const int MAXN=1e5+5;
const int INF=1e9+7;typedef pair<int,int>par;
#define mp make_pair int minv[MAXN<<2],who[MAXN<<2],a[MAXN],lzt[MAXN<<2];struct xds{#define lson (o<<1)#define rson (o<<1|1)inline void pushdown(int o){if(lzt[o]){minv[lson]-=lzt[o];lzt[lson]+=lzt[o];minv[rson]-=lzt[o];lzt[rson]+=lzt[o];lzt[o]=0;}}inline void pushup(int o){if(minv[lson]<minv[rson]){minv[o]=minv[lson];who[o]=who[lson];}else{minv[o]=minv[rson];who[o]=who[rson];   }}inline void build(int o,int l,int r){lzt[o]=0;if(l==r){minv[o]=a[l];who[o]=l;return;}int mid=l+r>>1;build(lson,l,mid);build(rson,mid+1,r);pushup(o);}inline par query(int o,int l,int r,int ql,int qr){if(ql<=l&&qr>=r){return mp(who[o],minv[o]);}int mid=l+r>>1;pushdown(o);par ans,t1=mp(0,INF),t2=mp(0,INF);//cout<<l<<":"<<r<<endl;if(ql<=mid)t1=query(lson,l,mid,ql,qr);if(qr>mid)t2=query(rson,mid+1,r,ql,qr);if(t2.second<t1.second)ans=t2;else ans=t1;return ans;}inline void change(int o,int l,int r,int ql,int qr,int val){if(ql<=r&&qr>=r){minv[o]-=val;lzt[o]+=val;return;}int mid=l+r>>1;pushdown(o);if(ql<=mid)change(lson,l,mid,ql,qr,val);if(qr>mid)change(rson,mid+1,r,ql,qr,val);pushup(o);}
}T;int n;int getans(int l,int r){if(l>r)return 0;int ans=0;par t1=T.query(1,1,n,l,r);ans+=t1.second;T.change(1,1,n,l,r,t1.second);ans+=getans(l,t1.first-1);ans+=getans(t1.first+1,r);return ans;
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}T.build(1,1,n);printf("%d\n",getans(1,n));return 0;
}
//然而真相是这样的
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main () {int n, ans = 0;scanf ("%d", &n);for (int i = 1; i <= n; ++ i) {scanf ("%d", &a[i]);if (a[i]>a[i-1]) ans += a[i]-a[i-1];}printf ("%d\n", ans);
}

题目译自 JOI 2016/2017 本選「フェーン現象(Foehn Phenomena)」
传送门焚风现象

这题。。看到数据和区间,观察了下题。
发现区间内差值不变,会导致答案变化的只有修改端点处。考虑线段树区间修改单点查询暴力维护差值。
然后对于最后一个点特判。然后就A了。。然而。。

我们发现如果区间+val。
端点处差值会如何变化?
左端修改前:
前一个点高度为a,修改区间左端点为b。令差值f=b-a;
修改后
修改高度为val,前一个点高度为a,修改区间左端点为b+val。差值为f=b+val-a;

右端修改前:
修改区间右高度为a,后一个点为b。令差值f=b-a;
修改后:
修改高度为val,修改区间右高度为a+val,后一个点为b。令差值f=b-a-val;

差值变化分别是左端+val,右端-val。。直接维护就好了。。

PS:注意以后不要再define了。。容易出事。。

//某数据结构学傻的Ipig的代码
#include<bits/stdc++.h>
using namespace std;const int MAXN=2e5+5;
#define ll long long//#define calc(x) x>0?x*t:x*s
ll n,m,s,t;inline ll calc(ll x){return x>0?x*t:x*s;
}ll a[MAXN],f[MAXN];ll sumv[MAXN<<3],lzt[MAXN<<3];
struct xds{#define lson (o<<1)#define rson (o<<1|1) inline void pushup(ll o){sumv[o]=sumv[lson]+sumv[rson];}inline void pushdown(ll o,ll l,ll r){if(lzt[o]){ll mid=l+r>>1;lzt[lson]+=lzt[o];sumv[lson]+=(mid-l+1)*lzt[o]; lzt[rson]+=lzt[o];sumv[rson]+=(r-mid)*lzt[o];lzt[o]=0;}}inline void build(ll o,ll l,ll r){lzt[o]=0;if(l==r){sumv[o]=a[l];return;}ll mid=l+r>>1;build(lson,l,mid);build(rson,mid+1,r);pushup(o);}inline void change(ll o,ll l,ll r,ll ql,ll qr,ll val){if(ql<=l&&qr>=r){sumv[o]+=(r-l+1)*val;lzt[o]+=val;/*cout<<sumv[o]<<"okokok"<<l<<"ok"<<r<<endl;*/return;}ll mid=l+r>>1;pushdown(o,l,r);if(ql<=mid)change(lson,l,mid,ql,qr,val);if(qr>mid)change(rson,mid+1,r,ql,qr,val);pushup(o);}inline ll query(ll o,ll l,ll r,ll pos){if(l==r){/*cout<<sumv[o]<<"->"<<l<<"   ";*/return sumv[o];}ll mid=l+r>>1;ll ans;pushdown(o,l,r);if(pos<=mid)ans=query(lson,l,mid,pos);else ans=query(rson,mid+1,r,pos);return ans;}
}T;int main(){ll l,r,val;ll sum=0;scanf("%lld%lld%lld%lld",&n,&m,&s,&t);n++;for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);}T.build(1,1,n);for(ll i=1;i<n;i++){f[i]=calc((a[i]-a[i+1]));//  cout<<a[i]-a[i+1];//  cout<<f[i]<<":"<<i<<endl;sum+=f[i];}for(ll i=1;i<=m;i++){scanf("%lld%lld%lld",&l,&r,&val);l++,r++;T.change(1,1,n,l,r,val);    ll t1=T.query(1,1,n,l-1),t2=T.query(1,1,n,l);//if(i==4)cout<<t2<<"ok";sum+=-f[l-1]+calc((t1-t2));f[l-1]=calc((t1-t2));t1=T.query(1,1,n,r),t2=T.query(1,1,n,r+1);//  if(i==4)
//  cout<<t1<<":::"<<t2<<endl; //  break;if(r!=n)sum+=-f[r]+calc((t1-t2)),f[r]=calc((t1-t2));printf("%lld\n",sum); }return 0;
}
//%%%mthq
#include <bits/stdc++.h>
using namespace std;
const int N = 2200000;
typedef long long ll;int n, q, s, t; ll a[N], b[N];inline ll calc(ll x) { return x > 0 ? -x*s : -x*t; }int main(){scanf("%d%d%d%d", &n, &q, &s, &t);for(int i=0; i<=n; i++) scanf("%lld\n", &a[i]);ll ans = 0;for(int i=1; i<=n; i++){b[i] = a[i] - a[i-1];ans += calc(b[i]);}for(int i=1; i<=q; i++){int l, r, val;scanf("%d%d%d", &l, &r, &val);if(l != 0){ans -= calc(b[l]);b[l] += val;ans += calc(b[l]);}if(r != n){ans -= calc(b[r+1]);b[r+1] -= val;ans += calc(b[r+1]);}printf("%lld\n", ans);}return 0;
}

一些根本不用数据结构的题。。(积木大赛、焚风现象)相关推荐

  1. CODEVS 3288 积木大赛

    [题目描述 Description] 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终 ...

  2. 【NOIP2013提高组】积木大赛

    题目背景 NOIP2013 提高组 Day2 试题 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为 1  ...

  3. 【NOIP2013积木大赛,NOIP2018铺设道路】积木大赛(思维,贪心)

    题干: 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为nn的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是h_ihi​. ...

  4. ACM图论+数据结构杂题总结

    ACM:图论+数据结构杂题总结 T1: 题目描述:(出处:Atcoder Regular Contest 067 Yakiniku Restaurants) 一条街上有N家烧烤餐馆.餐厅从西到东编号为 ...

  5. 考研数据结构判断题整合

    考研数据结构判断题整合 目录 考研数据结构判断题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...

  6. 41. 盘点那些必问的数据结构算法题之链表

    盘点那些必问的数据结构算法题之链表 0 概述 1 定义 2 基本操作 3 链表相关面试题 3.1 链表逆序 3.2 链表复制 3.3 链表合并 3.4 链表相交判断 3.5 判断链表是否存在环 3.6 ...

  7. 考研数据结构判断题整合_做题版

    考研数据结构判断题整合 目录 考研数据结构判断题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...

  8. AC日记——积木大赛 洛谷 P1969

    题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没 ...

  9. 问题 F: 积木大赛(模拟)

    时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成 ...

最新文章

  1. QIIME 2教程. 19使用q2-vsearch聚类ASVs为OTUs(2021.2)
  2. 逆向入门--代码段的介绍
  3. docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像
  4. D1net阅闻:Google发布了能理解人类语言的云服务
  5. nginx的upstream实现负载均衡自带坏点自动剔除功能
  6. 2019招行信用卡中心春招笔试题
  7. Mybatis3.4.x技术内幕(十七):Mybatis之动态Sql设计原本(上)
  8. linux鼠标移动消失,debian6升级后鼠标指针消失
  9. MATLAB高斯平顶化,一种高斯光束变换为平顶光束整形透镜的粒子群设计方法与流程...
  10. 《缠论》的精髓是什么?
  11. 社区说|Flutter 主流状态管理框架 provider get 分析
  12. 电脑重装系统经验总结
  13. 发邮件时提示连接服务器失败,发送邮件时经常出现发送失败或是连接超时什么原因...
  14. 打印机更换感光鼓单元k_感光鼓更换技法_维修技术
  15. 求二叉树中的第一条最长路径长度,并输出最长路径上的节点
  16. Elasticsearch基础整理 脑图
  17. 数据湖架构、战略和分析的8大错误认知
  18. 无线交换机 dhcp服务器,在一台交换机上有DHCP服务器,在另一台交换机上实现DHCP中继...
  19. 电池电芯生产工艺及流程
  20. C语言中的这个小细节你知道吗?

热门文章

  1. 关于C++ delete 来释放new分配的内存
  2. 【永磁同步电机转速环ADRC电流环ADRC双环无传感器控制】
  3. java ean13 计算_实训java第三课 for 逻辑运算符 条件判断 商品条形码Ean-13验证码生成...
  4. 【Altium Designer】使用CAD绘制PCB版型并将dwg文件导入AD(异形板设计)
  5. Ant Design Pro模板无多标签页解决方案
  6. 深度学习量化总结(PTQ、QAT)
  7. SpringMVC的在线人数统计监听器
  8. NTC热敏电阻与浪涌电流,热启动不会失效?
  9. 实例004:这天第几天 输入某年某月某日,判断这一天是这一年的第几天?
  10. MySQL 据库管理系统