rt,如下代码被卡常了,求如何减小常数。
题目 1≤n,m≤105,1≤u,v≤n,0≤w≤230 。
本蒟蒻认为没有写出死循环,为什么 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;
}