zoukankan      html  css  js  c++  java
  • 【洛谷3515】[POI2011] Lightning Conductor(决策单调性)

    点此看题面

    大致题意: 给你一个序列,对于每个(i)求最小的自然数(p)使得对于任意(j)满足(a_jle a_i+p-sqrt{|i-j|})

    证明单调性

    考虑到(sqrt{|i-j|})的增长是逐渐变慢的,所以若当前位置(i)(x)影响,那么对于任意(y<x)(i)之后的位置都不可能再受(y)影响。

    也就可见其具有单调性。

    决策单调性

    这里的决策单调性我用的是闪指导指导我的分治做法。

    我们对于当前区间([l,r]),再记录一个决策区间([tl,tr]),表示当前区间的答案肯定在这一决策区间内。

    然后我们设(mid=lfloorfrac {l+r}2 floor),然后我们在从(tl)(tr)枚举,找出最后一个会影响到(mid)的位置(p)

    接下来递归处理([l,mid-1],[tl,p])([mid+1,r],[p,tr])即可。

    注意这里要正着倒着各做一遍取(max)

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 500000
    #define swap(x,y) (x^=y^=x^=y)
    using namespace std;
    int n,a[N+5];double s1[N+5],s2[N+5];
    
    class FastIO
    {
    	private:
    		#define FS 100000
    		#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
    		#define pc(c) (C==E&&(clear(),0),*C++=c)
    		#define tn (x<<3)+(x<<1)
    		#define D isdigit(c=tc())
    		int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
    	public:
    		I FastIO() {A=B=FI,C=FO,E=FO+FS;}
    		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
    		Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
    		Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
    		Tp I void writeln(Con Ty& x) {write(x),pc('
    ');}
    		I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
    }F;
    I void Solve(CI l,CI r,CI tl,CI tr,double *s)//分治处理决策单调性
    {
    	if(l>r) return;RI mid=l+r>>1,p=tl;
    	for(RI i=tl;i<=tr;++i) if(s[mid]<a[i]-a[mid]+sqrt(mid-i)) s[mid]=a[p=i]-a[mid]+sqrt(mid-i);//找到最远能影响到mid的位置,同时更新mid的答案
    	Solve(l,mid-1,tl,p,s),Solve(mid+1,r,p,tr,s);//递归处理子区间
    }
    int main()
    {
    	RI i,t;for(F.read(n),i=1;i<=n;++i) F.read(a[i]);
    	for(Solve(1,n,1,n,s1),i=1;i<=(n>>1);++i) swap(a[i],a[n-i+1]);Solve(1,n,1,n,s2);//正着倒着各做一遍
    	for(i=1;i<=n;++i) F.writeln((int)ceil(max(s1[i],s2[n-i+1])));return F.clear(),0;//输出答案,向上取整
    }
    
  • 相关阅读:
    js事件
    增量
    文本文件输入(忽略行)
    当数据库的字段为date类型时候
    枚举的使用
    input输入框用el对数字格式化
    图片提交按钮各浏览器不兼容问题
    js对数字的校验
    时间控件
    ymPrompt消息提示组件4.0版 演示及使用简介
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu3515.html
Copyright © 2011-2022 走看看