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 图形学的数据结 ...
随机推荐
- es数据恢复杂记
kill -9或者断电等原因异常,es在重启后,会通过translog来进行数据恢复. 默认的恢复速度是较慢的,可以设置indices.recovery.current_streams:10增大恢复的 ...
- BZOJ 2463: [中山市选2009]谁能赢呢?[智慧]
明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过.谁不能移 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- ConcurrentHashMap源码分析(一)
本篇博客的目录: 前言 一:ConcurrentHashMap简介 二:ConcurrentHashMap的内部实现 三:总结 前言:HashMap很多人都熟悉吧,它是我们平时编程中高频率出现的一种集 ...
- abp中文件下载,将内存数据导出到Excel并下载
1.数据导出为Excel的Stream using System; using System.Collections.Generic; using System.IO; using Abp.Colle ...
- 几种优化ajax的执行速度的方法
1.尽量使用局部的变量,而不使用全局变量: 2.优化for循环 3.尽量少用eval,每次使用eval都需要消耗大量的时间: 4.将DOM节点放在文档上. 5.尽量减少点好(.)操作符号的使用
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- PHP如何防止XSS攻击
PHP防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 . 在使用htmlspecialchars()函数的时候注意第二个参数, 直接 ...
- iOS开发引入第三方类库的问题
在开发iOS程序的过程中,通常在导入第三方的类库(.a/.o)文件会报出一系列的错误: Undefined symbols for architecture i386: "std::stri ...
- 1 Python数据类型--
常见的Python数据类型: (1)数值类型:就是平时处理的数字(整数.浮点数) (2)序列类型:有一系列的对象并排或者排列的情况.如字符串(str),列表(list),元组(tuple)等 (3)集 ...