zoukankan      html  css  js  c++  java
  • 牛客网比赛216C-小K的疑惑-题解

    题目地址【IN

    写了一遍就过了,ヾ(◍°∇°◍)ノ゙凯森

    题意简述

    给你一棵nn个节点的树,每条边有边权,定义dis(i,j)dis(i,j)为点iijj的距离模22后的值,问你有多少个三元组(i,j,k)(i,j,k)满足1i,j,kn1leq i,j,kleq ndis(i,j)=dis(j,k)=dis(i,k)dis(i,j)=dis(j,k)=dis(i,k)

    数据范围n1e4,0val233nleq 1e4,0leq valleq 233


    我们可以发现(a+b)%2=(a%2 xor b%2)(a+b)\%2=(a\%2 xor b\%2)

    那么dis(i,j)dis(i,j)就变成了iji ightarrow j的路径权值异或和。

    那么,由于a xor a=0a xor a=0,异或是可以相消的,所以我们可以dfsdfs处理一个数组d[i]d[i],表示节点ii到根(这里默认根为11号点)的路径上的异或和,那么dis(i,j)=d[i] xor d[j]dis(i,j)=d[i] xor d[j],原因如下图:

    eg

    616 ightarrow 1的路径上有12,23,34,461-2,2-3,3-4,4-6

    717 ightarrow 1的路径上有12,23,35,571-2,2-3,3-5,5-7

    那么将d[6] xor d[7]d[6] xor d[7],其中重复的边12,231-2,2-3就会被异或掉,然后剩下的就变成了64,43,35,57=dis(6,7)6-4,4-3,3-5,5-7=dis(6,7)了。

    所以dis(i,j)=d[i] xor d[j]dis(i,j)=d[i] xor d[j]

    那么由于只有d[i]=d[j]=d[k]d[i]=d[j]=d[k]的时候才会成为一个合法的三元组,而d[i]d[i]的值只有0,10,1,所以统计一下个数,我们令cnt0,cnt1cnt_0,cnt_1分别为0,10,1的个数,那么答案就为(cnt0)3+(cnt1)3(cnt_0)^3+(cnt_1)^3(由于i,j,ki,j,k可以交换顺序,所以方案数为个数的三次方)。

    代码非常简单:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int M=1e5+10;
    
    struct ss{
    	int to,last,len;
    	ss(){}
    	ss(int a,int b,int c):to(a),last(b),len(c){}
    }g[M<<1];
    int head[M],cnt;
    void add(int a,int b,int c){
    	g[++cnt]=ss(b,head[a],c&1);head[a]=cnt;
    	g[++cnt]=ss(a,head[b],c&1);head[b]=cnt;
    }
    ll rec[2];
    void dfs(int a,int b,int val){
    	++rec[val];
    	for(int i=head[a];i;i=g[i].last){
    		if(g[i].to==b) continue;
    		dfs(g[i].to,a,val^g[i].len);
    	}
    }
    ll cude(ll a){return a*a*a;}
    int a,b,c,n;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<n;i++){
    		scanf("%d%d%d",&a,&b,&c);
    		add(a,b,c);
    	}
    	dfs(1,0,0);
    	printf("%lld
    ",cude(rec[0])+cude(rec[1]));
    	return 0;
    }
    
  • 相关阅读:
    springboot2.1.3使用jdbcTemplate
    httpclient4.5.2 Post请求支持http和https
    springboot2.1.3+spring-session2.1.4分库处理
    mysql查看当前实时连接数
    springboot2.1.3+Junit4 单元测试
    subprocess.Popen()详解
    matplotlib 设置图形大小时 figsize 与 dpi 的关系
    matplotlib之subplot
    matplotlib.pyplot.plot()参数详解
    plt.rcParams属性总结
  • 原文地址:https://www.cnblogs.com/VictoryCzt/p/10053390.html
Copyright © 2011-2022 走看看