社区讨论
请求卡常数
学术版参与者 7已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mhz4dpb0
- 此快照首次捕获于
- 2025/11/15 01:16 3 个月前
- 此快照最后确认于
- 2025/11/16 14:21 3 个月前
模拟赛,我不知道原题。我场上 93 分,终于卡到了 96 分,不会卡了。有没有大手子帮帮我卡场/哭哭
CPP#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 8e5+5;
int n,op,a[N];
struct fenwick {
int bit[N];
void init(){
memset(bit,0,sizeof bit);
}
inline void M(int p,int v=1){
while (p<N){
bit[p]+=v,p+=p&-p;
}
}
inline int Q(int p){
if (p<0) return 0;
int res=0;
while (p){
res+=bit[p],p-=p&-p;
}
return res;
}
} t;
struct Sub1 {
int ans[N],ls[N],tot;
int gt(int x){
return lower_bound(ls+1,ls+1+tot,x)-ls;
}
void solve(){
t.init();
for (int i=1; i<=n; i++) ans[i]=0;
for (int i=1; i<=n; i++){
ls[++tot]=a[i]-i;
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=1; i<=n; i++){
ans[i]+=t.Q(gt(a[i]-i)-1);
t.M(gt(a[i]-i));
}
tot=0,t.init();
for (int i=1; i<=n; i++){
ls[++tot]=a[i]+i;
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=n; i; i--){
ans[i]+=t.Q(gt(a[i]+i)-1);
t.M(gt(a[i]+i));
}
for (int i=1; i<=n; i++){
cout<<ans[i]+1<<"\n";
}
}
} s1;
struct Sub2 {
int ans[N],ls[N],tot,b[N];
int gt(int x){
return lower_bound(ls+1,ls+1+tot,x)-ls;
}
void cal(int x){
tot=0,t.init();
for (int i=1; i<=n; i++){
b[i]=a[i]+abs(i-x);
ls[++tot]=b[i];
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=1; i<=n; i++){
t.M(gt(b[i]),1);
}
for (int i=1; i<=n; i++){
ans[i]=max(ans[i],t.Q(gt(b[i])-1));
}
}
int cur[N];
void sol(){
for (int i=1; i<=n; i++) cur[i]=0;
t.init(),tot=0;
// 外面
for (int i=1; i<=n; i++){
ls[++tot]=a[i];
ls[++tot]=a[i]+i-1;
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=1; i<=n; i++){
t.M(gt(a[i]),1);
}
cur[1]+=t.Q(gt(a[1])-1);
t.M(gt(a[2]),-1);
for (int i=2,j=3; i<=n; i++,j+=2){
cur[i]+=t.Q(gt(a[i]+i-1)-1);
if (j<=n) t.M(gt(a[j]),-1);
if (j+1<=n) t.M(gt(a[j+1]),-1);
}
// 左边
t.init(),tot=0;
for (int i=1; i<=n; i++){
ls[++tot]=a[i]+i;
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=2; i<=n; i++){
cur[i]+=t.Q(gt(a[i]+i)-1);
t.M(gt(a[i]+i));
}
// 右边
t.init(),tot=0;
for (int i=1; i<=n; i++){
ls[++tot]=a[i]-i;
}
sort(ls+1,ls+1+tot);
tot=unique(ls+1,ls+1+tot)-ls-1;
for (int i=n,j=n; i>1; i--){
while (j>=2*i-1){
t.M(gt(a[j]-j),-1);
j--;
}
cur[i]+=t.Q(gt(a[i]-i)-1);
t.M(gt(a[i]-i));
}
// max
for (int i=1; 2*i-1<=n; i++){
ans[i]=max(ans[i],cur[i]);
}
}
void solve(){
cal(1),cal(n);
sol();
reverse(a+1,a+1+n);
reverse(ans+1,ans+1+n);
sol();
reverse(ans+1,ans+1+n);
for (int i=1; i<=n; i++){
cout<<ans[i]+1<<"\n";
}
}
} s2;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
freopen("marathon.in","r",stdin);
freopen("marathon.out","w",stdout);
cin>>n>>op;
for (int i=1; i<=n; i++){
cin>>a[i];
}
if (op==1){
s1.solve();
}
else{
s2.solve();
}
return 0;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...