20210911
D
a
y
2
Day2
Day2裂开了。
Day1 | T1 | T2 | T3 |
---|---|---|---|
预测 | 100 | 100 | 40 |
一测 | 100 | 100 | 40 |
Day2 | T1 | T2 | T3 |
---|---|---|---|
预测 | 100 | 100 | 0 |
一测 | 0 | 40 | 0 |
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
i−1列选了
j
j
j个数,还要选
k
k
k个数的最大值。可以发现若上一列选了
j
j
j个数,则本列至少该选
max
(
j
−
1
,
0
)
\max(j-1,0)
max(j−1,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(j−1,0)maxmin(n−i+1,k)fi+1,t,k−t+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
t−h+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
p,q两人一定在
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了。。。
总结:速度与准确度都需提高。