在某咕上打了一晚上的模板

感觉还好。。。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
int n;
priority_queue<int> q;
int main()
{
n = read();
while(n--)
{
int opt = read();
if(opt == )q.push(-read());
else if(opt == )printf("%d\n",-q.top());
else q.pop();
}
}

小根堆(滑稽)

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m;
int first[maxn],to[maxn],nx[maxn],val[maxn],cnt;
int inq[maxn],dis[maxn],cq[maxn],vis[maxn];
int spfa(int s)
{
memset(inq,,sizeof(inq));
memset(cq,,sizeof(cq));
memset(dis,,sizeof(dis));
queue<int> q;
dis[s] = ;q.push(s);
cq[s] = ;
while(!q.empty())
{
int now = q.front();q.pop();
inq[now] = ;
for(int i=first[now];i;i=nx[i])
{
if(dis[to[i]] > dis[now] + val[i])
{
dis[to[i]] = dis[now] + val[i];
cq[to[i]] = cq[now] + ;
if(cq[to[i]] > n)return ;
if(!inq[to[i]])
{
inq[to[i]] = ;
q.push(to[i]);
}
}
}
}return ;
}
int main()
{
//freopen("testdata.in","r",stdin);
// freopen("testdata.ans","w",stdout);
int T = read();
while(T--)
{
n = read(),m = read();
cnt = ;memset(first,,sizeof(first));
for(int i=;i<=m;i++)
{
int u = read(),v = read(),w = read();
to[++cnt] = v,nx[cnt] = first[u],first[u] = cnt,val[cnt] = w;
if(w >= )to[++cnt] = u,nx[cnt] = first[v],first[v] = cnt,val[cnt] = w;
}
if(spfa())cout<<"YE5\n";
else cout<<"N0\n";
}
}

spfa判断负环,判断一个点是否松弛超过n次,比判入队n次快

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m;
int f[maxn][],lg[maxn];
int main()
{
n = read(),m = read();
lg[] = -;
for(int i=;i<=n;i++)f[i][] = read(),lg[i] = lg[i >> ] + ;
for(int j=;j<=;j++)
for(int i=;i+( << j) - <= n;i++)
f[i][j] = max(f[i][j - ],f[i + ( << (j - ))][j - ]);
while(m--)
{
int l = read(),r = read();
printf("%d\n",max(f[l][lg[r - l + ]],f[r - ( << lg[r - l + ]) + ][lg[r - l + ]]));
}
}

ST表

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = ,mod = ,M = ,G = ;
int n,L,num,R[maxn],a[maxn],b[maxn],c[maxn],d[maxn];
int poly[maxn],inv[maxn];
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
inline int ksm(int x,int t)
{
int res = ;
while(t)
{
if(t & ) res = 1LL * res * x % mod;
x = 1LL * x * x % mod;
t >>= ;
}
return res;
}
inline void NTT(int *a,int f,int n,int L)
{
for(int i=;i<n;i++) R[i] = (R[i>>] >> ) | ((i & ) << (L - ));
for(int i=;i<n;i++)if(i < R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=)
{
int wn = ksm(G,(mod - ) / (i << ));
if(f == -)wn = ksm(wn,mod - );
for(int j=;j<n;j+=(i<<))
{
int w = ;
for(int k=;k<i;k++,w=1LL * w * wn % mod)
{
int x = a[j + k], y = 1LL * w * a[j + k + i ] % mod;
a[j + k] = ((x + y) % mod + mod) % mod;
a[j + k + i] = ((x - y) % mod + mod) % mod;
}
}
}
if(f == -)
{
int inv = ksm(n,mod - );
for(int i=;i<n;i++)a[i] = 1LL * a[i] * inv % mod;
}
}
inline void inverse(int *a,int *b,int n,int L)
{
if(n == ){b[] = ksm(a[],mod - );return;}
inverse(a,b,n>>,L-);
memcpy(c,a,n*sizeof(int));memset(c+n,,n*sizeof(int));
NTT(c,,n<<,L+);NTT(b,,n<<,L+);
for(int i=;i<(n<<);i++) b[i] = 1LL * b[i] * (( - 1LL * c[i] * b[i] % mod + mod) % mod) % mod;
NTT(b,-,n<<,L+);memset(b+n,,n*sizeof(int));
}
inline void sqrt(int *a,int *b,int n,int L)
{
if(n == ){b[] = ;return;}
sqrt(a,b,n>>,L-);memset(d,,n**sizeof(int));inverse(b,d,n,L);
memcpy(c,a,n*sizeof(int));memset(c+n,,n*sizeof(int));
NTT(c,,n<<,L+);NTT(b,,n<<,L+);NTT(d,,n<<,L+);
for(int i=;i<n<<;i++) b[i] = (1LL * c[i] * d[i] % mod + b[i]) %mod * M % mod;
NTT(b,-,n<<,L+);memset(b+n,,n*sizeof(int));
}
signed main()
{
n = read();
for(int i=;i<n;i++)poly[i] = read();
int m;
for(m=n,n=;n<=m;n<<=) L++;
for(int i=;i<n;i++)poly[i] = mod - poly[i];
(poly[] += ) %= mod;
inverse(poly,inv,n,L);
for(int i=;i<m;i++)printf("%lld ",inv[i]);
}

