1、刁难

(difficult.pas/cpp)

题目描述

NOIP2013虐江湖考挂了,DAY1爆0,倒数第一,曾经省选校内总分第一的虐江湖终被姜胡虐,但是为了下一届的省选,虐江湖决定出题刁难下学弟们……现有N个数字,你每次需要选定一个区间,要求满足下列条件后这个区间尽可能长:区间左界为大于0的最靠左的数字,且区间最小值大于0。然后将该区间里每一个数减去该区间最小值……经过若干次这样操作后,这些数字都会变成0。你的任务是对于每次这样的操作,输出其左界与右界和当前区间最小值和区间长度,然后将该区间里每一个数减去该区间最小值,最后一行输出区间最小值总和。学弟们,快虐爆丧心病狂的虐江湖,争取你们的省队名额吧!

输入数据

第1行一个正整数N,表示N个数

第2行N个数,0<Ci<2^32-1

输出数据

M行(M≤N),每行4个数Ai,Bi,Ci,Ki表示左界为Ai,右界为Bi,区间最小值为Ci,区间长度为Ki的符合条件的最长区间,最后一行输出区间最小值总和。

输入样例(difficult.in)

5

3 2 4 5 1

输出样例(difficult.out)

1 5 1 5

1 4 1 4

1 1 1 1

3 4 2 2

4 4 1 1

6

数据规模

20%数据N≤1000

100%数据N≤100000

内存限制 64M

时限1S

------------------------------------------------------------------------------------------------------------------------------------

这道题CQ本来是想考二分+线段树:线段树查询找出最左边不为0的点。。二分查找右端点,,然后再区间更新什么的。。我是照着这个思路写的。

不过这题时间卡得太紧了,有8个点标程都是几乎快1秒了才出答案。。。我的线段树貌似常数略大,8个点都是1.2s出答案。。。所以。。。

tsy用了一种神奇的写法用0.2+秒的时间过了时间最长的点- -,学习了一下:

每个节点要维护的信息:不为0的最左最长区间的最小值和左右端点。(懒标记什么的当然还是要有。。。)

然后这个关键的问题就在up上了。。。

up是这样考虑的:如果左子区间有数不为0,可行区间各个信息都从左区间转移。否则从右区间转移。

有一种特殊情况就是左边的最左可行区间和右边的最左可行区间是并在一起的,那么转移时也把它们合并起来(具体看代码吧。。)

还有个关键问题就是update,不能像普通区间更新那样,而是如果有某区间变化时他原本的最优区间最小值减为了0。。那么就继续递归下去,直到最低层。。。(这样回溯的时候up操作就可以维护出新的各个区间的值)。。

如果线段树的根对应的区间的合法区间最小值,就结束。。否则继续操作。。

这种神级线段树我还真不敢在考场上写。。。看来我学的还是太死了

有个坑爹的地方就是:每组数据都刚好会爆int。。。。CQ说这是他专门坑我们的- -

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n;
struct T
{int l,r;int ld,rd;long long mint;long long add;
}tree[100000*3+10];
void up(int id)
{if(tree[id<<1].mint){tree[id].mint=tree[id<<1].mint;tree[id].ld=tree[id<<1].ld;tree[id].rd=tree[id<<1].rd;if(tree[id].rd==tree[id<<1].r&&tree[id<<1|1].mint&&tree[id<<1|1].ld==tree[id<<1|1].l){tree[id].mint=min(tree[id].mint,tree[id<<1|1].mint);tree[id].rd=tree[id<<1|1].rd;}}else{tree[id].mint=tree[id<<1|1].mint;tree[id].ld=tree[id<<1|1].ld;tree[id].rd=tree[id<<1|1].rd;}
}
void pushdown(int id)
{if(tree[id].add){long long x=tree[id].add;tree[id].add=0;tree[id<<1].add+=x;tree[id<<1|1].add+=x;tree[id<<1].mint+=x,tree[id<<1|1].mint+=x;}
}
void build(int id,int l,int r)
{tree[id].l=l;tree[id].r=r;tree[id].add=0;if(l==r){scanf("%I64d",&tree[id].mint);tree[id].ld=tree[id].rd=l;return;}else{int mid=(l+r)>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);up(id);}
}
void update(int id,int l,int r,long long add)
{if(tree[id].l==tree[id].r){tree[id].mint+=add;return;}if(l<=tree[id].l&&tree[id].r<=r&&tree[id].mint>-add){tree[id].add+=add;tree[id].mint+=add;}else{pushdown(id);int mid=(tree[id].l+tree[id].r)>>1;if(l<=mid)update(id<<1,l,r,add);if(r>mid)update(id<<1|1,l,r,add);up(id);}
}
int main()
{freopen("difficult.in","r",stdin);freopen("difficult.out","w",stdout);scanf("%d",&n);build(1,1,n);long long ans=0;while(tree[1].mint!=0){long long x=tree[1].mint;ans+=x;printf("%d %d %I64d %d\n",tree[1].ld,tree[1].rd,x,tree[1].rd-tree[1].ld+1);update(1,tree[1].ld,tree[1].rd,-x);}printf("%I64d\n",ans);return 0;
}

