Skip to content

Commit

Permalink
Merge pull request #1 from Neurotical/master
Browse files Browse the repository at this point in the history
update 2024.4.25
  • Loading branch information
a48zhang authored Apr 25, 2024
2 parents 0da99f4 + 3909e21 commit f71282d
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 1 deletion.
70 changes: 69 additions & 1 deletion 2-数据结构.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,62 @@ class BIT
};

```

```cpp
template<typename T>
struct Fenwick{
int n;
vector<T> tr;

Fenwick(int n) : n(n), tr(n + 1, 0){}

int lowbit(int x){
return x & -x;
}

void modify(int x, T c){//单点添加
for(int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}

void modify(int l, int r, T c){//区间添加
modify(l, c);
if (r + 1 <= n) modify(r + 1, -c);
}

T query(int x){
T res = T();
for(int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}

T query(int l, int r){
return query(r) - query(l - 1);
}

int find_first(T sum){//和出现的第一位置
int ans = 0; T val = 0;
for(int i = __lg(n); i >= 0; i--){
if ((ans | (1 << i)) <= n && val + tr[ans | (1 << i)] < sum){
ans |= 1 << i;
val += tr[ans];
}
}
return ans + 1;
}

int find_last(T sum){
int ans = 0; T val = 0;
for(int i = __lg(n); i >= 0; i--){
if ((ans | (1 << i)) <= n && val + tr[ans | (1 << i)] <= sum){
ans |= 1 << i;
val += tr[ans];
}
}
return ans;
}

};
using BIT = Fenwick<int>;
```
## 并查集
Expand Down Expand Up @@ -290,3 +345,16 @@ int query(int l, int r, int cl = 1, int cr = n, int p = 1)
}
```

## 单调队列
```cpp
int p[N];
int head=1,tail=0;
for(int i=1;i<=n;i++){
if(head<=tail&&p[head]==i-k){//当前0 区间长度大于k时扔掉头部
head++;
}
while(head<=tail&&a[p[tail]]<=a[i]) tail--;//此时求最大值
p[++tail]=i;
//则head记录区间内最值
}
```
6 changes: 6 additions & 0 deletions 3-动态规划.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,12 @@ for (int i = 2; i <= n; i++)
}
}
```
枚举s的二进制真子集
```cpp
for(int j=s;j;j=(j-1)&s){
//...
}
```

## 数位DP

Expand Down
86 changes: 86 additions & 0 deletions 4-数学.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,89 @@ void matrix::tra(matrix a) {
}
```
## 高斯消元
求解线性方程组
将各系数合为矩阵,再将其变为上三角矩阵
过程中通常要保证选择的主元绝对值最大以保证精度
n^3
```cpp
const int N=100;
const double eps=1e-10;
int n;
double a[N+1][N+1],b[N+1];
void gauss(){
int l=1;
for(int i=1;i<=n;i++){//n列
for(int j=l;j<=n;j++){//找下面所有行中这一列处绝对值最大的
if(abs(a[j][i])>abs(a[l][i])){
for(int k=i;k<=n;k++){
swap(a[l][k],a[j][k]);
}
swap(b[l],b[j]);
}
}
if(abs(a[l][i])<eps) continue;
for(int j=1;j<=n;j++){//对所有其他行,更新值
if(j!=l&&abs(a[j][i])>eps){
double delta=a[j][i]/a[l][i];
for(int k=i;k<=n;k++){
a[j][k]-=a[l][k]*delta;
}
b[j]-=b[l]*delta;
}
}
++l;
}
for(int i=l;i<=n;i++){//假如有剩下的行且b值不为0则无解
if(abs(b[i])>eps){
cout<<"无解"<<endl;return;
}
}
if(l<=n){
cout<<"无穷多解"<<endl;
}
else{
for(int i=1;i<=n;i++){
cout<<fixed<<setprecision(10)<<b[i]/a[i][i]<<endl;
}
}
}
```

## 三分
```cpp
double cal(){
double l=0,r=1e10;
for(int i=1;i<=100;i++){
double m1=l+(r-l)/3;
double m2=(r-l)/3*2+l;
if(f(m1)<f(m2)) l=m1;
else r=m2;
}//求最大值
return f(l);
}

int cal(){
int l=0,r=1e10;
while(l+2<r){
int m1=l+(r-l)/3;
int m2=(r-l)/3*2+l;
if(f(m1)<f(m2)){
l=m1;
}
else{
r=m2;
}
}
int ans=f(l);
for(int i=l+1;i<=r;i++){
ans=max(ans,f(i));
}
}
```

0 comments on commit f71282d

Please sign in to comment.