社区讨论

mxqz 卡常

CF1946F Nobody is needed参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@luj6ix66
此快照首次捕获于
2024/04/03 10:18
2 年前
此快照最后确认于
2024/04/03 10:41
2 年前
查看原帖
c++20 能过,17 就死活被卡常。然后洛谷交不了 c++20。
感觉 vector 并不在复杂度瓶颈上,火车头未果,求大佬救救。
双 log 开 1e6,74 shaber。
CPP
#include<bits/stdc++.h>
#define il inline
using namespace std;
il int read()
{
    int xr=0,F=1; char cr;
    while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
    while(cr>='0'&&cr<='9') 
        xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
    return xr*F;
}
typedef long long ll;
const int N=1e6+5;
int n,p[N],pos[N];
ll ans[N],f[N];
struct node{int l,r,id;};
vector<node> q[N];
vector<int> P[N],d[N];
struct BIT
{
    ll tr[N];
    il void add(int x,ll k) {for(;x<=n;x+=x&-x) tr[x]+=k;}
    il ll query(int x) {ll res=1;for(;x;x-=x&-x) res+=tr[x];return res;}
    il ll ask(int l,int r) {return query(r)-query(l-1);}
}tr;
il void solve()
{
    n=read(); int Q=read();
    for(int i=1;i<=n;i++) p[i]=read(),pos[p[i]]=i,tr.tr[i]=0,q[i].clear(),d[i].clear(),P[i].clear();
    for(int i=1;i<=n;i++)
        for(int j=1;j*i<=n;j++) d[j*i].push_back(i);
    for(int i=1;i<=Q;i++)
    {
        int l=read(),r=read();
        q[l].push_back({l,r,i});
    }
    for(int i=n;i;i--)
    {
        int x=p[i];
        vector<int> v;
        for(auto x:d[p[i]]) P[x].push_back(p[i]);
        for(auto x:P[p[i]]) v.push_back(pos[x]);
        sort(v.begin(),v.end());
        for(auto x:v) f[x]=0;
        f[i]=1;
        // for(auto x:v) c out<<x<<" "; cout<<endl;
        for(auto x:v) 
            for(auto y:P[p[x]]) if(pos[y]>x) f[pos[y]]+=f[x];
        for(auto x:v) tr.add(x,f[x]);
        for(auto [l,r,id]:q[i]) ans[id]=tr.ask(l,r);
    }
    for(int i=1;i<=Q;i++) printf("%lld ",ans[i]); printf("\n");
}
signed main() {int T=read();while(T--) solve();}
/*
https://www.luogu.com.cn/problem/CF1946F
start thinking at 08:30
start coding at 09:15
*/
/*
1
3 3
3 2 1
1 2
1 3
2 3
*/

回复

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

正在加载回复...