用多项式求逆搞的分治FFT板子

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = 3e6 + ;
int n,p;
int inv[maxn];
inline int inverse(int x)
{
int res = ,t = p - ;
while(t)
{
if(t & )res = res * x % p;
x = x * x % p;
t = t >> ;
}
return res;
}
signed main()
{
n = read(),p = read();puts("");inv[] = ;
for(int i=;i<=n;i++)
{
printf("%d\n",(inv[i] = ((p - p / i) * inv[p % i]) % p));
//printf("%d\n",inverse(i));
}
}

逆元

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#define LL long long
using namespace std;namespace IO {
const int iL = <<;
char _buf[iL],*S,*T;
#define gc (S==T?(T=(S=_buf)+fread(_buf,1,iL,stdin),S==T?0:*S++):*S++)
template<class _Tp> inline void gi(_Tp&x){
x=;int f=;char ch=gc;while(ch<''||ch>''){if(ch=='-')f=-;ch=gc;}
while(ch>=''&&ch<='')x=x*+(ch^),ch=gc;x*=f;
}
char _o[],*__o;
template<class _Tp> inline void oi(_Tp x,char _y=){
if(x==){putchar('');if(_y)putchar(_y);}
else {
if(x<) putchar('-'), x=-x;
__o = _o+; if(_y) *--__o = _y;
while(x) *--__o = x%+, x/=;
fwrite(__o,,_o+-__o,stdout);
}
} inline char getc(){char ch;while((ch=gc)!='A'&&ch!='C');return ch;}
} ;
const int maxn = 1e6 + ;
int n,k;
char s[maxn];
namespace Suffix_Array
{
#define equ(x) (y[sa[i] + x] == y[sa[i - 1] + x])
int rnk[maxn],tmp[maxn],sa[maxn],hei[maxn];
int *x,*y;
int wa[maxn],wb[maxn],wc[maxn];
void radix_sort(int m)
{
memset(wc+,,sizeof(int)*m);
for(int i=;i<=n;++i)++wc[x[y[i]]];
for(int i=;i<=m;++i)wc[i] += wc[i - ];
for(int i=n;i>=;--i)sa[wc[x[y[i]]]--] = y[i];
}
void makesa(char *s,int n,int m)
{
x = wa,y = wb;
for(int i=;i<=n;++i)x[i] = s[i],y[i] = i;radix_sort(m);
for(int j=,p=;j<=n;j<<=,m = p,p = )
{
for(int i=n-j+;i<=n;++i)y[++p] = i;
for(int i=;i<=n;++i)
if(sa[i] > j)y[++p] = sa[i] - j;
radix_sort(m);swap(x,y);x[sa[p = ]] = ;
for(int i=;i<=n;++i)x[sa[i]] = equ() && equ(j) ? p : ++p;
if(p == n)break;
}
}
}
using namespace Suffix_Array;
int main()
{
fgets(s + , << ,stdin);
n = strlen(s + );
makesa(s,n,);
for(int i=;i<=n;++i)IO::oi(sa[i],' ');
}

