社区讨论
CCF部分分似乎没有极端数据
学术版参与者 5已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi0wv5
- 此快照首次捕获于
- 2025/11/08 07:40 3 个月前
- 此快照最后确认于
- 2025/11/08 07:40 3 个月前
本人在CSP-S考场上写下如下代码:
C/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k;
template<typename T>
inline void read(T &x) {
x = 0;
register char c = getchar();
register short f = 1;
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
x *= f;
}
template <typename T, typename... Args>
inline void read(T &x, Args &...temps)
{
read(x), read(temps...);
}
void write(int x) {
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10;
x /= 10;
} while (x);
while (top) putchar(sta[--top] + '0');
}
const int N=1e4+5;
struct nod{
int u,v,w;
}e[4000007],ee[4000007],eee[4000007];
bool cmp(nod x,nod y){
return x.w<y.w;
}
int cnt=0;
int f[N];
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
int ans=0;
int b[N];
int lt[15][N];
void mj(int x){
if(x>k){
int ns=n;
for(int i=1;i<=cnt;i++){
eee[i].u=ee[i].u;
eee[i].v=ee[i].v;
eee[i].w=ee[i].w;
}
int cntt=cnt;
int gz=0;
for(int i=1;i<=k;i++){
if(b[i]){
ns++;
gz+=lt[i][0];
for(int j=1;j<=n;j++){
eee[++cntt].u=ns;
eee[cntt].v=j;
eee[cntt].w=lt[i][j];
}
}
// cout<<b[i];
}
// cout<<'b'<<endl;
// cout<<gz<<endl;
for(int i=1;i<=ns;i++) f[i]=i;
sort(eee+1,eee+1+cntt,cmp);
// for(int i=1;i<=cntt;i++) cout<<eee[i].u<<' '<<eee[i].v<<' '<<eee[i].w<<'\n';
// cout<<gz<<endl;
int opw=0;
for(int i=1;i<=cntt;i++){
int fx=find(eee[i].u);
int fy=find(eee[i].v);
if(fx==fy) continue;
f[fx]=fy;
opw++;
gz+=eee[i].w;
if(opw==ns-1) break;
}
// cout<<gz<<endl;
ans=min(ans,gz);
return;
}
b[x]=1;
mj(x+1);
b[x]=0;
mj(x+1);
}
void solve()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
e[i].u=u;
e[i].v=v;
e[i].w=w;
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++){
int fx=find(e[i].u);
int fy=find(e[i].v);
// cout<<i;
if(fx==fy) continue;
f[fx]=fy;
ee[++cnt].u=e[i].u;
ee[cnt].v=e[i].v;
ee[cnt].w=e[i].w;
// cout<<e[i].u<<' '<<e[i].v<<' '<<e[i].w<<endl;
ans+=e[i].w;
if(cnt==n-1) break;
}
// cout<<ans;
for(int i=1;i<=k;i++){
cin>>lt[i][0];
for(int j=1;j<=n;j++){
cin>>lt[i][j];
}
}
mj(1);
cout<<ans;
}
signed main(){
// freopen("road3.in","r",stdin);
// freopen("road4.out")
int T=1;
// read(T);
while(T--){
solve();
}
return 0;
}
在洛谷获得了72分,原因是我会加k个点,数组却只开了1e4+5,开成1e4+15即可得80分。
也就是说,碰到n=10000,k=5的点,理论我会爆。
然而我却获得了80分。
因此CCF部分分似乎没有极端数据。
望周知。
回复
共 4 条回复,欢迎继续交流。
正在加载回复...