• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

解决多线段单点最值问题。

模板题

浅略的说一下。

每个区间存储位于当前区间中的值最大的线段。每次插入新线段,如果当前区间没有存储线段,就直接插在这里,否则分类讨论一下,如果某一个子区间的最优线段必定是当前线段,这个子区间就不用处理了。而对于另一个有不确定因素的,我们把当前的不优线段下传即可。具体实现看代码,本质上是标记永久化,所以查询的时候直接对于每个点都更新一下答案就好。

#includebits/stdc .h

#定义ll龙龙

#定义db double

#define filein(a) freopen(#a ' .输入,' r ',标准输入)

#define fileot(a) freopen(#a ' .out ',' w ',stdout)

#define Better_IO true

命名空间IO{

#如果更好_IO

char buf[(120) 3],*p1(buf),* p2(buf);

常数int lim=120

inline char gc(){

if(p1==p2) p2=(p1=buf) fread(buf,1,lim,stdin);

返回p1==p2?EOF: * p1

}

#定义pc putchar

#否则

#定义gc getchar

#定义pc putchar

#endif

内嵌布尔值空白(字符c){

返回c=='\t '或c=='\n '或c=='\r '或c=='或c==EOF

}

内嵌void gs(char *s){

char ch=GC();

while(blank(ch))ch=GC();

而(!blank(ch)){ * s=ch;ch=GC();}

* s=0;

}

内嵌void ps(char *s){

while(*s!=0){ PC(* s);}

}

模板类T

内嵌无效读取(T s){

s=0;char ch=GC();bool f=0;

while(ch ' 0 ' | | ' 9 ' ch){ if(ch=='-')f=1;ch=GC();}

while(' 0 '=chch=' 9 '){ s=s * 10(ch^48);ch=GC();}

if(ch==' . '){

db p=0.1 ch=GC();

while(' 0 '=chch=' 9 '){ s=s p*(ch^48);ch=GC();p *=0.1}

}

s=f?-s :s;

}

模板类t,类.A

内联空读(T s,A.a){

阅读;阅读(一).);

}

};

使用IO:gs

使用IO:ps

使用IO:read阅读

使用IO:gc

const int N=1e 5 3;

int n;

const db inf=1e9

int tot

结构行{

db k,b;

} p[N];

内嵌行更改(整数sx,整数sy,整数fx,整数fy){

db k,b;

if(sx==fx){

k=0;

b=std:max(sy,fy);

}否则{

k=(db)(fy-sy)/(db)(FX-sx);

b=sy-(db)k * sx;

}

return (line){k,b };

}

#定义pr std:pairdb,int

线内公共关系最大值(公关x,公关y){

if(x.firsty.first)返回y;

else if(x.firsty.first)返回x;

返回x . second .秒?x:y

}

内嵌数据库计算(int id,int x){

return (p[id].k*x p[id].b);

}

const int N2=39989 3;

结构段树{

#定义立法会(十)(x1)

#定义rc(x) (x1|1)

结构节点{

国际,r,mid

进程号

} t[N22];

inline void build(int x,int l,int r){

t[x].l=lt[x].r=rt[x].mid=(l r)1;

t[x].id=0;

if(l==r){

返回;

}

build(lc(x),l,t[x]).mid);

build(rc(x),t[x]).mid 1,r);

}

inline void modify(int x,int l,int r,int id){

if(t[x].实验室反应堆或t[x].rl)返回;

db val1=calc(t[x]).id,t[x].mid),val2=calc(id,t[x].mid);

if(l=t[x]).l和t[x].r=r){

如果(!t[x].id){

t[x].id=id

返回;

}

if(t[x].l==t[x].r){

if(val1val2) t[x].id=id

else if(val1==val2) t[x].id=std:min(id,t[x]).id);

返回;

}

if(p[t[x]).kp[id].k){

if(val1val2){

修改(lc(x),l,r,t[x]).id);

}否则{

modify(rc(x),l,r,id);

}

}else if(p[t[x].kp[id].k){

if(val1val2){

修改(rc(x),l,r,t[x]).id);

}否则{

modify(lc(x),l,r,id);

}

}

if(val1val2) t[x].id=id

else if(val1==val2) t[x].id=std:min(id,t[x]).id);

返回;

}

modify(lc(x),l,r,id);

modify(rc(x),l,r,id);

}

内置公共关系查询(int x,int k)}

db res=calc(t[x]).id,k;

pr ans={res,t[x].id };

if(t[x]).l==t[x].(r)返回年份;

if(k=t[x]).mid) ans=max(ans,查询(lc(x,k));

if(t[x]).mid 1=k) ans=max(ans,查询(rc(x,k));

返回年份;

}

#无信用证

#undef rc

} t;

内拉;

int main()

filein(a);菲力牛排(一份);

读取(n);

p[0]={-1和9,-1和9 };

t。构建(1,1,3989);

for(int I=1);i=n(I)>

内部事务处;

读取(op);

if(op==0)}

内部x;

读取;

x=(x la-1)9989 1;

printf("% d \ n ",la=t.query(1,x).第二:

}

if(op==1)}

内部sx、sy、fx、fy;

读取(sx、sy、fx、fy);

sx=(sx la-1)9989 1;

sy=(sy la-1)%(int)1和9 1;

FX=(FX la-1)9989 1;

fy=(fy la-1)%(int)1和91;

if(sxfx)}

标准:交换(sx、FX);

标准:交换(sy、fy);

}

p[死]=变化(sx、sy、fx、fy);

t.modify(1、sx、fx、死);

}

}

返回0;

}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now