后缀排序

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m,mod;
int a[maxn];
#define ls (x << 1)
#define rs ((x << 1) | 1)
int seg[maxn << ],mutag[maxn << ],adtag[maxn << ];
inline void pushup(int x){seg[x] = (seg[ls] + seg[rs]) % mod;}
inline void build(int x,int l,int r)
{
mutag[x] = ,adtag[x] = ;
if(l == r)
{
seg[x] = a[l];
return;
}
int mid = (l + r) >> ;
build(ls,l,mid);build(rs,mid + ,r);
pushup(x);
}
inline void pushdown(int x,int l,int r)
{
if(mutag[x] != )
{
(mutag[ls] *= mutag[x]) %= mod;(mutag[rs] *= mutag[x]) %= mod;
(adtag[ls] *= mutag[x]) %= mod;(adtag[rs] *= mutag[x]) %= mod;
(seg[ls] *= mutag[x]) %= mod;(seg[rs] *= mutag[x]) %= mod;
mutag[x] = ;
}
if(adtag[x])
{
int mid = (l + r) >> ;
(adtag[ls] += adtag[x]) %= mod;(adtag[rs] += adtag[x]) %= mod;
(seg[ls] += (mid - l + ) * adtag[x]) %= mod;
(seg[rs] += (r - mid) * adtag[x]) %= mod;
adtag[x] = ;
}
}
inline void modify(int x,int l,int r,int L,int R,int v,int type)
{
if(L <= l && r <= R)
{
if(type == )
{
(seg[x] += (r - l + ) * v) %= mod;
(adtag[x] += v) %= mod;
}
if(type == )
{
(seg[x] *= v) %= mod;
(adtag[x] *= v) %= mod;
(mutag[x] *= v) %= mod;
}
return;
}
int mid = (l + r) >> ;
pushdown(x,l,r);
if(L <= mid)modify(ls,l,mid,L,R,v,type);
if(R > mid)modify(rs,mid + ,r,L,R,v,type);
pushup(x);
}
inline int query(int x,int l,int r,int L,int R)
{
if(L <= l && r <= R)return seg[x];
int mid = (l + r) >> ,ans = ;
pushdown(x,l,r);
if(L <= mid)(ans += query(ls,l,mid,L,R)) %= mod;
if(R > mid)(ans += query(rs,mid + ,r,L,R)) %= mod;
return ans;
}
signed main()
{
n = read(),m = read(),mod = read();
for(int i=;i<=n;i++)a[i] = read();
build(,,n);
while(m--)
{
int op = read(),l = read(),r = read();
if(op == )modify(,,n,l,r,read(),op);
else if(op == )modify(,,n,l,r,read(),op);
else printf("%lld\n",query(,,n,l,r));
}
}

