OwO http://acm.hdu.edu.cn/showproblem.php?pid=6059

  由于每个数字最多是30位,枚举数字每一位考虑,

  建一棵记录前缀(位的前缀,比如10拆成1010,那么就把1010从前往后插入这个字典树中)的字典树,

  nxt记录其后继,gcnt记录这个节点添加的个数,ng代表不符合要减去的个数(后文会提到)

  tol[i][j]代表第i位的j(j=0,1)当前数量

  枚举Ak的每一位,对于Ak的第t位(记作Ak[t])

  1. 如果Ak[t]==1,那么对答案产生贡献的Ai[t]和Aj[t]必然为0,而且Ai[0]~Ai[t-1]必然和Ak[0]~Ak[t-1]对应相等。

   记Ak[t]对应地节点为chil,与其同父亲的另一个节点为xchil

   1) Ak[t]加入后,第一部分要的贡献为 (tree[xchil].gcnt-1)*tree[xchil].gcnt/2 ,这是显然的,就是Ai[0]~Ai[t-1]和Ak[0]~Ak[t-1]和Aj[0]~Aj[t-1]全都相等情况

   2) 第二部分是 tree[xchil].gcnt*(tol[i][1-s[i]]-tree[xchil].gcnt)-tree[xchil].ng ,减号前面的是Ai[0]~Ai[t-1]和Ak[0]~Ak[t-1]相等,且Ak[0]~Ak[t-1]和Aj[0]~Aj[t-1]有所不同的积(这样算出来有不合法的),因为有不合法所以要减去不合法的部分也就是tree[xchi].ng

   而tree[xchi].ng的维护的话,每次加入一个点,那么这个点必然会在当前节点产生 tol[i][s[i]]-tree[chil].gcnt 点不合法的贡献,(Ai[0]~Ai[t-1]和Ak[0]~Ak[t-1]不相等,Ak[0]~Ak[t-1]和Aj[0]~Aj[t-1]相等这种不合法的情况)

  2. 如果Ak[i]==0的话,那么答案也类似可以得到

  

  (思路来自队友DorMOUSENone(队友真是太强辣))

  

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std; typedef long long ll; const int M=5e5+55;
const int N=33;
const int infn=30; struct Node
{
int nxt[2],gcnt;
ll ng;
} tree[M*N]; int n,tnum;
ll ans;
int s[N],tol[N][2]; void insert()
{
int rt=0,i,j,chil,xchil;
for(i=infn-1;i>=0;i--)
{
if(tree[rt].nxt[s[i]]==0)
tree[rt].nxt[s[i]]=++tnum;
chil=tree[rt].nxt[s[i]]; //children for s[i]
xchil=tree[rt].nxt[1-s[i]]; //another children
if(xchil)
ans+=1ll*(tree[xchil].gcnt-1)*tree[xchil].gcnt/2+1ll*tree[xchil].gcnt*(tol[i][1-s[i]]-tree[xchil].gcnt)-tree[xchil].ng;
tree[chil].ng+=tol[i][s[i]]-tree[chil].gcnt;
tree[chil].gcnt++;
tol[i][s[i]]++;
rt=chil;
}
} void init()
{
memset(tree,0,(n+4)*N*sizeof(Node));
memset(tol,0,sizeof(tol));
tnum=0;
ans=0;
} void solve()
{
int i,j,now;
for(i=1;i<=n;i++)
{
scanf("%d",&now);
for(j=0;j<infn;j++)
{
s[j]=now&1;
now>>=1;
}
insert();
}
} int main()
{
int T,now;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
init();
solve();
printf("%lld\n",ans);
}
return 0;
} /* 200
4
1 3 0 0 */

  

