今天热身考到FFT,完全忘光了,模板敲错了。。。
晚上温习下以前的题目

这题就是从最大值每次分割现在的区间,这样递归的区间最大值会更小,对于每种最大值都是卷积做

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 60005;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 int n;
int a[MAXN];
ll cnt[MAXN];
vector<int> po[MAXN]; // x的所有位置 /*********Segtree************/
int tree[MAXN<<2];
void Build(int l,int r,int rt){
if(l == r) {
tree[rt] = a[l]; return;
}
int m = (l+r)>>1;
Build(lson); Build(rson);
tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}
int Query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R) return tree[rt];
int m = (l+r)>>1;
int ans = -1;
if(L <= m) ans = max(ans, Query(L,R,lson) );
if(R > m) ans = max(ans, Query(L,R,rson) );
return ans;
}
/***************FFT**********/
int A[MAXN<<2], B[MAXN<<2]; int C[MAXN<<2];
namespace FFT {
int pos[MAXN<<2];
struct comp {
double r , i ;
comp ( double _r = 0 , double _i = 0 ) : r ( _r ) , i ( _i ) {}
comp operator + ( const comp& x ) {
return comp ( r + x.r , i + x.i ) ;
}
comp operator - ( const comp& x ) {
return comp ( r - x.r , i - x.i ) ;
}
comp operator * ( const comp& x ) {
return comp ( r * x.r - i * x.i , i * x.r + r * x.i ) ;
}
comp conj () {
return comp ( r , -i ) ;
}
} A[MAXN<<2] , B[MAXN<<2] ; const double pi = acos ( -1.0 ) ;
void FFT ( comp a[] , int n , int t ) {
for ( int i = 1 ; i < n ; ++ i ) if ( pos[i] > i ) swap ( a[i] , a[pos[i]] ) ;
for ( int d = 0 ; ( 1 << d ) < n ; ++ d ) {
int m = 1 << d , m2 = m << 1 ;
double o = pi * 2 / m2 * t ;
comp _w ( cos ( o ) , sin ( o ) ) ;
for ( int i = 0 ; i < n ; i += m2 ) {
comp w ( 1 , 0 ) ;
for ( int j = 0 ; j < m ; ++ j ) {
comp& A = a[i + j + m] , &B = a[i + j] , t = w * A ;
A = B - t ;
B = B + t ;
w = w * _w ;
}
}
}
if ( t == -1 ) for ( int i = 0 ; i < n ; ++ i ) a[i].r /= n ;
}
void mul ( int *a , int *b , int *c ,int k) {
int i , j ;
for ( i = 0 ; i < k ; ++ i ) A[i] = comp ( a[i] , b[i] ) ;
j = __builtin_ctz ( k ) - 1 ;
for ( int i = 0 ; i < k ; ++ i ) {
pos[i] = pos[i >> 1] >> 1 | ( ( i & 1 ) << j ) ;
}
FFT ( A , k , 1 ) ;
for ( int i = 0 ; i < k ; ++ i ) {
j = ( k - i ) & ( k - 1 ) ;
B[i] = ( A[i] * A[i] - ( A[j] * A[j] ).conj () ) * comp ( 0 , -0.25 ) ;
}
FFT ( B , k , -1 ) ;
for ( int i = 0 ; i < k ; ++ i ) {
c[i] = ( long long ) ( B[i].r + 0.5 ) ;
}
}
}
/**************cdq***********/
void cdq(int l,int r){
if(l > r) return;
if(l == r) { cnt[1]++; return; }
int num = Query(l,r,1,n,1);
int st = lower_bound(po[num].begin(), po[num].end(), l) - po[num].begin();
int ed = upper_bound(po[num].begin(), po[num].end(), r) - po[num].begin()-1;
int m = 0;
for(int i = st; i <= ed+1; ++i){
int le = st==i? l-1 : po[num][i-1];
int re = ed+1==i? r+1 : po[num][i];
A[m++] = re-le;
}
int len = 1;
while(len < 2*m) len<<=1;
for(int i = 0; i < m; ++i) B[i] = A[m-1-i];
for(int i = m; i < len; ++i) A[i]=0, B[i]=0;
FFT::mul(A,B,C,len);
for(int i = 0; i < m; ++i){
cnt[i+1] += C[i+m];
} for(int i = st; i <= ed+1; ++i){
int le = st==i? l-1 : po[num][i-1];
int re = ed+1==i? r+1 : po[num][i];
cdq(le+1, re-1);
}
}
int main(){
int T; scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(cnt,0,sizeof(cnt));
for(int i = 1; i <= n; ++i) po[i].clear(); for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]); po[a[i]].push_back(i);
}
Build(1,n,1);
cdq(1,n); ll ans = 0;
for(int i = 1; i <= n; ++i) ans += cnt[i]^i;
printf("%lld\n",ans);
}
return 0;
}

