哇 这题目怎么一次比一次毒瘤 当然这次还好 有会做的题目。

T1 一眼看上去 毒瘤!再看一眼 我真不想看了 扔了。

T2 哇感觉能写 哇这不是 随便都有40分了么 二分?优化一下65到手了。然后剩下的不会了。

T3 爆搜?怎么连30分都没有啊 还是状压吧 只有30分觉得剩下的是贪心就没有再思考了。

先从T2 开始改吧。

LINK: (其实就是一个-1 1序列 求出一段连续的序列使其最长。

当然这是转化过的模型了 具体看题目 首先 从答案的角度进行分析 得到最后一定是某个质因数留到了最后 发现没有质因数就没有答案所以要枚举质因数。

枚举完质因数就是上述的问题了 怎么解决?显然我有一个二分的思路然后 复杂度 nlogn 而质因数很多 设为T T=1e6/ln1e6 这个少说也有1e5 所以说 不能这样搞,复杂度过大。

但是由于1的位置非常至少我们不妨将其抽出来。但是通过二分可以发现答案可能不在1这个位置上。但是我们显然可以得到一个推论。

答案的区间一定是一个偶数除非是1~n.这个区间,所以我们得到一对 i j的区间是合法的 那么我们也同时得到了这个区间的长度2*(i-j+1);于是做一些细节的处理就可以得到我们要求的区间辣。

还是一样的结果 枚举所有的质因数来寻找答案 我们分析 一下如何只遍历1的位置来寻找答案。

对于一个i 来说我们要寻找一个尽可能小的j 使得其满足 2*(i-j+1)>=(pi-pj+1) 当然这个地方 i pi 这个玩意都是同时单调 的所以我们还是要找到一个尽量小的j。

这个问题 可以很快的得到答案 。首先 我们得到了这个东西有一些性质 不妨可以讨论一下可以发现pi是单调递增的 并非原来最基础的二分模型每个位置上的数字都不单调。

当然 这个和我的二分做法不尽相同所以 这里不再赘述 我突然有点sb...

我们把1抽出来之后考虑如何求答案 也就是对于每个i如何寻找j 暴力枚举?复杂度还是会达到n^2 我们观察上述的式子可以简化为 pi-2*i-1<=pj-2*j;

显然我们可以排序 然后 就可以通过双指针扫描的方法寻找到最小的j 二分复杂度就有点高了...这样复杂度最好还是一个nlogn的加上了一些小常数罢了。

还是有点迷不过没有关系 正序枚举i好像会出现一些事故 i单调递增 那么这将意味着j的集合不断减小 不妨倒序枚举i 这样j这个集合也好加入..

考虑 了一些细节却反过来迷惑了自己qwq 其实都是一些不必要的情况 如 j找到了i怎么办 我们维护一个最小的j尽管遇到了这种情况也是不会累计贡献的 所以是合法的。

考虑 到 答案所在 最小左端点显然 我们必然能直接从左端点向右边找最小 因为 如果可能不合法那么必然的我们最小的左端点还能更小所以假设不成立。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=,maxn=;
int n,flag,maxx=,mark;
int ans,ansl,top;
int a[MAXN],w[MAXN];
vector<int>p[maxn],id[maxn];
struct wy{int p,v,cnt;}t[MAXN];//pos v
inline int cmp(wy a,wy b){return a.v>b.v;}
inline void upd(int L,int len)
{
if(len>ans)ansl=L,ans=len;
else if(len==ans)ansl=min(ansl,L);
return;
}
int main()
{
//freopen("1.in","r",stdin);
n=read();mark=n/;if(n&)++mark;
for(int i=;i<=maxx;++i)
if(!p[i].size())
for(int j=i;j<=maxx;j+=i)
p[j].push_back(i);
for(int i=;i<=n;++i)
{
a[i]=read();
if(a[i]!=)flag=;
for(un int j=;j<p[a[i]].size();++j)
{
id[p[a[i]][j]].push_back(i);
//cout<<p[a[i]][j]<<endl;
if(id[p[a[i]][j]].size()>=mark)mark=INF;
}
}
if(!flag){printf("0 0\n");return ;}
if(mark==INF){printf("1 %d\n",n);return ;}
for(int i=;i<=maxx;++i)
{
if(!id[i].size())continue;
top=;
for(un j=;j<id[i].size();++j)
{
++top;
t[top]=(wy){id[i][j],id[i][j]-*top,top};
}
sort(t+,t++top,cmp);
int j=,now=n+;
for(int k=;k<=top;++k)//寻找一个j使得 t[k].top-2*t[top].p<=。。。
{
while(j<=top&&t[j].v+>=t[k].v)
{
now=min(now,t[j].cnt);
++j;
}
int len=*(t[k].cnt-now+);
int l=max(,t[k].p-len+);
upd(l,len);
}
}
printf("%d %d\n",ansl,ansl+ans-);
return ;
}

当然二分也是可以过的(说的不是我的二分 但是我的二分加入一些奇技淫巧也可以过嘿嘿嘿...比如只判断40个质数直接水过有没有 当然这种做法相当的不严谨 我杜绝这样的做法这里我放一个 65分的二分 很巧妙的.

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define R register
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int MAXN=,maxn=;
int n,maxx,ans,ansl,L;
int a[MAXN],f[MAXN];
int p[maxn];
int w[MAXN];
inline void fj(int x)
{
for(int i=;i*i<=x;++i)
{
if(x%i==)
{
while(x%i==)x=x/i;
p[i]=;
maxx=max(maxx,i);
}
}
if(x>)p[x]=;
maxx=max(maxx,x);
}
inline int check(int x)
{
int minn=INF,mark;
for(int i=;i<x;++i)f[i]=f[i-]+w[i];
for(int i=x;i<=n;++i)
{
f[i]=f[i-]+w[i];
if(f[i-x]<minn){minn=f[i-x];mark=i-x+;}
if(f[i]-minn>=){L=mark;return ;}
}
return ;
}
inline void solve(int x)
{
for(int i=;i<=n;++i)
{
w[i]=;
if(a[i]%x==)w[i]=;
--w[i];
}
int l=ans,r=n;
while(l+<r)
{
int mid=(l+r)>>;
if(check(mid))l=mid;
else r=mid;
}
if(check(r))
{
if(ans==r){ansl=min(ansl,L);}
if(r>ans){ans=r;ansl=L;}
}
else
{
check(l);
if(ans==l){ansl=min(ansl,L);}
if(l>ans){ans=l;ansl=L;}
}
return;
}
int main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=;i<=n;++i)a[i]=read(),fj(a[i]);
for(int i=;i<=maxx;++i)if(p[i])solve(i);
if(!ansl)printf("%d %d\n",ansl,ansl);
else printf("%d %d\n",ansl,ansl+ans-);
return ;
}