线段树区间加,区间乘

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m;
int a[maxn];
struct Graph
{
int first[maxn],to[maxn << ],nx[maxn << ],cnt;
inline void add(int u,int v)
{
to[++cnt] = v;
nx[cnt] = first[u];
first[u] = cnt;
}
}G1,G2;
int dfn[maxn],low[maxn],stk[maxn],top,vis[maxn],bl[maxn],scc,size[maxn],_tim;
int ind[maxn],sum[maxn];
inline void Tarjan(int x)
{
dfn[x] = low[x] = ++_tim;stk[++top] = x;vis[x] = ;
for(int i=G1.first[x];i;i=G1.nx[i])
{
int v = G1.to[i];
if(!dfn[v])
{
Tarjan(v);
low[x] = min(low[x],low[v]);
}
else if(vis[v])low[x] = min(low[x],dfn[v]);
}
if(dfn[x] == low[x])
{
int now = ;scc++;
while(now != x)
{
now = stk[top--];
vis[now] = ;
bl[now] = scc;
size[scc]++;
sum[scc] += a[now];
}
}
}
inline void rebuild()
{
for(int j=;j<=n;j++)
for(int i=G1.first[j];i;i=G1.nx[i])
if(bl[j] != bl[G1.to[i]])
{
ind[bl[G1.to[i]]]++;
G2.add(bl[j],bl[G1.to[i]]);
}
}
int dp[maxn];
inline int dfs()
{
queue<int> q;
for(int i=;i<=scc;i++)
if(ind[i] == )
{
q.push(i);
dp[i] = sum[i];
}
while(!q.empty())
{
int now = q.front();q.pop();
for(int i=G2.first[now];i;i=G2.nx[i])
{
int v = G2.to[i];
dp[v] = max(dp[v],dp[now] + sum[v]);
ind[v]--;
if(ind[v] == )q.push(v);
}
}
int ans = ;
for(int i=;i<=scc;i++)ans = max(ans,dp[i]);
return ans;
}
signed main()
{
n = read(),m = read();
for(int i=;i<=n;i++)a[i] = read();
for(int i=;i<=m;i++)
{
int u = read(),v = read();
G1.add(u,v);
}
for(int i=;i<=n;i++)
if(!dfn[i])Tarjan(i);
rebuild();
cout<<dfs();
}

Tarjan强连通分量

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m;
int first[maxn],to[maxn << ],nx[maxn << ],cnt;
inline void add(int u,int v)
{
to[++cnt] = v;
nx[cnt] = first[u];
first[u] = cnt;
}
int dfn[maxn],low[maxn],_tim;
int isc[maxn];
inline void Tarjan(int x,int fa)
{
dfn[x] = low[x] = ++_tim;
int ch = ;
for(int i=first[x];i;i=nx[i])
{
int v = to[i];
if(!dfn[v])
{
Tarjan(v,x);
low[x] = min(low[x],low[v]);
if(low[v] >= dfn[x] && x != fa)isc[x] = ;
if(x == fa)++ch;
}
else low[x] = min(low[x],dfn[v]);
}
if(x == fa && ch >= )isc[x] = ;
}
signed main()
{
n = read(),m = read();
for(int i=;i<=m;i++)
{
int u = read(),v = read();
add(u,v);add(v,u);
}
for(int i=;i<=n;i++)
if(!dfn[i])Tarjan(i,i);
int ToT = ;
for(int i=;i<=n;i++)if(isc[i])ToT++;
cout<<ToT<<endl;
for(int i=;i<=n;i++)if(isc[i])cout<<i<<" ";
}

割点

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = ,mod = ,M = ,G = ;
int n,L,num,R[maxn],a[maxn],b[maxn],c[maxn],d[maxn];
int poly[maxn],inv[maxn];
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
inline int ksm(int x,int t)
{
int res = ;
while(t)
{
if(t & ) res = 1LL * res * x % mod;
x = 1LL * x * x % mod;
t >>= ;
}
return res;
}
inline void NTT(int *a,int f,int n,int L)
{
for(int i=;i<n;i++) R[i] = (R[i>>] >> ) | ((i & ) << (L - ));
for(int i=;i<n;i++)if(i < R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=)
{
int wn = ksm(G,(mod - ) / (i << ));
if(f == -)wn = ksm(wn,mod - );
for(int j=;j<n;j+=(i<<))
{
int w = ;
for(int k=;k<i;k++,w=1LL * w * wn % mod)
{
int x = a[j + k], y = 1LL * w * a[j + k + i ] % mod;
a[j + k] = ((x + y) % mod + mod) % mod;
a[j + k + i] = ((x - y) % mod + mod) % mod;
}
}
}
if(f == -)
{
int inv = ksm(n,mod - );
for(int i=;i<n;i++)a[i] = 1LL * a[i] * inv % mod;
}
}
inline void inverse(int *a,int *b,int n,int L)
{
if(n == ){b[] = ksm(a[],mod - );return;}
inverse(a,b,n>>,L-);
memcpy(c,a,n*sizeof(int));memset(c+n,,n*sizeof(int));
NTT(c,,n<<,L+);NTT(b,,n<<,L+);
for(int i=;i<(n<<);i++) b[i] = 1LL * b[i] * (( - 1LL * c[i] * b[i] % mod + mod) % mod) % mod;
NTT(b,-,n<<,L+);memset(b+n,,n*sizeof(int));
}
inline void sqrt(int *a,int *b,int n,int L)
{
if(n == ){b[] = ;return;}
sqrt(a,b,n>>,L-);memset(d,,n**sizeof(int));inverse(b,d,n,L);
memcpy(c,a,n*sizeof(int));memset(c+n,,n*sizeof(int));
NTT(c,,n<<,L+);NTT(b,,n<<,L+);NTT(d,,n<<,L+);
for(int i=;i<n<<;i++) b[i] = (1LL * c[i] * d[i] % mod + b[i]) %mod * M % mod;
NTT(b,-,n<<,L+);memset(b+n,,n*sizeof(int));
}
signed main()
{
n = read();
for(int i=;i<n;i++)poly[i] = read();
int m;
for(m=n,n=;n<=m;n<<=) L++;
inverse(poly,inv,n,L);
for(int i=;i<m;i++)printf("%lld ",inv[i]);
}

