The Street

思路:

  动态开节点线段树;

  等差序列求和于取大,是两个独立的子问题;

  所以,建两颗线段树分开维护;

  求和:等差数列的首项和公差直接相加即可;

  取大:

    对于线段树每个节点储存一条斜率为等差数列公差的线段;

    当添加线段到已有线段的节点,下传一条线段,当前节点留下一条线段;

    当要添加的线段完全覆盖或者被覆盖当前节点储存的线段时,选择更新或者不更新;

  单点查询时,从根节点到叶节点的路径上去最大值;

来,上代码:

#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的更多相关文章

  1. Codechef March Challenge 2014——The Street

    The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...

  2. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  3. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  4. CodeChef November Challenge 2014

    重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...

  5. 刷漆(Codechef October Challenge 2014:Remy paints the fence)

    [问题描述] Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏, ...

  6. [Codechef October Challenge 2014]刷漆

    问题描述 Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏,木板 ...

  7. 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 ...

  8. 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; ...

  9. CODECHEF Oct. Challenge 2014 Children Trips

    @(XSY)[分塊, 倍增] Description There's a new trend among Bytelandian schools. The "Byteland Tourist ...

随机推荐

  1. Java-JNA使用心得

    自上个月20号,历时整整一个月,终于找到工作入职了. 然后这段时间一直看公司的框架还有业务方面的东西.其实由于给分配了一个研究Java调用C语言接口的问题,导致框架业务方面的东西还不熟,然后现在手上又 ...

  2. nodejs基础1

    nodejs学习网站: https://github.com/alsotang/node-lessons 1.全局对象 (1)node中没有window对象,有global对象替代window对象 g ...

  3. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  4. 《数据结构与算法分析:C语言描述》复习——第四章“树”——二叉树

    2014.06.14 22:49 简介: 二叉树是学习树结构时接触的第一个概念,其他衍生的表示形式包括N叉树(随便多少叉).二叉链表(土话也叫左孩子右兄弟).由于单纯的二叉树是无序的,能做的事情不太多 ...

  5. 21、AngularJs知识点总结 part-3

    1.选择框select 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,也可以使用ng-repeat 指令来创建下拉列表: 区别:ng ...

  6. 【Kernal Support Vector Machine】林轩田机器学习技术

    考虑dual SVM 问题:如果对原输入变量做了non-linear transform,那么在二次规划计算Q矩阵的时候,就面临着:先做转换,再做内积:如果转换后的项数很多(如100次多项式转换),那 ...

  7. docker 踩坑笔记之 psql: could not connect to server

    最近在用docker跑rails,也遇到了一些坑,这里记录一下. 首先build项目: docker-compose build 然后就开始报错了: psql: could not connect t ...

  8. PHP session 与cookie

    知识点: session是将服务器将网页产生的会话信息以数组形式存到一个php文件中,产生的全局变量,可以在系统下的其他网页任意调用这个数据. cookie类似于session原理,但是是将数据存给用 ...

  9. [洛谷P4656][CEOI2017]Palindromic Partitions

    题目大意:一个长度为$n$的字符串,要求把它分成尽可能多的小块,使得这些块构成回文串 题解:贪心,从两边从找尽可能小的块使得左右的块相等,判断相等可以用$hash$ 卡点:无 C++ Code: #i ...

  10. CF911F Tree Destruction 解题报告

    CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...