【题解】CQ大神原创的一道题相关推荐

  1. 用java编写圆锥_求java大神帮忙 求大神帮助!Java

    导航:网站首页 > 求java大神帮忙 求大神帮助!Java 求java大神帮忙 求大神帮助!Java 相关问题: 匿名网友: 普通类 public class CircularA { //求圆 ...

  2. SVG大神专访:荒村,就是原创精神的代言人。

    2021 年的最后一天,如果要概括 SVG 圈这一年,那么「原创精神」最为合适.这一年,我们看到优秀的高校工作室纷纷崛起,我们看到精彩的新兴特效频频涌现.我们也看到原创者们捍卫权利而斗争时的信念,更看 ...

  3. 文章如何做伪原创 SEO大神教你几招做原创网站文章的心得

    想要创作出好的文章并被百度所喜欢,就非常需要SEO的优化能力,以及要对文章进行塬创或伪塬创,那么,如何做伪塬创文章?以及如何做好塬创网站文章呢?对此,本文小编就为大家带来了几招做"塬创&qu ...

  4. 神级:程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结

    https://blog.csdn.net/v_JULY_v/article/details/6543438 https://blog.csdn.net/v_JULY_v/article/detail ...

  5. python代码少的作品_原创 8行python代码展示程序员从入门到大神(或跑路)的全部状态...

    一行python代码可以做什么? 人生苦短,我用python.python的世界里无处不在的简洁和短小,往往一行代码可以实现很多有意思功能. 你敢想象你从入门python代码.网络达人.反重力怪才.爱 ...

  6. DP分类题目 转载 《志当存高远》大神的 没有冒犯的意思 只是拿过来学习的

    A.各种背包,就根据背包九讲的内容来做吧! --不会背包的可以边看背包九讲边练习 =========================================================== ...

  7. 上海高一计算机奥赛,上海物理奥赛金牌“大神”爱番剧和高达,已保送清华大学姚班...

    闪耀的荣誉背后,藏着什么"秘密武器"? 史景喆(左)与范小辉老师 本文图片均为 华东师大二附中 提供近日,华东师范大学第二附属中学(以下简称"华东师大二附中") ...

  8. 星火视频计算机原理,各专业上岸大神助你搞定专业课!| 初试专业课冲刺经验贴合集...

    原标题:各专业上岸大神助你搞定专业课!| 初试专业课冲刺经验贴合集 距离2021考研仅有 23天,为了能够帮助大家更高效地把握住考前最后的时间,小招特地收集了多篇学长学姐们的经验贴,从中整理出Hust ...

  9. 沉痛悼念游戏开发大神毛星云

    惟愿所有的"爆料"都是造谣,惟愿我们能够一起去创造并让大家都能玩到蕴藏着中国上下五千年本土文化的优质游戏大作,惟愿我们能等到你的好消息...... 让人难过的是,据银柿财经报道,针 ...

最新文章

  1. 网络营销再掀波澜,微博独领风骚
  2. 傅里叶分析(matlab)
  3. Linux简单安装Mysql+Apach+PHP+phpMyAdmin
  4. mysql sumif条件求和_sumif与sumifs条件求和函数详解,小白到大神的必经之路
  5. PVS-Studio C/C++/C++11 静态代码分析工具
  6. 一个优秀的前端工程师应具备哪些技能?
  7. 最强面试题整理第三弹:Python 后台开发面试题(附答案)
  8. word 方框中插入对号、错号符号
  9. win11壁纸|windows11桌面壁纸
  10. 用Python实现随机森林回归
  11. 关于阿里巴巴编程规范
  12. 【快递100】 物流公司对应编码分享(截止到2021-09-19 最新数据)
  13. foxmail添加网易企业邮箱账号遇到账号或密码错误的问题
  14. 时序数据库TSDB逐日统计的Jave算法实现过程
  15. 服务器端编程心得(七)——开源一款即时通讯软件的源码
  16. 自动控制原理之如何理解梅森公式(内附MATLAB求解传递函数程序)
  17. 单片机——IIC协议与24C02
  18. Cannot assign requested address错误解决
  19. excel2007如何筛选后复制粘贴
  20. 物联网卡系统php,物联网卡开发文案

热门文章

  1. mysql迁移后数据对比_Oracle/云MySQL/MsSQL“大迁移”真相及最优方案
  2. web前端开发与应用——选择器
  3. 【Netty】Netty零拷贝原理
  4. 相声源稿件:对春联国际版
  5. 便利蜂超级会员限时特惠年卡仅需5折
  6. 【计算机网络】思科实验(4):综合实验作业之办公室的跨VLAN通信
  7. proteus 整流桥
  8. 12种论坛常用的推广方法
  9. itext html to pdf设置边距,iText:设置边距是否有效?
  10. 体育计算机培训心得体会,关于体育培训学习心得体会5篇