社区讨论
为什么这么离谱的错误luogu48,CCF64?,
P14362[CSP-S 2025] 道路修复参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhphwic6
- 此快照首次捕获于
- 2025/11/08 07:37 3 个月前
- 此快照最后确认于
- 2025/11/09 02:28 3 个月前
猎奇错误与猎奇得分。
本人将第 行的
if(tot==n+sum-1) break; 打成了 if(tot==n+num-1) break;将第 行的
else if(E[i].w<e[0][j].w) now=1; 打成了 else if(E[i].w<E[j].w) now=1;第一个错误理应有 分 TLE,实际 TLE 分。
第二个错误是双指针遍历了个完全不搭边的数组,结果 luogu 48,CCF 64。
看大家的反馈是 CCF 数据强于 luogu,而我这个错误这么猎奇。为什么直挂了 这么点分,是因为 CCF 为了卡其他错误导致反而提高了我的做法的正确率?
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e6+10;
struct node{
int u,v,w;
}e[20][N],E[N<<1];
int n,m,k,fa[N],c[N],cnt;
long long ans=1000000000000000000LL;
inline bool cmp(node x,node y)
{
return x.w<y.w;
}
inline int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
inline void solve(int S)
{
cnt=0;
for(int i=1;i<=n+100;i++) fa[i]=i;
long long res=0;
int num=0,tot=0,sum=0;
while(S)
{
num++;
// cerr<<S%2;//
if(S%2==1)
{
sum++;
for(int i=1;i<=n;i++)
{
cnt++;
E[cnt]=e[num][i];
}
res+=c[num];
}
S/=2;
}
// cerr<<endl;//
// for(int i=1;i<=m;i++)
// {
// cnt++;
// E[cnt]=e[0][i];
// }
sort(E+1,E+cnt+1,cmp);
// for(int i=1;i<=cnt;i++) cerr<<E[i].u<<" " <<E[i].v<<" "<<E[i].w<<endl;//
int i=0,j=0,now=-1,u,v,w;
while(i<=cnt&&j<=m)
{
if(tot==n+num-1) break;
if(i==cnt) now=2;
else if(j==m) now=1;
else if(E[i].w<e[0][j].w) now=1;
else now=2;
if(now==1) u=E[i].u,v=E[i].v,w=E[i].w,i++;
if(now==2) u=e[0][j].u,v=e[0][j].v,w=e[0][j].w,j++;
int p1=find(u),p2=find(v);
if(p1==p2) continue;
fa[p1]=p2;
res+=(long long)w;
tot++;
}
// cerr<<tot<<"****114514\n";
ans=min(ans,res);
return ;
}
void solve114514()
{
cnt=0;
for(int i=1;i<=n+100;i++) fa[i]=i;
long long res=0;
int num=k,tot=0;
for(int j=1;j<=k;j++)
{
for(int i=1;i<=n;i++)
{
cnt++;
E[cnt]=e[j][i];
}
res+=c[j];
}
for(int i=1;i<=m;i++)
{
cnt++;
E[cnt]=e[0][i];
}
sort(E+1,E+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
if(tot==n+num-1) break;
int p1=find(E[i].u),p2=find(E[i].v);
if(p1==p2) continue;
fa[p1]=p2;
res+=E[i].w;
tot++;
}
ans=min(ans,res);
return ;
}
signed main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=m;i++) cin>>e[0][i].u>>e[0][i].v>>e[0][i].w;
int flag=1;
for(int i=1;i<=k;i++)
{
cin>>c[i];
if(c[i]) flag=0;
bool fff=0;
for(int j=1;j<=n;j++)
{
cin>>e[i][j].w;
e[i][j].u=i+n;
e[i][j].v=j;
if(e[i][j].w==0) fff=1;
}
if(!fff) flag=0;
}
if(flag)
{
solve114514();
cout<<ans<<endl;
return 0;
}
sort(e[0]+1,e[0]+m+1,cmp);
for(int s=0;s<=(1<<k)-1;s++)
{
solve(s);
}
cout<<ans<<endl;
return 0;
}
//4 4 2
//1 4 6
//2 3 7
//4 2 5
//4 3 4
//1 1 8 2 4
//100 1 3 2 4
回复
共 1 条回复,欢迎继续交流。
正在加载回复...