2313
為什麼會RE?
在本地範測是能通過的,但提交後就完全RE了。理論上來說,是不可能出現RE的情況的。
我甚至把包括輸入後面的所有部分全部註釋掉了,還是會RE。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e7+10;
const ll INF=1e18;
struct edge
{
int u,v,w,nxt;
}e[N<<1];
int head[N],tot;
void add(int u,int v,int w)
{
e[++tot]=edge{u,v,w,head[u]};
head[u]=tot;
}
int n;
int a[N],b[N];
map<int,int> mp;
int idx;
void init(int p)
{
int x=a[p];
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
{
if(!mp[i]) mp[i]=++idx;
add(p,mp[i],0),add(mp[i],p,b[p]);
while(x%i==0) x/=i;
}
if(x>1)
{
if(!mp[x]) mp[x]=++idx;
add(p,mp[x],0),add(mp[x],p,b[p]);
}
}
ll dis[N],vis[N];
priority_queue<pair<ll,int> > q;
void dij()
{
for(int i=1;i<=idx;i++) dis[i]=INF;
q.push({0,0});
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;ll w=e[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v]) q.push({-dis[v],v});
}
}
}
}
ll calc(int p)
{
int x=a[p];ll res=INF;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
{
res=min(res,dis[mp[i]]);
while(x%i==0) x/=i;
}
if(x>1) res=min(res,dis[mp[x]]);
if(res==INF) return -1;
return res;
}
int main()
{
printf(">_<");
// scanf("%d",&n),idx=n+1;
// for(int i=1;i<=n;i++) scanf("%d",&a[i]);
// for(int i=1;i<=n;i++) scanf("%d",&b[i]);
// scanf("%d",&a[0]);
// for(int i=0;i<=n;i++) init(i);
// dij();
// for(int i=1;i<=n;i++) printf("%lld ",calc(i));
return 0;
}
Comments:
#1 Fixed.
原本題目的 checker 沒有設定好,現已修正。