I. let fat tension
题目分析
定义
l
e
(
i
,
j
)
le(i, j)
le(i,j)为
X
i
,
X
j
X_i, X_j
Xi,Xj之间的余弦相似度:
l
e
(
i
,
j
)
=
X
i
⋅
X
j
∣
X
i
∣
∣
X
j
∣
le(i, j) = \frac{X_i \cdot X_j}{|X_i||X_j|}
le(i,j)=∣Xi∣∣Xj∣Xi⋅Xj
要求求新
Y
′
Y'
Y′,
Y
i
n
e
w
=
∑
j
=
1
n
l
e
(
i
,
j
)
×
Y
j
Y_i^{new} = \sum^n_{j = 1}le(i, j) \times Y_j
Yinew=∑j=1nle(i,j)×Yj。
发现暴力计算显然行不通,但是可以转化为矩阵运算,除以模长可以直接对矩阵每行做归一化运算,那么答案就是:
X
′
X
′
T
Y
X'X'^TY
X′X′TY
X
′
X'
X′为按行归一化之后的矩阵。
那么可以得到运算的过程: ( n × k ) × ( k × n ) × ( n × d ) (n\times k) \times (k \times n) \times(n \times d) (n×k)×(k×n)×(n×d)。
发现先做后两个矩阵之间乘法,复杂度 O ( n k d ) O(nkd) O(nkd)。那么直接计算即可。
Code
#include
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
//#define int long long
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
double X[10010][100], XT[100][10010], Y[10010][100], ans1[100][100], ans2[10010][100];
inline void solve(){
int n, k, d; cin >> n >> k >> d;
double sum = 0;
for(int i = 1; i X[i][j];
for(int i = 1; i Y[i][j];
for(int i = 1; i
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence
