首页 > 其他分享 >【题解】Race

【题解】Race

时间:2022-09-23 12:02:51浏览次数:54  
标签:int 题解 dfs llt trie Race sid size

今天教练说让刷题,我去刷了。

刷到这道题,挺好的。

\(n\) 个同学打了 \(2^{m}\) 次比赛,
同学 \(j\) 第 \(i\) 次比赛的成绩是 \(a_j \operatorname{xor} i\),
每次获得的积分是排名 \(x\) 的平方。
输出每个同学积分和模 \(1e9+7\) 后的的异或和。

我们考虑:

  1. 一个人的积分由排名比起靠前的人的点对提供;

  2. 很显然一个人一定会败给某个人 \(2^{m-1}\) 次,再胜某个人 \(2^{m-1}\) 次 。

那就可以搞 \(\texttt{Trie树}\) 了!

首先把所有的值插进去。

然后开始 \(\texttt{dfs}\) ,一边记录点对数和之前与之在不同子树的数的个数。

#include <iostream>
#define llt long long int
const int moyn = 1e9+7;
const int N = 1e7+10;
int n, m;
int trie[N][2];
int trie_tot;
llt size[N];
llt ans;
#define lid(u) trie[u][0]
#define rid(u) trie[u][1]
void insert(int x) {
	int u = 0, sid;
	for(register int i = m-1;i >= 0;--i) {
		sid = (x>>i)&1;
		if(!trie[u][sid]) 
			trie[u][sid] = ++trie_tot;
		u = trie[u][sid];
		++size[u];
	}
}
void dfs(int u,llt sum,llt num) {
	if(lid(u)) 
		dfs(lid(u),(sum+size[rid(u)]*size[rid(u)]%moyn*(1LL<<(m-1))%moyn+size[rid(u)]*num%moyn*(1LL<<(m-1))%moyn)%moyn,num+size[rid(u)]);
	if(rid(u)) 
		dfs(rid(u),(sum+size[lid(u)]*size[lid(u)]%moyn*(1LL<<(m-1))%moyn+size[lid(u)]*num%moyn*(1LL<<(m-1))%moyn)%moyn,num+size[lid(u)]);
	if(!lid(u)&&!rid(u)) 
		ans ^= sum;
}
int a;
int main() {
	scanf("%d %d",&n,&m);
	for(register int i = 1;i <= n;++i) {
		scanf("%d",&a);
		insert(a);
	}
	dfs(0,0LL,0LL);
	printf("%lld\n",ans);
	return 0;
}

标签:int,题解,dfs,llt,trie,Race,sid,size
From: https://www.cnblogs.com/bikuhiku/p/Race-sol.html

相关文章

  • 题解 P7870 「Wdoi-4」兔已着陆
    不用真的模拟一个个的蛋糕。直接将一个区间压入栈中即可。取出来时,注意将断的区间一分为二重新塞入。#include<bits/stdc++.h>usingnamespacestd;#defineN1000010......
  • CF1430G 题解
    传送门题意给定一个有向无环图,每条边有权重\(w_i\),给每个点分配权值\(a_i\),使每个点的权值大于其所有出点。设每条边的权值为\(a_{x_i}-a_{b_i}\)。输出一种分配方案,......
  • 题解【P5588 hegm 爬树】
    题目传送门。来一个不一样的工程做法。我们直接对于每一个颜色\(i\)建虚树,显然可以通过树形DP来判断颜色\(i\)的节点是否在一条路径上。原题。然后存一下这条路径......
  • AtCoder Beginner Contest 043 题解
    欢迎来到我的算法小屋前言 TaskNameAChildrenandCandies(ABCEdit)BUnhappyHacking(ABCEdit)CBeTogetherDUnbalancedA1)题目描述2......
  • CF1540B Tree Array 题解
    CF1540BTreeArray给定一棵\(n\)个节点的树。对于这棵树,我们通过下列方法来生成一个序列:等概率选择这\(n\)个节点中的一个节点,并对这个节点打上标记(初始时没有节......
  • Dev C++中窗口输出中文问题解决
    1、window+R+regedit调出注册表  2、点击Dec_Dev-Cpp_ConsolePauser.exe 3、鼠标左键双击“CodePage”,弹出设置页面。选择“十进制”,输入65001  4、右键点......
  • 【题解】ARC139D Priority Queue 2
    ?思路来源题意假设初始时有一个长度为\(N\),值域为\(M\)的数组\(A\)。现在要进行\(K\)次操作,每次操作从\([1,M]\)中选取一个数,并将其加入\(A\)中。单次操作完......
  • 牛客题解 Channels
    链接:https://ac.nowcoder.com/acm/problem/201606来源:牛客网题解作者岛田小雅要求一段区间内的有效时间总和,第一反应用前缀和。要求\(l\)和\(r\)之间有效时间的和......
  • CF1446D1 题解
    传送门题意给定序列\(a_1,a_2,...,a_n\),求最长的满足区间众数有至少两种的区间长度。\(n≤2×10^5,1≤a_i≤min(100,n)\)题解首先,若整个序列有至少两种众数,则答案为......
  • 题解【CF1307F Cow and Vacation】
    感觉CF*3300的难度没有这么简单吧(题目传送门。考虑\(\texttt{Bessie}\)运动的过程:起点\(\to\)休息点$\to$\(\cdots\)\(\to\)休息点\(\to\)终点。考虑我们......