[考试反思]0604四校联考第一轮day2:黑马

[考试反思]0604四校联考第一轮day2:黑马

第一轮结束了。总榜排名$rk8$在本校中$rk4$

考虑上$csp-s$的分数的话,妥妥退役。

在我前面的我翻不动,在我后面的也能随便把我翻了,结果就没什么好说的。

最近状态还是不好。抓紧调整吧,没有时间了。

越发浓郁的文化课味道

 

今天的话,上来先看的$T2$,$52pts$貌似比较简单,思路大概知道,先放了。

然后看的是$T1$发现就是一个简单的线段树优化$dp$,于是就开始写,没写多久写完了过样例。

$T3$写的树套树,写了一大摊调了好半天。过样例了。这时候看起来还挺顺,这时候是$10:00$

然后开始上对拍,拍$T1$不出错,很开心,自信估分$100$

然后接着拍$T3$,然而最开始思路是假的,被对拍干掉了,$10:30$拍出错,然后想了半天怎么改(最开始一直以为只是写挂了

没想出来,期望得分剩下$40$。后来教练突然删了一档部分分,期望只剩下$20$。

然后十分愤怒,于是就拼命改,想正解,然后发现了问题再一顿猛改,过了对拍,这时候是$11:30$

这时候已经考虑到了内存问题,对于$3 \times 10^5$的数据范围十分无奈。估分$20$(然而不知道是数据水还是常数小并没有$MLE$)

最后剩下很少的时间给$T2$,把原有思路一顿写然后过了样例,很开心,本场估分$248$。

然而$T1,2$各炸了一个细节,分别挂了$30,48$分。人都挂没了

$T1$的对拍的数据生成写的不好,$Dyyb$大神的对拍一组数据就把我卡了我自己$AC$了$50000$组。自闭了。

 

T1:旅游

大意:数轴,$x$出发最终要走到$y$,每次最多从$p$跳到$p+z$,每跳一次花费$a$。有$n$个特殊点,跳到特殊点上会有$w_i$收益。最大化总收益。$n \le 10^5,1 \le x,y,z,a \le 10^9$

首先最简单的$O(n^2)dp$不用说。然后当然可以套用$O(1000n)$的乱搞。可以得到$90pts$的好成绩,要比写挂的正解舒服的多。(数据水死算了

我们看一下转移式子,大概是$dp_i=max(dp_j+w_i + \lceil \frac{p_i-p_i}{z} \rceil \times a)$

把上取整拆开,发现$a$的系数只与$\lfloor \frac{p_i}{z} \rfloor,\lfloor \frac{p_j}{z} \rfloor,p_i \mod z <? p_j \mod z$

对于最后一部分,如果小于的话那么要额外产生$a$代价。所以线段树下标按照$p_i \mod z$查询的时候区间加就可以

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 unordered_map<int,int>M;
 5 const int S=4000007;const ll Inf=-1e18;
 6 int x,y,z,n,p[S],w[S],r[S],tl,tr; ll dp[S],mx[S],a,lz[S];
 7 bool cmp(int x,int y){return x%z<y%z||((x-y)%z==0&&x<y);}
 8 #define lc p<<1
 9 #define rc lc|1
10 #define md (L+R>>1)
11 void up(int p){mx[p]=max(mx[lc],mx[rc]);}
12 void build(int p=1,int L=tl,int R=tr){
13     if(L==R){mx[p]=r[L]==x?dp[tl]+x/z*a:Inf;return;}
14     build(lc,L,md);build(rc,md+1,R); up(p);
15 }
16 void mdf(int x,ll v,int p=1,int L=tl,int R=tr){
17     if(L==R){mx[p]=v;return;}
18     if(x<=md)mdf(x,v,lc,L,md);else mdf(x,v,rc,md+1,R);
19     up(p);
20 }
21 ll ask(int l,int r,int p=1,int L=tl,int R=tr){
22     if(l<=L&&R<=r)return mx[p];
23     return max(l<=md?ask(l,r,lc,L,md):Inf,r>md?ask(l,r,rc,md+1,R):Inf);
24 }
25 int main(){
26     freopen("tourist.in","r",stdin);freopen("tourist.out","w",stdout);
27     scanf("%d%d%d%lld%d",&x,&y,&z,&a,&n); tl=1,tr=n;
28     for(int i=1;i<=n;++i)scanf("%d%d",&p[i],&w[i]),r[i]=p[i];
29     if(p[n]!=y)p[++tr]=y,r[tr]=y; if(p[1]!=x)p[--tl]=x,r[tl]=x;
30     sort(r+tl,r+1+tr,cmp);
31     for(int i=tl;i<=tr;++i)M[r[i]]=i;
32     dp[tl]=w[tl]; build();
33     for(int i=tl+1;i<=tr;++i){
34         int P=lower_bound(r+tl,r+tr+1,p[i]%z,cmp)-r;
35         ll q=max(P==tl?Inf:ask(tl,P-1)-a,ask(P,tr))+w[i];
36         dp[i]=-p[i]/z*a+q; mdf(M[p[i]],q);
37     }printf("%lld",dp[tr]);
38 }
View Code

相关文章:

  • 2022-12-23
  • 2021-11-23
  • 2022-03-08
  • 2021-05-27
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
  • 2022-02-07
猜你喜欢
  • 2022-12-23
  • 2021-05-24
  • 2022-01-01
  • 2021-07-26
  • 2022-01-04
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案