车如流水马如龙,花月正春风

前言

其实,一开始 T1 是看错了题的,我以为是无向图来着,就想直接搞到每一个联通块的完全图,然后减去总边数就好了。

发现错误之后,码了个暴力,想得 40pts 来着,没想到 C++11O2 编辑器搞不了没有返回值的 int 函数,挂了40分。

对于 T2 第一眼就是一个贪心就可以搞定的,花的时间也比较少,但没想到是得分最多的(70pts)。

T3 的话,剩下时间也不多了,就看准了那个特殊性质,但是割边板子忘了,然后就又想到了下午做的有机化学之神,就码了一个边双,判断边的两个端点是不是在同一个边双里,然后就又挂了20分,只搞到了 10pts 。

T1 世界线

解题思路

正解是搞的拓扑排序(当然如果你精通各种 XIN_Team 算法,也不是卡不过)

主要思路是将每一个点的贡献下放到有连边的子节点上。

然后就是裸的 DAG 了,因为需要将两个集合合并起来,用 bitset 显然是最好的选择。

因为空间卡的比较紧,我们直接开一半的 bitset 用完之后回收就好了。

code

40pts 暴力

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int K=1e4+10,N=6e4+10,M=1e5+10;
int n,m,ans;
int tot,head[N],ver[M<<1],nxt[M<<1];
bitset<N/2> vis[N],b[N];
void add_edge(int x,int y)
{
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int top)
{
if(!vis[top][x]&&top!=x) ans++;
if(b[top][x]) return ;
vis[top][x]=1;
b[top][x]=1;
for(int i=head[x];i;i=nxt[i])
dfs(ver[i],top);
}
signed main()
{
n=read();
m=read();
for(int i=1,x,y;i<=m;i++)
{
x=read();
y=read();
add_edge(x,y);
vis[x][y]=1;
}
for(int i=1;i<=n;i++)
dfs(i,i);
printf("%d\n",ans);
return 0;
}

正解

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=6e4+10,M=1e5+10;
int n,m,ans,tot,du[N],id[N];
int cnt,bac[N];
vector<int> v[N];
bitset<N> s[N/2];
queue<int> q;
int New()
{
int temp;
if(cnt)
{
temp=bac[cnt--];
s[temp].reset();
}
else temp=++tot;
return temp;
}
signed main()
{
n=read();
m=read();
for(int i=1,x,y;i<=m;i++)
{
x=read();
y=read();
v[x].push_back(y);
du[y]++;
}
for(int i=1;i<=n;i++)
if(!du[i])
{
id[i]=New();
q.push(i);
s[id[i]][i]=1;
}
while(!q.empty())
{
int y=q.front();
q.pop();
ans+=s[id[y]].count()-1;
for(int i=0;i<v[y].size();i++)
{
int to=v[y][i];
if(!id[to]) id[to]=New();
s[id[to]][to]=1;
s[id[to]]|=s[id[y]];
du[to]--;
if(!du[to]) q.push(to);
}
bac[++cnt]=id[y];
}
printf("%d\n",ans-m);
return 0;
}

T2 时间机器

解题思路

比较简单的一个题了,先对于电阻和电压都按照 low 排个序。

枚举电压,然后对于每一个 low 符合条件的电阻将 high 排一个序,贪心选择 high 较小的就行。

如果电压有剩余就证明不可行,反之就是对的。

正解就是在此基础上用 set 进行优化,有一种莫队的感觉。

只可惜我一时糊涂,在我这垃圾暴力上拼命优化(优化了个寂寞)。

后来发现这么优化不和暴力排序一样吗???????(我裂开,亏我还因为重载运算符的原因手写了一个二分)

还有就是如果你的 set 删除元素的时候传入的普通变量会删除掉所有的同样的变量,因此这样过不了样例(但是可以 A 题)

所以传的时候注意传地址,迭代器。

code

