AC日记——The Street codechef March challenge 2014
思路:
动态开节点线段树;
等差序列求和于取大,是两个独立的子问题;
所以,建两颗线段树分开维护;
求和:等差数列的首项和公差直接相加即可;
取大:
对于线段树每个节点储存一条斜率为等差数列公差的线段;
当添加线段到已有线段的节点,下传一条线段,当前节点留下一条线段;
当要添加的线段完全覆盖或者被覆盖当前节点储存的线段时,选择更新或者不更新;
单点查询时,从根节点到叶节点的路径上去最大值;
来,上代码:
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define ll long long
- #define INF (1LL<<62)
- struct TreeNodeType {
- ll a,b;
- bool if_;
- struct TreeNodeType *lc,*rc;
- TreeNodeType()
- {
- lc=NULL,rc=NULL,if_=false,a=,b=;
- }
- };
- ll n,m;
- inline void in(ll &now)
- {
- ll if_z=;now=;
- char Cget=getchar();
- while(Cget>''||Cget<'')
- {
- if(Cget=='-') if_z=-;
- Cget=getchar();
- }
- while(Cget>=''&&Cget<='')
- {
- now=now*+Cget-'';
- Cget=getchar();
- }
- now*=if_z;
- }
- class SumTreeType {
- public:
- struct TreeNodeType *root;
- SumTreeType(){}
- inline void tree_down(TreeNodeType *&now,ll l,ll r)
- {
- if(now->lc==NULL) now->lc=new TreeNodeType;
- if(now->rc==NULL) now->rc=new TreeNodeType;
- now->lc->a+=now->a,now->lc->b+=now->b;
- now->rc->a+=now->a+((l+r>>)-l+)*now->b,now->rc->b+=now->b;
- now->a=,now->b=;
- }
- void tree_add(TreeNodeType *&now,ll l,ll r,ll li,ll ri,ll a,ll b)
- {
- if(now==NULL) now=new TreeNodeType;
- if(l==li&&r==ri)
- {
- now->a+=a,now->b+=b;
- return ;
- }
- ll mid=l+r>>;
- if(now->a!=&&now->b!=) tree_down(now,l,r);
- if(li>mid) tree_add(now->rc,mid+,r,li,ri,a,b);
- else if(ri<=mid) tree_add(now->lc,l,mid,li,ri,a,b);
- else
- {
- tree_add(now->lc,l,mid,li,mid,a,b);
- tree_add(now->rc,mid+,r,mid+,ri,a+(mid-li+)*b,b);
- }
- }
- ll tree_query(TreeNodeType *&now,ll l,ll r,ll to)
- {
- if(now==NULL) return ;
- if(l==r) return now->a;
- if(now->a!=||now->b!=) tree_down(now,l,r);
- ll mid=l+r>>;
- if(to<=mid) return tree_query(now->lc,l,mid,to);
- else return tree_query(now->rc,mid+,r,to);
- }
- };
- class SumTreeType ai;
- class MaxTreeType {
- public:
- ll X;
- bool op;
- struct TreeNodeType *root;
- MaxTreeType(){}
- inline double com(ll a1,ll b1,ll a2,ll b2)
- {
- if(a1==a2) return ;
- return (double)(a1-a2)/(double)(b2-b1);
- }
- void tree_down(TreeNodeType *&now,ll l,ll r,ll a,ll b)
- {
- if(now==NULL)
- {
- now=new TreeNodeType;
- now->if_=true;
- now->a=a,now->b=b;
- return ;
- }
- if(!now->if_)
- {
- now->a=a,now->b=b,now->if_=true;
- return ;
- }
- double xx=com(now->a-l*now->b,now->b,a-l*b,b),mid=l+r>>;
- if(xx<=l||xx>=r)
- {
- if((mid-l)*b+a>(mid-l)*now->b+now->a) now->a=a,now->b=b;
- return ;
- }
- if(xx<=mid)
- {
- if(now->b<b)
- {
- tree_down(now->lc,l,mid,now->a,now->b);
- now->a=a,now->b=b,now->if_=true;
- }
- else tree_down(now->lc,l,mid,a,b);
- }
- else
- {
- if(now->b<b) tree_down(now->rc,mid+,r,a+(mid-l+)*b,b);
- else
- {
- tree_down(now->rc,mid+,r,now->a+(mid-l+)*now->b,now->b);
- now->a=a,now->b=b,now->if_=true;
- }
- }
- }
- void tree_add(TreeNodeType *&now,ll l,ll r,ll li,ll ri,ll a,ll b)
- {
- if(now==NULL) now=new TreeNodeType;
- if(l==li&&r==ri)
- {
- if(!now->if_)
- {
- now->if_=true;
- now->a=a,now->b=b;
- }
- else tree_down(now,l,r,a,b);
- return ;
- }
- ll mid=l+r>>;
- if(ri<=mid) tree_add(now->lc,l,mid,li,ri,a,b);
- else if(li>mid) tree_add(now->rc,mid+,r,li,ri,a,b);
- else
- {
- tree_add(now->lc,l,mid,li,mid,a,b);
- tree_add(now->rc,mid+,r,mid+,ri,a+(mid-li+)*b,b);
- }
- }
- void tree_query(TreeNodeType *&now,ll l,ll r,ll to)
- {
- if(now==NULL) return ;
- if(now->if_) X=max(X,now->a+(to-l)*now->b);
- if(l==r) return ;
- ll mid=l+r>>;
- if(to<=mid) tree_query(now->lc,l,mid,to);
- else tree_query(now->rc,mid+,r,to);
- }
- };
- class MaxTreeType bi;
- int main()
- {
- in(n),in(m);ll op,u,v,a,b;
- for(ll i=;i<=m;i++)
- {
- in(op);
- if(op==)
- {
- in(u),in(v),in(b),in(a);
- bi.tree_add(bi.root,,n,u,v,a,b);
- }
- else if(op==)
- {
- in(u),in(v),in(b),in(a);
- ai.tree_add(ai.root,,n,u,v,a,b);
- }
- else if(op==)
- {
- in(u);
- bi.X=-INF;
- bi.tree_query(bi.root,,n,u);
- if(bi.X==-INF) printf("NA\n");
- else printf("%lld\n",bi.X+ai.tree_query(ai.root,,n,u));
- }
- }
- return ;
- }
AC日记——The Street codechef March challenge 2014的更多相关文章
- Codechef March Challenge 2014——The Street
The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- CodeChef November Challenge 2014
重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...
- 刷漆(Codechef October Challenge 2014:Remy paints the fence)
[问题描述] Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏, ...
- [Codechef October Challenge 2014]刷漆
问题描述 Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏,木板 ...
- Codechef December Challenge 2014 Chef and Apple Trees 水题
Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...
- CodeChef March Challenge 2019题解
传送门 \(CHNUM\) 显然正数一组,负数一组 for(int T=read();T;--T){ n=read(),c=d=0; fp(i,1,n)x=read(),x>0?++c:++d; ...
- CODECHEF Oct. Challenge 2014 Children Trips
@(XSY)[分塊, 倍增] Description There's a new trend among Bytelandian schools. The "Byteland Tourist ...
随机推荐
- 将list中的元素按照属性分类成树状的map
技术交流群: 233513714 public LinkedHashMap<String, List<TPhoneModel>> queryPhoneList(List< ...
- 哪些工具能有效管理Azure Active Directory?
[TechTarget中国原创] 管理Azure Active Directory有四种常见的工具:Azure Web门户.Azure PowerShell.Azure命令行接口和Azure Mana ...
- 利用插件对某些网页执行javascript代码
说明 javascript在浏览器地址栏中可以运行,也可以按F12在控制台中运行,还可以写一个插件让javascript针对某些网页执行,可以使用chrome浏览器的Content scripts,C ...
- 剑指Offer - 九度1361 - 翻转单词顺序
剑指Offer - 九度1361 - 翻转单词顺序2013-11-23 02:45 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fi ...
- 《数据结构》C++代码 邻接表与邻接矩阵
上一篇“BFS与DFS”写完,突然意识到这个可能偏离了“数据结构”的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵. 存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表 ...
- shell脚本获取网页快照并生成缩略图
获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考官方网站. 1.安装 我的环境 ...
- js对象使用
以下是js对象使用的两种方式 <script type="text/javascript"> var people = function () { } //方法1 pe ...
- PAT——乙级1028
这道题花了我半个多小时,对呀乙级算是挺多时间的了. 1028 人口普查 (20 point(s)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...
- beta版本前准备
目录 过去存在的问题 任务分工 开发规范 后端总结 卉卉 家灿 前端总结 绪佩 青元 恺琳 宇恒 丹丹 算法&API接口 家伟 鸿杰 一好 文档&博客撰写 政演 产品功能 我们已经做了 ...
- mysql5.6版本修改密码
UPDATE user SET Password=PASSWORD('新密码') WHERE User='root';