但是还需要考虑一波事情 叫做二分过题 。优化这个二分如何?我们还是把1 抽出来进行这个上述二分答案的过程发现这样的复杂度也是科学的n*8*logn 哇很稳。当时考试的时候关键是少了一个推论。

很可惜。我应该是能够推出那个答案所在的推论的,要不就A了。

A了都不知道 以为wa了 那就很棒了 我的思路也是正确的二分 +验证 不过把1抽出来罢了 跟上述做法差多了 但是没有上述做法好调。

但是要注意细节 二分果然毒瘤。...

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=,maxn=;
int n,flag,maxx=,mark;
int ans,ansl,top;
int a[MAXN],w[MAXN];
int b[MAXN],c[MAXN],f[MAXN];
vector<int>p[maxn],id[maxn];
inline void upd(int L,int len)
{
if(len>ans)ansl=L,ans=len;
else if(len==ans)ansl=min(ansl,L);
return;
}
inline int check(int x)
{
int minn=INF,s;
for(int i=;i<=x;++i)f[i]=(c[i]<<)-b[i];
for(int i=x+;i<=top;++i)
{
f[i]=(c[i]<<)-b[i];
if(f[i-x]<minn){minn=f[i-x];s=i-x;}
if(f[i]-minn+>=)
{
int len=*(c[i]-c[s]+);
int L=max(,b[i]-len+);
upd(L,len);
return ;
}
}
return ;
}
int main()
{
//freopen("1.in","r",stdin);
n=read();mark=n/;if(n&)++mark;
for(int i=;i<=maxx;++i)
if(!p[i].size())
for(int j=i;j<=maxx;j+=i)
p[j].push_back(i);
for(int i=;i<=n;++i)
{
a[i]=read();
if(a[i]!=)flag=;
for(un int j=;j<p[a[i]].size();++j)
{
id[p[a[i]][j]].push_back(i);
//cout<<p[a[i]][j]<<endl;
if(id[p[a[i]][j]].size()>=mark)mark=INF;
}
}
if(!flag){printf("0 0\n");return ;}
if(mark==INF){printf("1 %d\n",n);return ;}
for(int i=;i<=maxx;++i)
{
if(!id[i].size())continue;
top=;
for(unsigned int j=;j<id[i].size();++j)
{
b[++top]=id[i][j];
c[top]=j+;
if((c[top]<<)>=b[top])upd(max(,b[top]-c[top]*+),c[top]<<);
}
int l=,r=top;
while(l+<r)
{
int mid=(l+r)>>;
if(check(mid))l=mid;
else r=mid;
}
check(r);check(l);
}
printf("%d %d\n",ansl,ansl+ans-);
return ;
}