裸的70pts暴力

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=4e5+10;
int T,n,m,sta[N],top;
vector<int> v;
struct Node
{
int hig,low,sum;
void insert()
{
low=read();
hig=read();
sum=read();
}
}u[N],r[N];
void solve1()
{
int tot=0,sum=u[1].sum,hig=u[1].hig,low=u[1].low;
for(int i=1;i<=m;i++)
if(hig<=r[i].hig&&low>=r[i].low)
tot+=r[i].sum;
if(tot>=sum) printf("Yes\n");
else printf("No\n");
}
bool comp(Node x,Node y)
{
if(x.low!=y.low) return x.low<y.low;
if(x.hig!=y.hig) return x.hig<y.hig;
return x.sum>y.sum;
}
bool cmp(int x,int y)
{
return r[x].hig>r[y].hig;
}
void solve2()
{
sort(u+1,u+n+1,comp);
sort(r+1,r+m+1,comp);
for(int i=1;i<=n;i++)
{
top=0;
for(int j=m;j>=1;j--)
{
if(!r[j].sum) continue;
if(r[j].low<=u[i].low)
sta[++top]=j;
}
if(!top)
{
printf("No\n");
return ;
}
sort(sta+1,sta+top+1,cmp);
for(int j=1;j<=top;j++)
if(r[sta[j]].hig<u[i].hig)
{
top=j-1;
break;
}
if(!top)
{
printf("No\n");
return ;
}
int tot=u[i].sum;
for(int j=top;j>=1;j--)
{
if(!tot) break;
if(r[sta[j]].sum<=tot)
{
tot-=r[sta[j]].sum;
r[sta[j]].sum=0;
continue;
}
r[sta[j]].sum-=tot;
tot=0;
break;
}
if(tot)
{
printf("No\n");
return ;
}
}
printf("Yes\n");
}
signed main()
{
T=read();
while(T--)
{
n=read();
m=read();
for(int i=1;i<=n;i++)
u[i].insert();
for(int i=1;i<=m;i++)
r[i].insert();
if(n==1) solve1();
else solve2(); }
return 0;
}

