2.12 模拟

文章目录

  • 前言
  • 题目解析
    • 染色计划(color)
    • 奇度边集(edges)
    • 猜拳游戏(guess)
  • 代码
    • T1
    • T2
      • LCT
      • 整体二分
  • 总结

前言

120pts
期望:40+100+20=160
实际:40+60+20=120
rnk 9

我yue了。
怎么又是不可抗力性挂分…
ybt的数据锅了,点编号竟然有0,splay(0)直接RE到天荒地老。
就这还有人过?
但这次这个T2做的还是挺不错的,虽然做了两个点,但是确实是一道挺难的题。
为什么分都这么高啊qwq
人强我菜。

题目解析

染色计划(color)

这个题挺妙的。
不是特别难,但做完B确实没有太多时间想这个题了。

考虑点分治。
我们每次对于分治重心,都强制让它被选取,把其颜色的点加入队列。每次弹出队首,每次往当前的父亲(即重心方向)跳,将途中未入队的颜色加入队列。如果遇到当前分治联通块以外的点,就直接放弃这次更新答案。
关于正确性:反过来想,对于最优方案,必然存在一个点分治过程中的联通块,使得最优方案的联通子树出现在一个极大的分治联通块中,且经过这个联通块。(一开始可以把这个联通块设为全集,若不过重心,就可以往一个联通块递归)

还有一个虚树的做法,但pdf讲的很草率,我也没明白…但是似乎就是对我写的那个暴力思路的一定优化。

奇度边集(edges)

大概在九点的时候看到了本题的关键性质:合法的充要条件是所有联通块的点数均为偶数
于是决定这次考试就搞它了。
这个题确实挺难的,我以为看到这个性质之后应该就呼之欲出了,结果呼了半天也没出来…
想了很多方面,由于显然的二分性,也想过整体二分,但是常规的整体二分做不了之后我就放弃了,也是因为整体二分是比较冷门的算法

LCT的做法似乎还是比较好想的。
从已经存在解的时刻(可以并查集简单求出),然后开始考虑优化答案。
最优解必然在最小生成森林上,这也是LCT的拿手好戏。
然后每次只需要尝试删去权值最大的边,这个边可以用 set 来找到。
能删去当且仅当边两侧的联通块都是偶数大小。
个人的做法比较粗暴,就是维护虚子树大小,然后暴力把边断开,看看两遍大小,如果不能断就再连回去。
由于每条边只能删一次,总复杂度 O(nlog⁡n)O(n\log n)O(nlogn)
然而修完数据后一交发现T成70,啊哈!
CF神机尚且给4s,ybt破机器给1s就离谱。