T1:由于本人智商不够 耐心不够 不够沉着 不够冷静 不够勇敢 不够自信 总之就是不对劲这人 60分送的都没拿 我我我真不对劲。

LINK:模拟 构造 毒瘤 要求多 不会写 自闭。

具体要求 要求构造一个字符串 其由 小写字母 ?* 组成 这个类似于通配符(一听到这个名字我就烦... *可以替换任意非负长度的小写字母 注意非负也可以是0 ?可以替换任意小写字母。

给出两个 字符串S1 S2 要求出一个字符串T可以满足:如果字符串S能匹配S1或S2 那么S也能匹配T 这个条件很绕对不对。和S明明无关 非得引入S。

显然有结论 如果S能匹配S1 S1能匹配T 那么显然 T能匹配S 那么我们让T能够同时匹配S1和S2 即可。且使得*尽量少 且在满足上述条件下长度最长 且在满足上述条件之下?个数最少。

且在满足上述条件的情况下字典序最小 其中字典序的大小关系为*?abcd... 真的不想写TAT.
(别问我为什么写 我只是突然睡着了 睡醒之后就想写了。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int MAXN=;
int T,n,m;
char a[MAXN],b[MAXN];
int main()
{
//freopen("1.in","r",stdin);
T=read();
while(T--)
{
scanf("%s",a+);
scanf("%s",b+);
n=strlen(a+);m=strlen(b+);
if(n==m)
{
for(int i=;i<=n;++i)
{
if(a[i]=='?'||b[i]=='?'){printf("?");continue;}
if(a[i]!=b[i]){printf("?");continue;}
printf("%c",a[i]);
}
puts("");
}
}
return ;
}

60 points

这题 显然两个性质 一个 *最多一个  另一个 *带????必然可能是最多答案这也意味着答案的长度被固定了固定在min(n1,m1)两个串不含*号的长度上。

考虑接下来如何的构造 发现前面尽可能的匹配 后面也尽可能的匹配匹配不上就是?号也就是说要让?最少了。考虑枚举*号的位置从而确定?的多少。

那么我们正着做一遍匹配倒着做一遍匹配 这样子我们直接枚举i点为* 取最少的?即可。考虑字典序 我们发现在保证?最少之前是没有字典序的限制的。

所以 而?的字典序也是如此 *越靠前越优所以我们去>即可。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000010
#define ll long long
#define mp(x,y) make_pair(x,y)
#define un unsigned
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int MAXN=;
int T,n,m;
int n1,m1;
char a[MAXN],b[MAXN];
char ansl[MAXN],ansr[MAXN];
int cntl[MAXN],cntr[MAXN];
int main()
{
freopen("1.in","r",stdin);
T=read();
while(T--)
{
scanf("%s",a+);scanf("%s",b+);
n=strlen(a+);m=strlen(b+);
n1=;m1=;
memset(cntl,,sizeof(cntl));
memset(cntr,,sizeof(cntr));
for(int i=;i<=n;++i)if(a[i]!='*')++n1;
for(int i=;i<=m;++i)if(b[i]!='*')++m1;
if(n==m&&n1==n&&m1==m)
{
for(int i=;i<=n;++i)
{
if(a[i]=='?'||b[i]=='?'){printf("?");continue;}
if(a[i]!=b[i]){printf("?");continue;}
printf("%c",a[i]);
}
puts("");continue;
}
int len=min(n1,m1)+;//答案串的总长度
int flag=;
for(int i=;i<=len;++i)
{
if(flag||a[i]=='*'||b[i]=='*')
{
flag=;cntl[i]=cntl[i-]+;
ansl[i]='?';continue;
}
else
{
if(a[i]==b[i]&&a[i]!='?')cntl[i]=cntl[i-],ansl[i]=a[i];
else cntl[i]=cntl[i-]+,ansl[i]='?';
}
}
flag=;
for(int i=len;i;--i)
{
int s1=n-(len-i),s2=m-(len-i);
if(flag||a[s1]=='*'||b[s2]=='*')
{
flag=;cntr[i]=cntr[i+]+;
ansr[i]='?';continue;
}
else
{
if(a[s1]==b[s2]&&a[s1]!='?')cntr[i]=cntr[i+],ansr[i]=a[s1];
else cntr[i]=cntr[i+]+,ansr[i]='?';
}
}
int ans=INF,pos;
for(int i=;i<=len;++i)
if(cntl[i-]+cntr[i+]<ans)
{
ans=cntl[i-]+cntr[i+];
pos=i;
}
for(int i=;i<pos;++i)printf("%c",ansl[i]);
printf("*");
for(int i=pos+;i<=len;++i)printf("%c",ansr[i]);
puts("");
}
return ;
}

T3:这题还是 一个比较有意思的题目 不过我只会暴力(不推出一些性质 那么暴力也就不可能出奇迹吧。所以看题还得推出一些性质 不要不想思考。要从题目中的信息之中不断的发掘性质。

LINK:黑 需要掉命的题目必须推出性质才能解题,鬼畜的dp。

题目大意是 给出了一段程序 求出一个排列是的最后的Y值最大。还要输出构造的排列。

开始缓慢入题 要求不妨把所有的排列都搜出来判断 显然这样是n! 乌拉然后你会发现 什么也得不到。考虑装压合并状态 f[i][j]表示 状态i且x为j的答案最大。

这玩意转移是2^n*n*x的终于得到了30分的好成绩。然后弃疗即可/cy

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define R register
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int MAXN=;
int n,X,t,w,v,s,maxx;
int a[MAXN],b[MAXN];
int q[MAXN];
int f[<<][];
int g[<<][],h[<<][];
inline void get_path(int state,int k)
{
if(!state)return;
q[++t]=g[state][k];
get_path(state^(<<(q[t]-)),h[state][k]);
}
int main()
{
//freopen("1.in","r",stdin);
X=read();n=read();
for(int i=;i<=n;++i)a[i]=read();
for(int i=;i<=n;++i)b[i]=read();
if(n<=)
{
memset(f,0xcf,sizeof(f));
f[][X]=;
for(int i=;i<(<<n);++i)
{
for(int j=;j<=X;++j)
{
if(f[i][j]<)continue;
for(int k=;k<=n;++k)
{
if(i&(<<(k-)))continue;
s=i|(<<(k-));
w=max(,j-a[k]);
v=max(,b[k]-w);
if(f[s][w]<f[i][j]+v)
{
f[s][w]=f[i][j]+v;
g[s][w]=k;h[s][w]=j;
}
}
}
}
for(int i=;i<=X;++i)
maxx=max(maxx,f[(<<n)-][i]);
for(int i=;i<=X;++i)
if(maxx==f[(<<n)-][i])
{
get_path((<<n)-,i);
break;
}
printf("%d\n",maxx);
//cout<<t<<endl;
printf("%d",q[t]);
for(int i=t-;i>=;--i)printf(" %d",q[i]);
return ;
}
}

obviously 发现一个解 或者说最优解必然是存在在前几步累计的价值都为0 也就是我们研究的阶段变成了两步一步是爆零阶段 一步是非爆零阶段 x一旦爆零那么 那么我也跟着爆零/cy

当然不是一旦爆零后面的顺序也就无所谓了 因为对答案贡献都是其累和 也就是说 我们只需要研究前面的阶段即可。 考虑dp。

如何让x以某种方式完成优美的爆零使我们的目标 这个时候 就考验我们 的爆零能力了。发现x在非爆零阶段 承受的x都是递增的。

obvious 因为在非爆零的阶段 他们带给答案的累加都是 0 那么先搞 大的这样到最后更容易获得一些值

ZR 提高十连 DAY 4的更多相关文章

  1. 提高十连测day3

    提高十连测day3 A 我们可以枚举两个 $ 1 $ 之间的相隔距离,然后计算形如 $ 00100100 \cdots $ 的串在原串中最⻓⼦序列匹配即可,复杂度 $ O(n^2) $ .寻找 $ S ...

  2. ZR提高失恋测4

    ZR提高失恋测4 比赛链接 A (方便讨论,设读入的串为\(S,T\)答案串为\(A\)) 首先\(*\)只会有一个 这是这道题目中非常重要的一个结论 简单证明一下? 因为\(*\)可以代表所有的字符 ...

  3. ZR提高失恋测3

    ZR提高失恋测3 题目链接 (感觉这一场比以往的简单了一些) 估分 100 + 40 + 40 得分 100 + 60 + 40 ??? A 首先,我们能够想到一个比较简单的\(n^2\)做法, 枚举 ...

  4. ZR提高失恋测2(9.7)

    ZR提高失恋测2(9.7) 网址http://www.zhengruioi.com/contest/392 版权原因,不放题面 A 首先,我们发现对于匹配串\(s\)中所有满足\(s_i \not = ...

  5. 将Web应用性能提高十倍的10条建议

    导读 提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其的期望值也处于 ...

  6. 将 Web 应用性能提高十倍的10条建议

    提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其的期望值也处于历史上 ...

  7. ZROI2019 提高十连测

    额 掰手指头一数 特么又是第三年十连测了= = 2017一场没打 那时候好像一场比赛也就100人左右 2018前几场还都好好补了 后来开始放飞自我了 这时候一场有150人还多了 2019想让今年的No ...

  8. JAVA提高十:ArrayList 深入分析

    前面一章节,我们介绍了集合的类图,那么本节将学习Collection 接口中最常用的子类ArrayList类,本章分为下面几部分讲解(说明本章采用的JDK1.6源码进行分析,因为个人认为虽然JDK1. ...

  9. JAVA提高十二:HashMap深入分析

    首先想说的是关于HashMap源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...

随机推荐

  1. 让MySQL为我们记录执行流程

    让MySQL为我们记录执行流程   我们可以开启profiling,让MySQL为我们记录SQL语句的执行流程   查看profiling参数 shell > select @@profilin ...

  2. efcore 跨表查询,实现一个接口内查询两个不同数据库里各自的表数据

    最近有efcore跨库查询的需求,研究了下colder框架里文档的分库实现,发现并不能完全实现一个接口下的跨库查询请求,只能满足一个业务层构造指定的唯一一个数据库访问接口. 先说下文档是怎么实现的 D ...

  3. HTB::Postman

    实验环境 渗透过程 0x01 信息搜集 masscan扫描 扫描结果目标服务开放了22(ssh),80(http),6379(redis),10000(webmin)端口 nmap扫描 nmap -s ...

  4. 数据可视化实例(三): 散点图(pandas,matplotlib,numpy)

    关联 (Correlation) 关联图表用于可视化2个或更多变量之间的关系. 也就是说,一个变量如何相对于另一个变化. 散点图(Scatter plot) 散点图是用于研究两个变量之间关系的经典的和 ...

  5. scrapy 源码解析 (三):启动流程源码分析(三) ExecutionEngine执行引擎

    ExecutionEngine执行引擎 上一篇分析了CrawlerProcess和Crawler对象的建立过程,在最终调用CrawlerProcess.start()之前,会首先建立Execution ...

  6. 数据可视化之PowerQuery篇(七)Power Query应用技巧:批量更改列名

    https://zhuanlan.zhihu.com/p/130460772 ​今天分享一个PowerQuery的小技巧,导入到PowerBI中的数据,如果想要更改数据的列名,可以在PQ编辑器中直接双 ...

  7. linux专题(四):常用的基本命令(二)基本属性

    看懂文件属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. 在Li ...

  8. 浏览器常见攻击方式(XSS和CSRF)

    常见的浏览器攻击分为两种,一种为XSS(跨站脚本攻击),另一种则为CSRF(跨站请求伪造). XSS(跨站脚本攻击) 定义 XSS 全称是 Cross Site Scripting,为了与“CSS”区 ...

  9. Git操作(二)

    很久以前写的git入门,最近又巩固了一下Git分支操作,下面是我的一些整理. 1.分支与合并 #创建并切换到该分支 git checkout -b xxx #查看当前分支 git branch #进行 ...

  10. Flutter 快捷开发 Mac Android Studio 篇

    老孟导读:此快捷方式适用于Mac下的 Android Studio .Windows 下的快捷方式请参考这篇文章:https://juejin.im/post/5efe71365188252e7d7f ...