社区讨论
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 并不在复杂度瓶颈上,火车头未果,求大佬救救。
#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 条回复,欢迎继续交流。
正在加载回复...