hdu5751 Eades的更多相关文章

  1. hdu 5751 Eades

    题意:对于整数序列$A[1...n]$定义$f(l, r)$为区间$[l, r]$内等于区间最大值元素的个数,定义$z[i]$为所有满足$f(l, r)=i$的区间总数.对于所有的$1 \leq i ...

  2. Fast Fourier Transform

    写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 挖个大坑,以后再补.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34 ...

  3. 套题 bestcoder 84

    A题:Aaronson 静下心来观察就会发现1.如果m大于等于n的位数,那么n直接写成二进制形式就是最优解形式2.如果m小于n的位数,那么贪心地使得高位尽可能地多消掉n的值,因为高位少写一个数就意味着 ...

  4. Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)

    1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...

随机推荐

  1. MySQL系统临时表、用户临时表

    MySQL临时表分为系统使用的临时表和用户使用的临时表. 系统使用的临时表是指MySQL在执行某些SQL语句时需要依赖临时表来完成整个过程.系统使用的临时表的情况可以分为以下几种: *  group ...

  2. 如何解决Linux 系统下 ifconfig 命令无网络接口 ens33

    今天我在做Redis的哨兵集群模式的时候,以前都是好的,也不知道从什么时候开始就无法连接Redis服务器了,就是运行如下命令,没有效果:redis-server redis.conf,然后在通过命令查 ...

  3. R语言-广义线性模型

    使用场景:结果变量是类别型,二值变量和多分类变量,不满足正态分布  结果变量是计数型,并且他们的均值和方差都是相关的 解决方法:使用广义线性模型,它包含费正太因变量的分析 1.Logistics回归( ...

  4. LeetCode - 627. Swap Salary

    Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m v ...

  5. Linux常用命令手册

    Linux常用命令手册 NO 分类 PS1 命令名 用法及参数 功能注解 对应章节 1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件     文件管理 # ls ls ...

  6. 洛谷 P4016负载平衡问题【费用流】题解+AC代码

    洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...

  7. jQuery学习心得一

    1.闭包 每次看到jQuery的时候,首先想到的就是闭包.这是个老生常谈的问题了.今天重新回忆了一下闭包. 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的.所有我们要用闭包来 ...

  8. echarts legend 重叠 (转载)

    解决方案:  1. 调整option中的grid.top值才能避免重叠:(可以设置定制,也可以定义了一个计算公式) 2. 文档注明[特殊字符串 ''(空字符串)或者 '\n' (换行字符串)用于图例的 ...

  9. gerrit+nginx+centos安装配置

    安装环境 centos 6.8 gerrit-full-2.5.2.war 下载地址:https://gerrit-releases.storage.googleapis.com/gerrit-ful ...

  10. 1.8 range

    哈哈,前边忘了介绍这个知识点了,老是用人家,不介绍一下都不好意思了. range()函数是一个用来创建数字序列的函数. 问题来了,为什么要写函数? 封装代码啊,让使用者不需要关心具体业务逻辑是如何实现 ...