hdu5751 Eades
今天热身考到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的更多相关文章
- hdu 5751 Eades
题意:对于整数序列$A[1...n]$定义$f(l, r)$为区间$[l, r]$内等于区间最大值元素的个数,定义$z[i]$为所有满足$f(l, r)=i$的区间总数.对于所有的$1 \leq i ...
- Fast Fourier Transform
写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 挖个大坑,以后再补.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34 ...
- 套题 bestcoder 84
A题:Aaronson 静下心来观察就会发现1.如果m大于等于n的位数,那么n直接写成二进制形式就是最优解形式2.如果m小于n的位数,那么贪心地使得高位尽可能地多消掉n的值,因为高位少写一个数就意味着 ...
- Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)
1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...
随机推荐
- Vue.js搭建路由报错 router.map is not a function,Cannot read property ‘component’ of undefined
错误: 解决办法: 2.0已经没有map了,使用npm install vue-router@0.7.13 命令兼容1.0版本vue 但是安装完之后会出现一个错误: Cannot read prope ...
- React ref回调函数例子
ref属性也可以是一个回调函数而不是一个名字. 这个函数将要在组件被挂载之后立即执行. 这个参照的组件将会作为该函数的参数,这个函数可以立即使用这个组件参数,当然也可以将其保存供以后使用. 当这个 ...
- springMvc+swagger整合例子
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服 ...
- SUSE-11 本地 zypper 配置
配置本地 zypper 目的: 安装 SUSE-11 后想要再添加或删除软件组件将比较麻烦.通过配置本地 zypper 将可以从下载的软件仓库(repository)中安装软件包. 本地 zypp ...
- 树莓派上运行.net core 2.0程序
记录中 参考: https://www.cnblogs.com/songxingzhu/p/7399991.html https://www.cnblogs.com/goodfulcom/p/7624 ...
- 【笔记】h5 页面唤起电话呼叫
参考文章:https://www.cnblogs.com/lilin1995/p/5640684.html 最近完成一个公司的官网移动端页面,涉及到了唤起电话这个功能,说实在js 并没有为此提供 ap ...
- HashSet和CopyOnWriteArraySet
前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...
- mysql 修改默认字符集为utf8
MySQL 5.5, all you need is: [mysqld] character_set_client=utf8 character_set_server=utf8 collation_s ...
- ubuntu 双网卡建网桥脚本实现
#!/bin/bash interface1=`ls /sys/class/net|grep en|awk 'NR==1{print}'` interface2=`ls /sys/class/net| ...
- mongodb 配置均衡器的运行窗口
当系统的数据量增长不是太快的时候,考虑到数据迁移会降低系统性能,可以配置均衡器在只在特定时间段运行.详细的配置步骤如下: 连接到任意的mongos服务器,并通过安全认证(如果有认证的话). 切换到co ...