社区讨论

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 条回复,欢迎继续交流。

正在加载回复...