社区讨论

40pts TLE #8-#11 & #13-#20 求帮忙卡常

P11455[USACO24DEC] Cowdependence G参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mlq63f6g
此快照首次捕获于
2026/02/17 13:33
前天
此快照最后确认于
2026/02/18 11:32
昨天
查看原帖
提交记录:https://www.luogu.com.cn/record/263177332
思路和第一篇题解差不多。如果用 vector 实现的话更慢
CPP
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
int ans[100001],n,a[100001],tmp[100001];
int f(int x) {
    if(ans[x]) return ans[x];
    int i,cnt=0,len;
    memset(tmp,-1,sizeof(tmp));
    for(i=1;i<=n;i++) if(i>tmp[a[i]]) {cnt++;tmp[a[i]]=i+x;}
    return cnt;
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);
    int i,l,r,mid,x;
    cin>>n;
    for(i=1;i<=n;i++) cin>>a[i];
    x=min(n,2*(int)sqrt(n*log(n)/log(2)));
    for(i=1;i<x;i++) ans[i]=f(i);
    while(x<=n) {
        ans[x]=f(x);l=x;r=n;
        while(l<r) {
            mid=(l+r+1)>>1;
            if((ans[mid]=f(mid))==ans[x]) l=mid;
            else r=mid-1;
        }
        for(i=x+1;i<=l;i++) ans[i]=ans[x];
        x=l+1;
    }
    for(i=1;i<=n;i++) cout<<ans[i]<<'\n';
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...