327MS代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std; namespace fastIO {
#define BUF_SIZE 100000
//fread -> read
bool IOerror = 0;
inline char nc() {
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if(p1 == pend) {
p1 = buf;
pend = buf + fread(buf, 1, BUF_SIZE, stdin);
if(pend == p1) {
IOerror = 1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline void read(int &x) {
char ch;
while(blank(ch = nc()));
if(IOerror)
return;
for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
}
#undef BUF_SIZE
};
using namespace fastIO; typedef long long ll; const int M=5e5+55;
const int N=33;
const int infn=30; struct Node
{
int nxt[2],gcnt;
int ng;
} tree[M*N]; int n,tnum;
ll ans;
int s[N],tol[N][2]; void insert()
{
int rt=0,i,j,chil,xchil;
for(i=infn-1;i>=0;i--)
{
if(tree[rt].nxt[s[i]]==0)
tree[rt].nxt[s[i]]=++tnum;
chil=tree[rt].nxt[s[i]];
xchil=tree[rt].nxt[1-s[i]];
if(xchil)
ans+=1ll*(tree[xchil].gcnt-1)*tree[xchil].gcnt/2+1ll*tree[xchil].gcnt*(tol[i][1-s[i]]-tree[xchil].gcnt)-tree[xchil].ng;
tree[chil].ng+=tol[i][s[i]]-tree[chil].gcnt;
tree[chil].gcnt++;
tol[i][s[i]]++;
rt=chil;
}
} void init()
{
memset(tree,0,(n+4)*N*sizeof(Node));
memset(tol,0,sizeof(tol));
tnum=0;
ans=0;
} void solve()
{
int i,j,now;
for(i=1;i<=n;i++)
{
read(now);
for(j=0;j<infn;j++)
{
s[j]=now&1;
now>>=1;
}
insert();
}
} int main()
{
int T,now;
read(T);
while(T--)
{
read(n);
init();
solve();
printf("%lld\n",ans);
}
return 0;
}

  

hdu 6059 Kanade's trio的更多相关文章

  1. HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3

    思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Conte ...

  2. hdu 6059 Kanade's trio(字典树)

    Kanade's trio Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  3. hdu6059 Kanade's trio 字典树+容斥

    转自:http://blog.csdn.net/dormousenone/article/details/76570172 /** 题目:hdu6059 Kanade's trio 链接:http:/ ...

  4. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

  5. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  6. HDU 6059 17多校3 Kanade's trio(字典树)

    Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) satisfy ...

  7. hdu 6058 Kanade's sum(模拟链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  8. HDU 6057 Kanade's convolution(FWT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6057 [题目大意] 有 C[k]=∑_(i&j=k)A[i^j]*B[i|j] 求 Ans ...

  9. HDU 6058 Kanade's sum 二分,链表

    Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...

随机推荐

  1. vm下centos7 mini版 NAT模式下配置静态IP

    1.查看虚拟机的默认网关和子网掩码 a.vm菜单栏点击编辑->虚拟网络编辑器 b.选择VMnet8,点击NAT设置,查看子网掩码.网关IP                2. 修改服务器的网络配 ...

  2. Number of Containers ZOJ - 3175(数论题)

    Problem Description For two integers m and k, k is said to be a container of m if k is divisible by  ...

  3. # Clion中编译多个cpp(实现单文件编译)

    Clion中编译多个cpp(实现单文件编译) 在不做任何配置情况下,Clion工程下只能有一个main()函数,新建多个cpp会导致报main()函数重复定义的错误,所以默认情况下无法在一个工程下编译 ...

  4. paramiko-ssh实例

    import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_k ...

  5. 使用python的ctypes库实现内存的动态申请和释放

    1.申请前内存占用情况 2.申请内存 from ctypes import * import time #在这里申请1G的内存,单位k mem = create_string_buffer(1024* ...

  6. 输出单项链表中倒数第k个结点——牛客刷题

    题目描述: 输入一个单向链表,输出该链表中倒数第k个结点 输入.输出描述: 输入说明:1.链表结点个数 2.链表结点的值3.输入k的值 输出说明:第k个结点指针 题目分析: 假设链表长度为n,倒数第k ...

  7. 嵌入式Linux的计划任务,发送请求记录

  8. singleWsdl和wsdl区别,Axis2和CXF对比

    WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互. 其实WebSer ...

  9. spring-test跟junit结合单元测试获取ApplicationContext实例的方法

    步骤 1.继承AbstractJUnit4SpringContextTests 2.引入ApplicationContext   示例代码:(可以根据name或者类型获取bean) import or ...

  10. postman传数组参数,二维数组,多维数组

    一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,