多项式求逆

noip前打板子 qwq的更多相关文章

  1. CSP前的板子们

    见窝的luogu博客qwq noip前的板子们

  2. [日常] NOIP前集训日记

    写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...

  3. Noip前的大抱佛脚----Noip真题复习

    Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...

  4. Noip前的大抱佛脚----数论

    目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...

  5. Noip前的大抱佛脚----文章索引

    Noip前的大抱佛脚----赛前任务 Noip前的大抱佛脚----考场配置 Noip前的大抱佛脚----数论 Noip前的大抱佛脚----图论 Noip前的大抱佛脚----动态规划 Noip前的大抱佛 ...

  6. Noip前的大抱佛脚----字符串

    目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...

  7. Noip前的大抱佛脚----一些思路

    目录 一些思路 序列 函数问题 网格图 删除和询问 乘法问题 顺序问题 最值问题 研究成果 数论分块套数论分块的复杂度 一些思路 Tags:Noip前的大抱佛脚 序列 线段树(当然还要有主席树啊!) ...

  8. Noip前的大抱佛脚----图论

    目录 图论 知识点 二分图相关 DFS找环 并查集维护二分图 二分图匹配的不可行边 最小生成树相关 最短路树 最短路相关 负环 多源最短路 差分约束系统 01最短路 k短路 网络流 zkw费用流 做题 ...

  9. Noip前的大抱佛脚----数据结构

    目录 数据结构 知识点及其应用 线段树 神奇标记 标记不下放 并查集 维护二分图 维护后继位置 堆 可并堆的可持久化 dsu on tree 方式&原理 适用范围 单调队列 尺取合法区间 模板 ...

随机推荐

  1. CentOS 7.x samba 服务器安装

    以下以root用户执行 1.安装: # yum install samba samba-client -y   2.设置开机启动: # systemctl enable smb.service ln ...

  2. Zipper (DP)

    Zipper Given three strings, you are to determine whether the third string can be formed by combining ...

  3. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

  4. information entropy as a measure of the uncertainty in a message while essentially inventing the field of information theory

    https://en.wikipedia.org/wiki/Claude_Shannon In 1948, the promised memorandum appeared as "A Ma ...

  5. 【python】-- Redis简介、命令、示例

    Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...

  6. go语言之接口一

    在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 我们定义了一个File类,并实现有Read().Write().Seek().Close()等方法.设 想我们有如下接口 ...

  7. python基础14 ---函数模块5(模块和包)

    模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文 ...

  8. 1django 视图与网址

    创建一个项目,名字叫mysite django-admin startproject mysite(项目名) 成功后,看到如下样式 mysite ├── manage.py └── mysite ├─ ...

  9. Python基础(5)_字符编码、文件处理

    一.文件读取过程: 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数 ...

  10. iOS JSON 和 Mode l转换

    MJExtension  是我们项目开发常用的一个第三方框架  很好用. https://github.com/CoderMJLee/MJExtension 映射 json  value key  直 ...