20210911

20210911

D a y 2 Day2 Day2裂开了。
请添加图片描述

Day1T1T2T3
预测10010040
一测10010040
Day2T1T2T3
预测1001000
一测0400

D a y 1 Day1 Day1
T1:
贪心,因为每次后操作次数一定大于等于先操作,所以贪心对最大的操作就行。 O ( n ) O(n) O(n)随便弄一下就行,考场上写了个队列加 S T ST ST表的 O ( n 2 ) O(n^2) O(n2)算法。。。不过过了。
T2:
单调栈,考虑以每个点为左端点,答案就是到右边第一个比他大的最长不下降子序列,可以用单调栈 O ( n ) O(n) O(n)维护,对相等的情况先更新再弹出 。
T3:
考试没啥时间了就写了个搜索摆烂,其实加点记忆化就过了。
记录 s u m i , j sum_{i,j} sumi,j表示第 i i i行前 j j j个数的和, f i , j , k f_{i,j,k} fi,j,k表示到i列,第 i − 1 i-1 i1列选了 j j j个数,还要选 k k k个数的最大值。可以发现若上一列选了 j j j个数,则本列至少该选 max ⁡ ( j − 1 , 0 ) \max(j-1,0) max(j1,0)个数,所以得到 f i , j , k = max ⁡ t = max ⁡ ( j − 1 , 0 ) min ⁡ ( n − i + 1 , k ) f i + 1 , t , k − t + s u m i , t f_{i,j,k}=\max_{t=\max(j-1,0)}^{\min(n-i+1,k)} f_{i+1,t,k-t}+sum_{i,t} fi,j,k=t=max(j1,0)maxmin(ni+1,k)fi+1,t,kt+sumi,t搜就行了。
D a y 2 Day2 Day2
T1:
简单模拟,然后挂完了。。。
原因如下:
1.没考虑第一个数为负的情况。
2.没考虑只有常数的情况。
3.没考虑顺序可能不按从高到低排。
4.明明加了 l o n g   l o n g long\ long long long输出却忘了用 l l d lld lld
对模拟使用炎拳吧。
请添加图片描述
T2:
一看范围,需要 O ( n ) O(n) O(n) O ( n l o g n ) O(nlogn) O(nlogn)算法。再观察题目要求,发现对同一左端点,合法区间的右端点也在右边的一个区间内,而且区间的左右端点一定是随左端点移动单调右移,那么可以指针维护。 h h h表示到右边第一个合法的位置或第一个有数超出范围的位置, t t t表示 t + 1 t+1 t+1就会超出数范围的位置,每次的答案就是
t − h + 1 t-h+1 th+1。对于移动就删除那个数,按定义移动指针即可。
记得预处理细节。。。被预处理直接卡掉60pts。

h=1;t=0;
for(int i=1;i<=k;i++) {Read(l[i]),Read(r[i]);if(!l[i]) tmp++;} //如果左端点为0说明一开始就满足答案
tmp+=in(cnt1[a[1]]+1,l[a[1]],r[a[1]])-in(cnt1[a[1]],l[a[1]],r[a[1]]);cnt1[a[1]]++; //加入1
for(int i=1;i<=n;i++)
{
	for(;h<i;cnt1[a[++h]]++) tmp+=in(cnt1[a[h+1]]+1,l[a[h+1]],r[a[h+1]])-in(cnt1[a[h+1]],l[a[h+1]],r[a[h+1]]); //i-1不在h里就加上,防止下面删除本来没有的数。
	if(i!=1) tmp+=in(cnt1[a[i-1]]-1,l[a[i-1]],r[a[i-1]])-in(cnt1[a[i-1]],l[a[i-1]],r[a[i-1]]),cnt1[a[i-1]]--,cnt2[a[i-1]]--; //删除i-1
	for(;(h<=n&&cnt1[a[h]]<=r[a[h]]&&tmp!=k);cnt1[a[++h]]++) tmp+=in(cnt1[a[h+1]]+1,l[a[h+1]],r[a[h+1]])-in(cnt1[a[h+1]],l[a[h+1]],r[a[h+1]]); //如果没满足所有条件或加爆就一直加
	if(t<h-1) t=h-1,memcpy(cnt2,cnt1,sizeof(cnt2)),cnt2[a[h]]--;
	for(;t<n&&cnt2[a[t+1]]+1<=r[a[t+1]];cnt2[a[++t]]++); //如果没加爆就一直加
	ans+=t-h+1;
}

T3:
就是搜索,按要求搜就行,考场时间不够没写完。
不过写完也没分,数据有问题。。。都要加二。
而且数据实在是水的可以, p , q p,q pq两人一定在 s s s的同一边并且 s s s一定会往远离两人的位置跑,所以输出 min ⁡ ( d i s s , p , d i s s , q ) × 3 + 2 \min(dis_{s,p},dis_{s,q})\times 3+2 min(diss,p,diss,q)×3+2就能 A A A了。。。

总结:速度与准确度都需提高。
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值