无奈只好看看整体二分怎么做。
(似乎主流说这个做法是sdq分治,但个人认为更像整体二分,但名字也不重要吧)
实现不是特别难,但是不太容易想到。(和LCT正好反过来
显然但重要的性质:答案单调不升。
常规的递归函数 solve(l,r,L,R)solve(l,r,L,R)solve(l,r,L,R),表示 (l,r)(l,r)(l,r) 处理的询问,答案属于 [L,R][L,R][L,R]
需要保证在执行该函数时加入且仅加入了 [1,l−1][1,l-1][1,l1] 的所有边权属于 [1,L][1,L][1,L] 的边。
尝试求出 midmidmid 的答案。先把 [l,mid][l,mid][l,mid] 边权属于 [1,L][1,L][1,L] 的边加入,再从 LLL 开始权值从小到大枚举边,把所有 [1,mid][1,mid][1,mid] 的边加入,直到符合要求,当前边权即 ansmidans_{mid}ansmid

然后就是递归处理 solve(l,mid−1,ansmid,R),solve(mid+1,r,L,ansmid)solve(l,mid-1,ans_{mid},R),solve(mid+1,r,L,ans_{mid})solve(l,mid1,ansmid,R),solve(mid+1,r,L,ansmid),注意依然要满足前提保证。
考虑单层复杂度是 O((r−l)+(R−L))O((r-l)+(R-L))O((rl)+(RL)),由于递归的每层值域和询问区间的大小都是 O(m)O(m)O(m),所以递归树大小为 O(mlog⁡m)O(m\log m)O(mlogm)
需要启发式合并带log的可撤销并查集,总复杂度 O(mlog⁡mlog⁡n)O(m\log m\log n)O(mlogmlogn)

猜拳游戏(guess)

三进制 FWT神题。
然鹅我FWT已经全忘光乐,啊哈!
好像还需要一点矩阵相关,可我线代还几乎属于知识荒漠…
直接开摆

代码

T1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=3e5+100;int n,m;
int ans=2e9;struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}
vector<int>v[N];
int hson[N],S,rt,siz[N],mx[N],vis[N],tag[N],tim,fa[N];
int col[N];
void findrt(int x,int f){siz[x]=1;tag[x]=tim;mx[x]=0;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f||vis[to]) continue;findrt(to,x);siz[x]+=siz[to];if(mx[x]<siz[to]) mx[x]=siz[to];}mx[x]=max(mx[x],S-siz[x]);if(mx[x]<mx[rt]) rt=x;return;
}
void dfs(int x,int f){fa[x]=f;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f||vis[to]) continue;dfs(to,x);}return;
}
int q[N],st,ed,jd[N],inque[N];
bool add(int c){jd[c]=tim;for(int x:v[c]){if(tag[x]!=tim) return false;q[++ed]=x;inque[x]=tim;//printf("  add: %d\n",x);}return true;
}
void calc(int rt){st=1;ed=0;if(!add(col[rt])) return;int res(0);while(st<=ed){int now=q[st++];if(fa[now]) now=fa[now];while(inque[now]!=tim){//printf("now=%d\n",now);if(jd[col[now]]!=tim){if(!add(col[now])) return;++res;}now=fa[now];}}ans=min(ans,res);
}
void solve(int x,int nS){++tim;S=nS;rt=0;findrt(x,0);x=rt;vis[x]=1;dfs(x,0);//printf("x=%d\n",x);calc(x);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;solve(to,nS-mx[to]);}return;
}signed main(){freopen("color.in","r",stdin);freopen("color.out","w",stdout);memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();mx[0]=2e9;for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}for(int i=1;i<=n;i++){col[i]=read();v[col[i]].push_back(i);}solve(1,n);printf("%d\n",ans);return 0;
}
/*
*/

T2

LCT

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
void write(ll x){if(x>9) write(x/10);putchar('0'+x%10);
}
const int N=4e5+100;int n,m;struct edge{int x,y,w,id;bool operator < (const edge oth)const{if(w!=oth.w) return w<oth.w;else return id<oth.id;}
}e[N];
set<edge>s;int tr[N][2],f[N],rev[N],val[N],mx[N],tot,siz1[N],siz2[N];
inline bool nroot(int x){return tr[f[x]][0]==x||tr[f[x]][1]==x;
}
inline bool which(int x){return tr[f[x]][1]==x;
}
inline void pushup(int x){mx[x]=x;if(tr[x][0]){if(val[mx[tr[x][0]]]>val[mx[x]]) mx[x]=mx[tr[x][0]];}if(tr[x][1]){if(val[mx[tr[x][1]]]>val[mx[x]]) mx[x]=mx[tr[x][1]];}siz1[x]=siz1[tr[x][0]]+siz1[tr[x][1]]+siz2[x]+(x<=n);return;
}
inline void Rev(int x){if(x){rev[x]^=1;swap(tr[x][0],tr[x][1]);}
}
inline void pushdown(int x){if(rev[x]){rev[x]=0;Rev(tr[x][0]);Rev(tr[x][1]);}
}
inline void rotate(int x){int fa=f[x],gfa=f[fa];int d=which(x),son=tr[x][d^1];f[x]=gfa;if(nroot(fa)) tr[gfa][which(fa)]=x;f[fa]=x;tr[x][d^1]=fa;if(son){f[son]=fa;}tr[fa][d]=son;pushup(fa);pushup(x);return;
}
int zhan[N];
inline void splay(int x){int y(x),top(0);zhan[++top]=y;//debug("splay %d\n",x);while(nroot(y)) zhan[++top]=y=f[y];//debug("  %d\n",y);while(top) pushdown(zhan[top--]);for(int fa;fa=f[x],nroot(x);rotate(x)){if(nroot(fa)) which(fa)==which(x)?rotate(fa):rotate(x);}
}
inline void access(int x){for(int y(0);x;y=x,x=f[x]){splay(x);siz2[x]+=siz1[tr[x][1]];tr[x][1]=y;siz2[x]-=siz1[tr[x][1]];pushup(x);}
}
inline void makeroot(int x){access(x);splay(x);Rev(x);
}
inline int findroot(int x){access(x);splay(x);while(pushdown(x),tr[x][0]) x=tr[x][0];return x;
}
inline void split(int x,int y){makeroot(x);access(y);splay(y);
}
inline void link(int x,int y){//printf("link: %d %d\n",x,y);//assert(findroot(x)!=findroot(y));makeroot(x);//makeroot(y);access(y);splay(y);f[x]=y;siz2[y]+=siz1[x];pushup(y);return;
}
inline void cut(int x,int y){//printf("cut: %d %d\n",x,y);split(x,y);//if(tr[y][0]!=x||tr[x][1]){//  printf("!!\n");//  print();//  exit(0);//}//assert(tr[y][0]==x&&!tr[x][1]);tr[y][0]=f[x]=0;pushup(y);return;
}
inline int Siz(int x){makeroot(x);return siz1[x];
}int fa[N],siz[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}
inline void merge(int x,int y){x=find(x),y=find(y);if(x==y) return;if(siz[x]>siz[y]) swap(x,y);fa[x]=y;siz[y]+=siz[x];return;
}int calc(){for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;int num=n;for(auto e:s){int x=find(e.x),y=find(e.y);if(x!=y&&(siz[x]&1)&&(siz[y]&1)) num-=2;merge(x,y);//printf("  (%d %d) tot=%d\n",x,y,tot);if(!num) return e.w;}return -1;
}
void bf(){for(int i=1;i<=m;i++){//printf("\ni=%d\n",i);e[i]=(edge){(int)read(),(int)read(),(int)read(),i};s.insert(e[i]);printf("%d\n",calc());}
}
int nam[N],bel[N];
void solve(){for(int i=0;i<=n;i++) val[i]=-1;tot=n;for(int i=1;i<=n;i++){fa[i]=i,siz[i]=siz1[i]=1;mx[i]=i;}int num=n;for(int i=1;i<=m;i++){//ok;int x=read(),y=read(),w=read();e[i]=(edge){x,y,w,i};if(x!=y){//printf("i=%d (%d %d %d) findroot=%d %d\n",i,x,y,w,findroot(x),findroot(y));if(find(x)!=find(y)){s.insert(e[i]);++tot;val[tot]=w;link(x,tot);link(y,tot);nam[i]=tot;bel[tot]=i;}else{split(x,y);int o=mx[y];if(val[o]>w){s.insert(e[i]);makeroot(o);//splay(o);tr[o][0]=f[tr[o][0]]=0;tr[o][1]=f[tr[o][1]]=0;s.erase(e[bel[o]]);++tot;val[tot]=w;link(x,tot);link(y,tot);nam[i]=tot;bel[tot]=i;}}}if(find(x)!=find(y)&&(siz[find(x)]&1)&&(siz[find(y)]&1)) num-=2;//printf("x=%d y=%d find=%d %d siz=%d %d num=%d\n",//x,y,find(x),find(y),siz[find(x)],siz[find(y)],num);merge(x,y);if(num) puts("-1");else{while(1){//debug("1\n");edge o=(*s.rbegin());//debug("2\n");int x=o.x,y=o.y,k=o.id,id=nam[k];      cut(id,x);cut(id,y);//debug("2\n");//printf("  k=%d (%d %d) id=%d siz=%d %d\n",k,x,y,id,Siz(x),Siz(y));if((Siz(x)&1)==0&&(Siz(y)&1)==0){s.erase(s.find(o));}else{//printf("recover\n");link(id,x);link(id,y);printf("%d\n",o.w);break;}}}//print();}return;
}signed main(){freopen("edges.in","r",stdin);freopen("edges.out","w",stdout);n=read();m=read();if(n<=1000&&m<=3000) bf();else solve();//solve();return 0;
}
/*
*/

整体二分

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=8e5+100;
const int M=1e6+100;int n,m,p,q;int fa[N],siz[N],u[N],v[N],top,num;
int find(int x){return fa[x]==x?x:find(fa[x]);
}
inline void merge(int x,int y){if(!x||!y) return;x=find(x);y=find(y);if(x==y) return;if((siz[x]&1)&&(siz[y]&1)) num-=2;if(siz[x]>siz[y]) swap(x,y);fa[x]=y;siz[y]+=siz[x];++top;u[top]=x;v[top]=y;//printf("merge: %d %d num=%d\n",x,y,num);return;
}
inline void recover(int goal){while(top!=goal){int x=u[top],y=v[top];fa[x]=x;siz[y]-=siz[x];if((siz[x]&1)&&(siz[y]&1)) num+=2;--top;}return;
}struct edge{int x,y,w,id;
}e[N],E[N];
bool cmp(edge x,edge y){return x.w<y.w;
}
int mx;
int ans[N];
void solve(int l,int r,int L,int R){if(l>r) return;if(L==R){for(int i=l;i<=r;i++) ans[i]=L;return;}//printf("solve: (%d %d) (%d %d)\n",l,r,L,R);int mid=(l+r)>>1,pre=top;for(int i=l;i<=mid;i++){if(e[i].w<=E[L].w) merge(e[i].x,e[i].y);}int o=top;//recover(pre);for(int i=L;i<=R;i++){if(E[i].id<=mid) merge(E[i].x,E[i].y);if(!num){ans[mid]=i;break;}}if(!ans[mid]) ans[mid]=m+1;//printf("mid=%d ans=%d\n",mid,ans[mid]);recover(o);solve(mid+1,r,L,ans[mid]);recover(pre);for(int i=L;i<=min(m,ans[mid]);i++){if(E[i].id<l) merge(E[i].x,E[i].y);}solve(l,mid-1,ans[mid],R);recover(pre);
}
signed main(){freopen("edges.in","r",stdin);freopen("edges.out","w",stdout);n=read();m=read();num=n;for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;for(int i=1;i<=m;i++){e[i]=E[i]=(edge){(int)read(),(int)read(),(int)read(),i};mx=max(mx,e[i].w);//printf("(%d %d)\n",e[i].x,e[i].y);}sort(E+1,E+1+m,cmp);solve(1,m,1,m+1);for(int i=1;i<=m;i++) printf("%d\n",ans[i]<=m?E[ans[i]].w:-1);return 0;
}
/*
*/

总结

没有挂分,就还是不错的。
但是今天在T2上花的时间有点过长了…
但是确实没有浪费时间,想解法,码代码,debug,对拍,过程中一直在做事。
还是要加快节奏吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acwing1069. 凸多边形的划分

Acwing1069. 凸多边形的划分 题意&#xff1a; 一个N个顶点的凸多边形&#xff0c;划分成N-2个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&#xff0c;试求所有三角形的顶点权值乘积之和至少为多少。 题解&#xff1…

徐磊(Devops):一名写了十几年代码但还没写够的程序员

徐磊&#xff08;Devops 社区领袖&#xff09;【个人介绍】徐磊&#xff0c;微软MVP&#xff08;微软最有价值专家&#xff0c;大中华区域社区技术总监&#xff0c;Devops 社区领袖&#xff09;&#xff0c;从事过网管、技术支持、网络、软件开发等工作&#xff0c;一名写了十几…

加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版)

文章目录descriptionsolutioncode#3483. SGU505 Prefixes and suffixes&#xff08;询问在线版&#xff09;description 给定&#x1d45b;个字符串&#xff0c;有&#x1d45a;个询问。 每个询问给出两个字符串&#x1d460;1, &#x1d460;2&#xff0c;问&#x1d45b;个字…

AcWing 320. 能量项链

AcWing 320. 能量项链 题意&#xff1a; 题解&#xff1a; 和环形石头合并基本一样 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf("%s %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s0,w1;char c…

ERP不规范,同事两行泪

最近的很多次对外交流&#xff0c;都聊到了ERP建设的话题&#xff0c;并且无一例外的不那么让人省心&#xff0c;回想我这么多年走过的ERP坑坑路&#xff0c;在这里也写下经验和总结&#xff0c;希望能给正在或者即将走上ERP建设路的企业一些思考和帮助。导读1、几个瞎眼而普遍…

2.13模拟总结

文章目录前言题目解析最小划分&#xff08;divide&#xff09;进制路径&#xff08;base&#xff09;欧拉欧拉&#xff08;eular&#xff09;代码T1T2T3总结前言 day9 170pts 期望&#xff1a;10010020220 实际&#xff1a;701000170 rnk7 挂的分有点多qwq 分数要是得满就能拿…

Panasonic Programming Contest (AtCoder Beginner Contest 195) 题解

文章目录A - Health M DeathB - Many OrangesC - CommaD - Shipping CenterE - Lucky 7 BattleF - Coprime PresentPanasonic Programming Contest (AtCoder Beginner Contest 195)A - Health M Death 判断倍数。 #include <cstdio> int main() {int M, H;scanf( "…

长沙.NET社区之光

奈何万事开头难迎着改革开放四十年带来的春风&#xff0c;长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群将长沙互联网的环境推上了一个新的台阶。年底&#xff0c;我与有幸一起共事的溪源兄&#xff0c;下班后一起闲聊&#xff0c;觉着长沙的.NET的生态环境亟待改善…

P3205 [HNOI2010]合唱队

P3205 [HNOI2010]合唱队 题意&#xff1a; 有n个数&#xff0c;然后插入队伍中&#xff0c;如果队列当前为空&#xff0c;则直接插入&#xff0c;然后每次插入和上一次插入的比较&#xff0c;如果大于&#xff0c;插入当前队列的最右侧&#xff0c;如果小于&#xff0c;插入当…

2.14模拟总结

前言 节日快乐&#xff01; (逃) day10 50pts 期望&#xff1a;10302060 实际&#xff1a;0302050 rnk11 彻彻底底的摆烂局了。 但是rnk竟然没有太掉&#xff0c;所以我应该并不孤独… 和KH并排坐在机房里&#xff0c;各自看着电脑&#xff0c;痴痴想着各自的心事&#xff0c;…

KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解

文章目录A - CenturyB - 200th ABC-200C - Ringos Favorite Numbers 2D - Happy Birthday! 2E - Patisserie ABC 2F - Minflip SummationKYOCERA Programming Contest 2021&#xff08;AtCoder Beginner Contest 200&#xff09; A - Century 简单的除以200200200向上取整 B…

高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”熟悉.NET Framework的人知道&#xff0c;我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目&#xff0c;也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我…

Little Boxes UVALive - 8209

Little Boxes UVALive - 8209 题意&#xff1a; 给你四个数&#xff0c;输出四个数之和&#xff0c;四个数小于等于262之内 题解&#xff1a; 这。。。这。。水题 unsigned int 0&#xff5e;4294967295 (10位数&#xff0c;4e9) int -2147483648&#xff5e;2147483647 (…

2.15模拟总结

前言 day11 期望&#xff1a;406030130 实际&#xff1a;4003070 rnk16 挂大分了。。 T2树边不加双向&#xff1a;60->0。 这什么伞兵bug啊&#xff01; 整体状态也不太好&#xff0c;T2死磕无果。 T1看出正解结果写不出来拉插&#xff0c;乐。 题目解析 T1 网格序列&am…

Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

文章目录A - Tiny Arithmetic SequenceB - Do you know the second highest mountain?C - Secret NumberD - Game in Momotetsu WorldE - Xor DistancesF - Insertion SortMynavi Programming Contest 2021&#xff08;AtCoder Beginner Contest 201&#xff09;A - Tiny Arit…

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

Rabbits UVALive - 8211

Rabbits UVALive - 8211 题意&#xff1a; n个兔子的位置&#xff0c;兔子每次可以跳到两个兔子之间&#xff0c;问最多可以跳多少下&#xff1f; 题解&#xff1a; 求出所有相邻两数的间隔&#xff0c;然后减去最小间隔就是答案 代码&#xff1a; #include <bits/std…

2.16模拟总结

前言 期望&#xff1a;100700170 实际&#xff1a;400040 rnk14 分全部挂没了&#xff0c;太行了。 T1不开longlong见祖宗&#xff0c;而且KH说的那个也有道理&#xff0c;带权之后树的重心可以不只有两个&#xff0c;所以最后还应该倍增的跳。&#xff08;然而这个地方题解似…

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举判断符合要求的求最小值即可 C - Unexpressed O(n)O(\sqrt{n})O(n​)枚举aaa&#xff0c;暴力翻倍&#xff08;最小的222最多乘323232次就会超过nnn的上…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…