[考试反思]0225省选模拟31:探索

[考试反思]0225省选模拟31:探索

也就没啥好说的。

今天又是把两三小时的时间献祭了给我可爱的路由器。。。

考场上想到一半,断网,重连,诶我想到哪来着了。。?

于是打算去干一个不太需要连贯思路的事情:打表啊!

$T3$只有三个参数,看起来挺可做的,研究研究。

写个暴力打了个小表找找规律,发现答案是关于$n-k$的$m$次多项式。

于是参数减小到两个。打个更好的二维表,大概是这样的:

1   2    3     4    5    6

1   4    9  16  25  36

1   6  17  36  65  106

懒得写了。于是你可以发现$F(i,j)=F(i-1,j)+F(i,j-1)+j$然后像你们一样聪明的人就可以$AC$了

然而我这种弱智不会用组合恒等式只拿了$70$

然后前两道题都是暴力,$T1$想用$i-1000$枚举量剪枝,然而只有$30$分,貌似$2000$就有$50$。

然后就没了。

 

改题不顺。

$T3$套个组合恒等式就没了于是没花多少时间。

然后$T1$再度戳中我的痛处:斜率优化$dp$。当时一直没有学明白的专题。(现在已经在比赛的第三页了,我落了多少啊这是)

而且我写的还是一个挺小众的方法$CDQ$于是大神们都不太愿意帮我看。

于是搞搞这个搞搞那个调了半天并没有找到问题,于是到处找大神帮忙看看(最后看在我调了一下午的份子上总算可怜我了),然而都没有发现问题。

结果并不是斜率优化$dp$错了,而是一个小细节。。。

也罢,诚当花了点时间好好理解了一下斜率优化$dp$吧。结合凸包和决策单调性的知识肯定比当时空手套白狼来的好的多。。

$T2$是个搜索。很好写啊。为什么没有先改这个。。。

(在$OI$里现在我会的是不是只剩下打表,乱搞,搜索和模拟了?

 

T1:Skip

大意:$dp_i=dp_j - binom{i-j}{2} +a_i$。要求$i<j,a_i \le a_j$。有$dp_0=-inf,a_n =inf$。求$dp_n -inf$。$n \le 10^5$

做法不少,大致列举:

基于线段树维护单调栈。

树状数组也可以。

线段树维护凸包。

$CDQ$分治值域+斜率youhua$dp$。

也许还有别的没提,时间复杂度都是一个或两个$log$。我写的是最后一种。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define S 100005
 4 long long dp[S];int a[S],n,o[S],q[S];
 5 bool cmp(int x,int y){return a[x]<a[y]||(a[x]==a[y]&&x<y);}
 6 long double jd(int a,int b){return 1.L*(dp[b]-dp[a]-b*(b+1ll)/2+a*(a+1ll)/2)/(a-b);}
 7 void CDQ(int l,int r){int md=l+r>>1;
 8     if(l==r)return;
 9     CDQ(l,md); sort(o+l,o+md+1); sort(o+md+1,o+r+1);
10     int p1=l,p2=md+1,h=1,t=0;
11     while(p1<=md||p2<=r)
12         if(p2>r||(o[p1]<o[p2]&&p1<=md)){
13             while(t>h&&jd(q[t-1],q[t])+1e-4>=jd(q[t],o[p1]))t--;
14             q[++t]=o[p1];p1++;
15         }else{
16             while(t>h&&dp[q[h]]+a[o[p2]]-(o[p2]-q[h])*(o[p2]-q[h]-1ll)/2<=dp[q[h+1]]+a[o[p2]]-(o[p2]-q[h+1])*(o[p2]-q[h+1]-1ll)/2)h++;
17             if(t>=h)dp[o[p2]]=max(dp[o[p2]],dp[q[h]]+a[o[p2]]-(o[p2]-q[h])*(o[p2]-q[h]-1ll)/2);p2++;
18         }
19     sort(o+l,o+r+1,cmp); CDQ(md+1,r);
20 }
21 int main(){
22     cin>>n;n++;
23     for(int i=1;i<n;++i)scanf("%d",&a[i]),dp[i]=-1000000000000000000;
24     a[0]=-2000000001;a[n]=-a[0];dp[n]=-1000000000000000000;
25     for(int i=1;i<=n;++i)o[i]=i;
26     sort(o,o+n+1,cmp); CDQ(0,n);
27     cout<<dp[n]-a[n]<<endl;
28 }
应该是最好写的一种?

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-23
  • 2022-12-23
  • 2021-11-28
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案