【BNU】33943 Super Rooks on Chessboard 【FFT】

2024-09-05 14:18

本文主要是介绍【BNU】33943 Super Rooks on Chessboard 【FFT】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【BNU】33943 Super Rooks on Chessboard

UVA上的题,然而我怎么会蠢到去UVA呢!(其实是百度首先跳出来的是BNU _

题目分析:

numx N 个车没有覆盖的行数,numy N 个车没有覆盖的列数。
首先我们考虑没有主对角线覆盖这一条件时,总共的没有被覆盖的面积就是numxnumy
现在我们考虑主对角线影响。
考虑没有被车覆盖的行的集合 R={r1,r2,r3...rm}
考虑没有被车覆盖的列的集合 C={c1,c2,c3...cn}
考虑被车覆盖的对角线的集合 D={d1,d2,d3...ds}
那么对角线 dk 覆盖的还未被覆盖的格子数量即 ricj=dk
考虑 FFT ,我们将行集合,列集合转化成多项式: R=xri C=xci
做一遍 FFT 答案就出来了。

心得: FFT 时,首元素可以为任意阶。

my code:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )
#define cpy( a , x ) memcpy ( a , x , sizeof a )const int MAXN = 100005 ;
const double pi = acos ( -1.0 ) ;struct Complex {double r , i ;Complex () {}Complex ( double r , double i ) : r ( r ) , i ( i ) {}Complex operator + ( const Complex& t ) const {return Complex ( r + t.r , i + t.i ) ;}Complex operator - ( const Complex& t ) const {return Complex ( r - t.r , i - t.i ) ;}Complex operator * ( const Complex& t ) const {return Complex ( r * t.r - i * t.i , r * t.i + i * t.r ) ;}
} ;void FFT ( Complex y[] , int n , int rev ) {for ( int i = 1 , j , k , t ; i < n ; ++ i ) {for ( j = 0 , k = n >> 1 , t = i ; k ; k >>= 1 , t >>= 1 ) j = j << 1 | t & 1 ;if ( i < j ) swap ( y[i] , y[j] ) ;}for ( int s = 2 , ds = 1 ; s <= n ; ds = s , s <<= 1 ) {Complex wn ( cos ( rev * 2 * pi / s ) , sin ( rev * 2 * pi / s ) ) , w ( 1 , 0 ) , t ;for ( int k = 0 ; k < ds ; ++ k , w = w * wn ) {for ( int i = k ; i < n ; i += s ) {y[i + ds] = y[i] - ( t = w * y[i + ds] ) ;y[i] = y[i] + t ;}}}if ( rev == -1 ) for ( int i = 0 ; i < n ; ++ i ) y[i].r /= n ;
}bool visx[MAXN] , visy[MAXN] , visd[MAXN << 2] ;
Complex x1[MAXN << 2] , x2[MAXN << 2] ;
int r , c , q , n ;void solve ( int T ) {int x , y , numx = 0 , numy = 0 ;clr ( visx , 0 ) ;clr ( visy , 0 ) ;clr ( visd , 0 ) ;scanf ( "%d%d%d" , &r , &c , &q ) ;for ( int i = 0 ; i < q ; ++ i ) {scanf ( "%d%d" , &x , &y ) ;visx[x] = 1 ;visy[y] = 1 ;visd[x - y + c] = 1 ;}int n = 1 ;while ( n < r + c + 1 ) n <<= 1 ;for ( int i = 1 ; i <= r ; ++ i ) numx += visx[i] == 0 ;for ( int i = 1 ; i <= c ; ++ i ) numy += visy[i] == 0 ;for ( int i = 1 ; i <= r ; ++ i ) x1[i - 1] = Complex ( visx[i] == 0 , 0 ) ;for ( int i = r ; i < n ; ++ i ) x1[i] = Complex ( 0 , 0 ) ;for ( int i = 1 ; i <= c ; ++ i ) x2[c - i] = Complex ( visy[i] == 0 , 0 ) ;for ( int i = c ; i < n ; ++ i ) x2[i] = Complex ( 0 , 0 ) ;FFT ( x1 , n , 1 ) ;FFT ( x2 , n , 1 ) ;for ( int i = 0 ; i < n ; ++ i ) x1[i] = x1[i] * x2[i] ;FFT ( x1 , n , -1 ) ;LL ans = ( LL ) numx * numy ;for ( int i = 0 ; i < n ; ++ i ) ans -= ( LL ) ( x1[i].r + 0.5 ) * visd[i + 1] ;printf ( "Case %d: %lld\n" , T , ans ) ;
}int main () {int T ;scanf ( "%d" , &T ) ;for ( int i = 1 ; i <= T ; ++ i ) solve ( i ) ;return 0 ;
}

这篇关于【BNU】33943 Super Rooks on Chessboard 【FFT】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139192

相关文章

问:Super与this在Java中有什么区别?

this: this 关键字用于引用当前对象。它通常用于区分成员变量和方法参数或局部变量。在实例方法中,this 指向调用该方法的对象。在构造函数中,this 指向正在被初始化的对象。 super: super 关键字用于引用父类(超类)的构造函数、方法或变量。在子类的构造函数中,super() 用于调用父类的构造函数。在子类的方法中,super.methodName() 用于调用父类的方法。

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

? extends T 和 ? super T分别是什么意思?有什么不同?

<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过add

java基础总结11-面向对象7(super关键字)

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。 1 super关键字测试 package cn.galc.test;/*** 父类* @autho

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

【大数据Java基础-JAVA 面向对象14】面向对象的特征二:继承性 (三) 关键字:super以及子类对象实例化全过程

关键字:super 1.super 关键字可以理解为:父类的 2.可以用来调用的结构: 属性、方法、构造器 3.super调用属性、方法: 3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super." 3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

【HDU】5197 DZY Loves Orzing 【FFT启发式合并】

传送门:【HDU】5197 DZY Loves Orzing 题目分析: 首先申明,我不会 dp dp方程= =……这个东西给队友找出来了,然后我就是套这个方程做题的Qrz…… 对于这题,因为 n2 n^2个数互不相同,所以每一列都可以单独考虑。设 dpni dp_ni表示长度为 n n的排列,能恰好看见ii个人的方案数,根据队友的发现, dpni dp_ni就等于 |sni| |s_ni|

【ZOJ】3874 Permutation Graph 【FFT+CDQ分治】

传送门:【ZOJ】3874 Permutation Graph 题目分析: 容易知道一个个连通块内部的标号都是连续的,否则一定会有另一个连通块向这个连通块建边,或者这个连通块向另一个连通块建边。而且从左到右左边的连通块内最大的标号小于右边连通块内最小的标号。 然后我们可以构造dp方程: dp[n]=n!−i!∗dp[n−i] \qquad \qquad dp[n] = n! - i! *