這道題目是到毒瘤題。
首先我們至少去l個,所以我們可以把小於l的用單調佇列直接求出。
對取l~r個。顯而易見的是左右兩端必分別是這個區間的最小值和最大值。我們可以用01分數規劃。不放令結果最後為ans,則有:
(a[j]-ans*j)-(a[i]-ans*i)>ans*k
所以我們就可以愉快地分數規劃啦。
**:
#include#include#include#include#include#include#define maxa 50005#define me(a) memset(a,0,sizeof(a))
using namespace std;
const double eps=1e-6;
inline void read(int &x)
while(c<='9'&&c>='0')
return ;
}inline int read()
while(c<='9'&&c>='0')
return x;
}inline void w1(int x)
return ;
}inline void write(int x)
int n,k,l,r;
int a[maxa];
double ans=0;
deque q1,q2;//min,max
void find()
while(!q1.empty())q1.pop_back();
while(!q2.empty())q2.pop_back();
return ;
}//(a[j]-ans*j)-(a[i]-ans*i)>ans*k
double f(double x)
return ans; }
bool check(double x)
for(int i=1;i<=(n>>1);i++)swap(a[i],a[n-i+1]);
return false;
}void clear()
int main()
while(c<='
9'&&c>='0'
)
return;}
inline
intread()
while(c<='
9'&&c>='0'
)
returnx;}
inline
void w1(int
x)
return;}
inline
void write(int
x)int
n,k,l,r;
inta[maxa];
double ans=0
;deque
q1,q2;//
min,max
void
find()
while(!q1.empty())q1.pop_back();
while(!q2.empty())q2.pop_back();
return;}
//(a[j]-ans*j)-(a[i]-ans*i)>ans*k
double f(double
x)
return
ans;
}bool check(double
x)
for(int i=1;i<=(n>>1);i++)swap(a[i],a[n-i+1
]);
return
false;}
void
clear()
intmain()
printf(
"%.4lf\n
",mid);
}return0;
}
題解 JSOI2015 送禮物
首先我們得先知道乙個小結論,就是說如果最優方案中最大值和最小值必定是在區間兩端 要麼就是這兩個數在長度為 l 的區間中 那麼我們用 st表處理出長度為 l 的區間中最優的答案 接下來處理兩個數在區間首尾的方案 假設區間右端是最大值,左端是最小值 左端最大右端最小把陣列 reverse 一下就行 考慮...
swift送禮物動畫
最近做了乙個用swift寫的送禮動畫,這個動畫本來是在專案中用到的,然後專案改了需求用不上了就想到用swift封裝一下以後如果用得到可以借鑑下。想看下效果圖 思路 1.首先建立乙個動畫的資料model。struct animationmodel iflet giftname dict giftnam...
送禮物 雙向dfs
思路 dfs 先把a陣列排序,由大變小 dfs出前n 2 2 可以湊出的數,放到陣列s中 把s陣列去重排序,行成乙個單調遞增序列 再dfs剩下的數 可以組成的數,每組成乙個,二分找s陣列匹配的最大值 include includeusing namespace std typedef long lo...