set 以及 二分优化的暴力

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=4e5+10,INF=1e18;
int T,n,m,sta[N],top;
vector<int> v;
struct Node
{
int hig,low,sum,id;
void insert()
{
low=read();
hig=read();
sum=read();
}
friend bool operator <(Node x,Node y)
{
return x.hig<y.hig;
}
friend bool operator ==(Node x,Node y)
{
return x.hig==y.hig;
}
friend bool operator >(Node x,Node y)
{
return x.hig>y.hig;
}
}u[N],r[N];
multiset<Node> s;
bool comp(Node x,Node y)
{
if(x.low!=y.low) return x.low<y.low;
if(x.hig!=y.hig) return x.hig<y.hig;
return x.sum>y.sum;
}
bool cmp(int x,int y)
{
return r[x].hig>r[y].hig;
}
inline void solve2()
{
sort(u+1,u+n+1,comp);
sort(r+1,r+m+1,comp);
for(int i=1;i<=n;i++)
u[i].id=i;
for(int i=1;i<=m;i++)
r[i].id=i;
for(int i=1;i<=n;i++)
{
top=m;
int l=1,rr=m;
while(l<=rr)
{
int mid=(l+rr)>>1;
if(r[mid].low>u[i].low) rr=mid-1;
else l=mid+1,top=mid;
}
for(int j=1;j<=m;j++)
if(r[j].low>u[i].low)
{
top=j-1;
break;
}
if(!top)
{
printf("No\n");
return ;
}
s.clear();
for(int j=1;j<=top;j++)
if(r[j].sum)
s.insert(r[j]);
s.insert((Node){INF,0,0,0});
multiset<Node>::iterator it=s.lower_bound(u[i]);
Node temp=*it;
if(temp.hig==INF)
{
printf("No\n");
return ;
}
if(temp.hig<u[i].hig)
it++;
int tot=u[i].sum;
for(multiset<Node>::iterator j=it;j!=s.end();j++)
{
temp=*j;
if(temp.hig==INF) break;
if(!tot) break;
if(!temp.sum) continue;
if(temp.sum<=tot)
{
tot-=temp.sum;
r[temp.id].sum=0;
continue;
}
r[temp.id].sum-=tot;
tot=0;
break;
}
if(tot)
{
printf("No\n");
return ;
}
}
printf("Yes\n");
}
signed main()
{
T=read();
while(T--)
{
n=read();
m=read();
for(int i=1;i<=n;i++)
u[i].insert();
for(int i=1;i<=m;i++)
r[i].insert();
solve2();
}
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=4e5+10,INF=1e18;
int T,n,m,sta[N],top;
vector<int> v;
struct Node
{
int hig,low,sum,id;
void insert()
{
low=read();
hig=read();
sum=read();
}
friend bool operator <(Node x,Node y)
{
return x.hig<y.hig;
}
friend bool operator ==(Node x,Node y)
{
return x.hig==y.hig;
}
friend bool operator >(Node x,Node y)
{
return x.hig>y.hig;
}
}u[N],r[N];
multiset<Node> s;
bool comp(Node x,Node y)
{
if(x.low!=y.low) return x.low<y.low;
if(x.hig!=y.hig) return x.hig<y.hig;
return x.sum>y.sum;
}
bool cmp(int x,int y)
{
return r[x].hig>r[y].hig;
}
inline void solve2()
{
s.clear();
s.insert((Node){INF,0,0,0});
sort(u+1,u+n+1,comp);
sort(r+1,r+m+1,comp);
for(int i=1;i<=n;i++)
u[i].id=i;
for(int i=1;i<=m;i++)
r[i].id=i;
bool judge=false;
for(int i=1,j=1;i<=n;i++)
{
while(j<=m&&r[j].low<=u[i].low)
{
s.insert(r[j]);
j++;
}
while(u[i].sum&&!s.empty())
{
multiset<Node>::iterator it=s.lower_bound(u[i]);
Node temp=*it;
if(temp.hig==INF)
{
judge=true;
break;
}
s.erase(it);
if(temp.sum<=u[i].sum)
u[i].sum-=temp.sum;
else
{
temp.sum-=u[i].sum;
u[i].sum=0;
s.insert(temp);
}
}
if(u[i].sum) judge=true;
if(judge) break;
}
if(judge) printf("No\n");
else printf("Yes\n");
}
signed main()
{
T=read();
while(T--)
{
n=read();
m=read();
for(int i=1;i<=n;i++)
u[i].insert();
for(int i=1;i<=m;i++)
r[i].insert();
solve2();
}
return 0;
}

T3 weight

解题思路

这个题好像和前两道并不是一套的,而且非常的恶心人。

特殊性质就不多说了,下面会给出代码。

正解是先搞出一棵最小生成树,对于树边和非树边进行分类讨论。

  • 非树边

    至少要将它的权证调整到树上两个端点对应路径边权最大值-1才可以,否则这条边就一定不会被选上。

  • 树边

    对于两个端点的简单路径经过树的哪些边,与非树边相反,我们应该选择那些边中最小权值-1

    只有这样才可以保证它在最小生成树上。

对于上面的操作可以进行树链剖分,然后用线段树维护,进行区间修改,单点查询等一系列操作。

code

特殊性质

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=7e4+10,M=1e5+10;
int n,m,cnt,total,task,ans[M],fa[N];
int tot=1,head[N],ver[M<<1],nxt[M<<1],edge[M<<1];
int tim,dfn[N],low[N];
bool vis[M<<1];
struct Node
{
int id,l,r;
}pat[M],rod[M];
void add_edge(int x,int y,int v)
{
ver[++tot]=y;
edge[tot]=v;
nxt[tot]=head[x];
head[x]=tot;
}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
inline void tarjan(int x,int fro)
{
dfn[x]=low[x]=++tim;
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i];
if(!dfn[to])
{
tarjan(to,i);
low[x]=min(low[x],low[to]);
if(low[to]>dfn[x])
{
vis[i]=vis[i^1]=true;
}
}
else if(i!=(fro^1))
low[x]=min(low[x],dfn[to]);
}
}
void solve1()
{
for(int i=1,val;i<=m;i++)
{
pat[i].l=read();
pat[i].r=read();
val=read();
pat[i].id=i;
add_edge(pat[i].l,pat[i].r,val);
add_edge(pat[i].r,pat[i].l,val);
}
tarjan(1,0);
for(int i=2;i<=tot;i+=2)
if(vis[i])
ans[i/2]=-1;
for(int i=1;i<=m;i++)
printf("%lld ",ans[i]);
}
signed main()
{
n=read();
m=read();
task=read();
if(task) solve1();
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=1e5+10,M=1e5+10,INF=1e9;
int n,m,task;
int tim,dfn[N],topp[N],siz[N],son[N],dep[N],fat[N],id[N];
int fa[N],s[N],ans[N];
bool vis[N];
struct Edge
{
int tot,id[M<<1],head[N],ver[M<<1],nxt[M<<1],edge[M<<1];
void add(int x,int y,int val,int pos)
{
ver[++tot]=y;
edge[tot]=val;
id[tot]=pos;
nxt[tot]=head[x];
head[x]=tot;
}
}e1,e2;
struct Road
{
int l,r,id,val;
void insert(int pos)
{
l=read();
r=read();
val=read();
id=pos;
}
}pat[M],rod[M];
struct Segment_Tree
{
int mn,mx,laz;
}tre[N<<2];
int nod[M],sid[N],root;
void dfs1(int x)
{
siz[x]=1;
for(int i=e1.head[x];i;i=e1.nxt[i])
{
int to=e1.ver[i];
if(siz[to]) continue;
dep[to]=dep[x]+1;
fat[to]=x;
dfs1(to);
siz[x]+=siz[to];
if(siz[to]>siz[son[x]])
{
sid[x]=i;
son[x]=to;
}
}
}
void dfs2(int x,int tp)
{
topp[x]=tp;
dfn[x]=++tim;
id[tim]=x;
if(son[x])
{
s[son[x]]=e1.edge[sid[x]];
nod[e1.id[sid[x]]]=son[x];
dfs2(son[x],tp);
}
for(int i=e1.head[x];i;i=e1.nxt[i])
if(!dfn[e1.ver[i]])
{
s[e1.ver[i]]=e1.edge[i];
nod[e1.id[i]]=e1.ver[i];
dfs2(e1.ver[i],e1.ver[i]);
}
}
bool comp(Road x,Road y)
{
return x.val<y.val;
}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void Kruskal()
{
for(int i=1;i<=m;i++)
rod[i]=pat[i];
for(int i=1;i<=n;i++)
fa[i]=i;
sort(rod+1,rod+m+1,comp);
for(int i=1;i<=m;i++)
{
int x=find(rod[i].l);
int y=find(rod[i].r);
if(x==y) continue;
fa[x]=y;
vis[rod[i].id]=true;
e1.add(rod[i].l,rod[i].r,rod[i].val,rod[i].id);
e1.add(rod[i].r,rod[i].l,rod[i].val,rod[i].id);
}
root=fa[find(1)];
}
void push_down(int x)
{
if(tre[x].laz==INF) return ;
tre[ls].laz=min(tre[ls].laz,tre[x].laz);
tre[ls].mn=min(tre[ls].mn,tre[x].laz);
tre[rs].laz=min(tre[rs].laz,tre[x].laz);
tre[rs].mn=min(tre[rs].mn,tre[x].laz);
tre[x].laz=INF;
}
void build(int x,int l,int r)
{
tre[x].mn=tre[x].laz=INF;
if(l==r)
{
tre[x].mx=s[id[l]];
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
tre[x].mx=max(tre[ls].mx,tre[rs].mx);
}
void update(int x,int l,int r,int L,int R,int num)
{
if(L>R) return ;
if(L<=l&&r<=R)
{
tre[x].mn=min(tre[x].mn,num);
tre[x].laz=min(tre[x].laz,num);
return ;
}
push_down(x);
int mid=(l+r)>>1;
if(L<=mid) update(ls,l,mid,L,R,num);
if(R>mid) update(rs,mid+1,r,L,R,num);
return ;
}
int query_max(int x,int l,int r,int L,int R)
{
if(L>R) return 0;
if(L<=l&&r<=R)
return tre[x].mx;
int mid=(l+r)>>1,maxn=0;
if(L<=mid) maxn=query_max(ls,l,mid,L,R);
if(R>mid) maxn=max(maxn,query_max(rs,mid+1,r,L,R));
return maxn;
}
int query(int x,int l,int r,int pos)
{
if(l==r) return tre[x].mn==INF?-1:tre[x].mn;
int mid=(l+r)>>1;
push_down(x);
if(pos<=mid) return query(ls,l,mid,pos);
return query(rs,mid+1,r,pos);
}
void solve(int x,int y,int val,int pos)
{
if(!topp[x]||!topp[y]) return ;
while(topp[x]^topp[y])
{
if(dep[topp[x]]<dep[topp[y]])
swap(x,y);
update(1,1,tim,dfn[topp[x]],dfn[x],val);
ans[pos]=max(ans[pos],query_max(1,1,tim,dfn[topp[x]],dfn[x])-1);
x=fat[topp[x]];
}
if(dep[x]<dep[y]) swap(x,y);
update(1,1,tim,dfn[y]+1,dfn[x],val);
ans[pos]=max(ans[pos],query_max(1,1,tim,dfn[y]+1,dfn[x])-1);
}
signed main()
{
// freopen("date.in","r",stdin);
n=read();
m=read();
task=read();
for(int i=1;i<=m;i++)
pat[i].insert(i);
Kruskal();
dfs1(1);
dfs2(1,1);
build(1,1,tim);
for(int i=1;i<=m;i++)
if(vis[i]==0)
solve(pat[i].l,pat[i].r,pat[i].val-1,i);
for(int i=1;i<=m;i++)
{
if(find(pat[i].l)!=root||find(pat[i].r)!=root)
{
ans[i]=0;;
vis[i]=false;
}
if(vis[i])
ans[i]=query(1,1,tim,dfn[nod[i]]);
}
for(int i=1;i<=m;i++)
printf("%lld ",ans[i]);
return 0;
}

7.16考试总结(NOIP模拟17)[世界线·时间机器·weight]的更多相关文章

  1. [考试总结]noip模拟17

    爆零了! 菜爆了 弱展了 垃爆了 没有什么可以掩饰你的菜了 这次考试为我带来了第一个 \(\color{red}{ \huge{0}}\) 分,十分欣慰.... 最近的暴力都打不对,你还想什么正解?? ...

  2. 2021.8.16考试总结[NOIP模拟41]

    T1 你相信引力吗 肯定是单调栈维护.但存在重复值,还是个环,不好搞. 发现取区间时不会越过最大值,因此以最大值为断点将环断为序列.在栈里维护当前栈中有多少个与当前元素相等的元素,小分类讨论一下. 最 ...

  3. NOIP 模拟 $17\; \rm 时间机器$

    题解 \(by\;zj\varphi\) 一道贪心的题目 我们先将节点和电阻按左边界排序,相同的按右边界排序 对于每一个节点,我们发现,选取左边界小于等于它的电阻中右边界大于它且最接近的它的一定是最优 ...

  4. NOIP模拟 17.8.16

    NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

  5. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  6. NOIP模拟17.9.21

    NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...

  7. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  8. NOIP模拟 17.8.20

    NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...

  9. NOIP模拟 17.8.18

    NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...

  10. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

随机推荐

  1. c# webapi swagger

    如何配置swagger? 在使用项目中,我们希望去查看我们的webapi的测试,那么我们是需要去有一个集成的测试的. 步骤 1.在nutget管理包中下载swagger包. 2.这样会在App_sta ...

  2. allure常用

    overview:概述页面:categories:分类目录:suites:按套件和类分组的已执行测试的标准结构:graphs:图表:timeline:时间线:behaviors:可根据epic.fea ...

  3. xxx,一个神奇的 Python 库

    前几天,我在<技术周刊的转变:如何平衡热爱与现实?>一文里写过国内 Python 自媒体圈在近几年的两个现象(仅个人观感,无科学数据支撑): Python 广告投放出现断崖式萎缩 Pyth ...

  4. git fork 项目的更新

    fork:github网站的操作,将开源项目复制一份到自己的仓库中 那fork的项目在原仓库更新后,如何同步呢? 1.查看远程仓库 $ git remote -v origin https://cod ...

  5. 前端之多线程 ---webworker

    一.啥是workerJavaScript为单线程,worker则为JavaScript创建多线程环境.使用场景如:计算文件hash,计算大于1G的文件hash过程是很慢的,但由于要将hash传给后端, ...

  6. 自动化部署脚本--一键部署单机版k8s

    cat danjiDeploy_k8s.sh #!/bin/bash . /etc/init.d/functions # 版本 VERSION=v1.0.1 # IP地址,默认为本机第一块网卡IP地址 ...

  7. 科普达人丨一图看懂阿里云ECS

    简介: 建议收藏  原文链接:https://click.aliyun.com/m/1000363154/ 本文为阿里云原创内容,未经允许不得转载.

  8. HBase读链路分析

    ​简介:HBase的存储引擎是基于LSM-Like树实现的,更新操作不会直接去更新数据,而是使用各种type字段(put,delete)来标记一个新的多版本数据,采用定期compaction的形式来归 ...

  9. Kubernetes 稳定性保障手册:洞察+预案

    简介: 稳定性保障是个复杂的话题,需要有效.可迭代.可持续保障集群的稳定性,系统性的方法或许可以解决该问题. 作者 | 悟鹏来源 | 阿里巴巴云原生公众号 <Kubernetes 稳定性保障手册 ...

  10. 一文搞懂物联网Modbus通讯协议

    简介: 一般来说,常见的物联网通讯协议众多,如蓝牙.Zigbee.WiFi.ModBus.PROFINET.EtherCAT.蜂窝等.而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协 ...