求如何减小常数
  • 板块学术版
  • 楼主liyixin0514
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/10 10:06
  • 上次更新2023/11/10 14:47:58
查看原帖
求如何减小常数
542128
liyixin0514楼主2023/11/10 10:06

rt,如下代码被卡常了,求如何减小常数。

题目 1≤n,m≤105,1≤u,v≤n,0≤w≤2301\le n , m\le 10^5 , 1\le u , v\le n , 0\le w \le 2^{30} 。

本蒟蒻认为没有写出死循环,为什么 TLE 呢,应该是卡常吧

#include<bits/stdc++.h>
#define ll long long
#define sf scanf
#define pf printf
using namespace std;
const int N=1e5+7;
inline ll read() {
    ll k = 0, f = 1;
    char c = getchar();
    while (!isdigit(c)) {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (isdigit(c)) {
        k = (k << 3) + (k << 1) + (c ^ 48);
        c = getchar();
    }
    return f * k;
}
inline void write(ll x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    if (x > 9)
        write(x / 10);
    putchar((x % 10) ^ 48);
}
int n,m,u,v,w;
ll ans;
bool isans;
vector<pair<int,bool> > to[32][N];
bitset<N> num[32],vi[32];
struct node{
	int s,z;
};
node dfs(int k,int u){
	node y={0,0};
	for(pair<int,bool> h:to[k][u]){
		if(isans) return {0,0};
		int v=h.first,op=h.second;
		if(vi[k][v]==0){
			vi[k][v]=1;
			num[k][v]=num[k][u]^op;
			node x=dfs(k,v);
			y.s+=x.s;
			y.z+=x.z;
		}else{
			if((num[k][v]^num[k][u])!=op){
				isans=1;
				return {0,0};
			}
		}
	}
	if(num[k][u]) y.s++;
	y.z++;
	return y;
}
int main(){
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	n=read();m=read();
	//sf("%d%d",&n,&m);
	int mx=0;
	for(int i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		//sf("%d%d%d",&u,&v,&w);
		if(u==v){
			if(w!=0) isans=1;
			continue;
		}
		int j=0;
		//for(int j=0;j<=30;j++){
		while(w){
			if(w&1){
				mx=max(mx,j);
				to[j][u].push_back({v,1});
				to[j][v].push_back({u,1});
			}else{
				to[j][u].push_back({v,0});
				to[j][v].push_back({u,0});
			}
			j++;
			w>>=1;
		}
		//}
	}
	for(int i=0;i<=mx;i++){
		if(isans){
			write(-1);
			return 0;
		}
		//memset(num[i],-1,sizeof(num[i]));
		for(int j=1;j<=n;j++){
			if(vi[i][j]==0){
				//pf("%d dfs%d\n",i,j);
				vi[i][j]=1;
				num[i][j]=1;
				node p=dfs(i,j);
				if(isans){
					write(-1);
					//pf("-1\n");
					return 0;
				}
				p.s=min(p.s,p.z-p.s);
				ans+=(ll)p.s*(1<<i);
			}
		}
	}
	write(ans);
	//pf("%lld\n",ans);
	return 0;
}
2023/11/10 10:06
加载中...