数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

因为非常板,所以主要是代码

  • Tyvj 1728 普通平衡树
  • Chef and Sets
  • [HNOI2012]永无乡
  • Play with Chain
  • [NOI2005]维修数列

题目很水,所以可能会出现代码部分细节出锅,但确实这些代码是能过得
还请多多包涵

Tyvj 1728 普通平衡树

luogu3369

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
struct node {int l, r, key, val, siz, cnt;
}t[maxn];
int Size, root;int Newnode( int x ) {t[++ Size].val = x;t[Size].key = rand();t[Size].siz = t[Size].cnt = 1;return Size;
}void pushup( int x ) {t[x].siz = t[t[x].l].siz + t[t[x].r].siz + t[x].cnt;
}void split( int now, int val, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[now].val <= val ) {x = now;split( t[now].r, val, t[now].r, y );pushup( x );}else {y = now;split( t[now].l, val, x, t[now].l );pushup( y );}}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;if( t[x].key < t[y].key ) {t[x].r = merge( t[x].r, y );pushup( x );return x;}else {t[y].l = merge( x, t[y].l );pushup( y );return y;}
}void add( int x ) {int l, r, L, R;split( root, x, l, r );split( l, x - 1, L, R );if( R ) {t[R].cnt ++;pushup( R );root = merge( merge( L, R ), r );}else {int t = Newnode( x );root = merge( merge( L, t ), r );}
}void del( int x ) {int l, r, L, R;split( root, x, l, r );split( l, x - 1, L, R );if( R and t[R].cnt > 1 ) {t[R].cnt --;pushup( R );root = merge( merge( L, R ), r );}else root = merge( L, r );
}void find_rank( int x ) {int l, r;split( root, x - 1, l, r );printf( "%d\n", t[l].siz + 1 );root = merge( l, r );
}void rank_find( int rt, int x ) {while( 1 ) {if( t[t[rt].l].siz >= x ) rt = t[rt].l;else if( t[t[rt].l].siz + t[rt].cnt >= x ) {printf( "%d\n", t[rt].val );return;}else x -= ( t[t[rt].l].siz + t[rt].cnt ), rt = t[rt].r;}
}void find_pre( int x ) {int l, r;split( root, x - 1, l, r );rank_find( l, t[l].siz );root = merge( l, r );
}void find_suf( int x ) {int l, r;split( root, x, l, r );rank_find( r, 1 );root = merge( l, r );
}int main() {int n;scanf( "%d", &n );while( n -- ) {int opt, x;scanf( "%d %d", &opt, &x );switch( opt ) {case 1 : { add( x ); break; }case 2 : { del( x ); break; }case 3 : { find_rank( x ); break; }case 4 : { rank_find( root, x ); break; }case 5 : { find_pre( x ); break; }case 6 : { find_suf( x ); break; }}}return 0;
}

Chef and Sets

codechef

每次暴力的合并两个集合

为了维护权值的小根堆性质,只能从集合中一个一个的并到另一个集合里面去

具体而言

  • 每次操作集合个数较小的其中一个数
  • 然后根据这个数的权值,分裂较大集合
  • 把这个数并到大集合中,从小集合中删除
  • 重复这样的操作,直到小集合为空

看似暴力,但是一共就nnn个数的集合并,没有新增的数

最坏就是nlog⁡nn\log nnlogn的(每次就个数相同的两个集合合并)

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 300005
struct node { int siz, l, r, val, key; }t[maxn];
int root[maxn];void pushup( int x ) {t[x].siz = t[t[x].l].siz + t[t[x].r].siz + 1;
}void split_val( int now, int val, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[now].val <= val ) {x = now;split_val( t[now].r, val, t[now].r, y );pushup( x );}else {y = now;split_val( t[now].l, val, x, t[now].l );pushup( y );}}
}void split_id( int now, int cnt, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[t[now].l].siz + 1 <= cnt ) {x = now;split_id( t[now].r, cnt - ( t[t[now].l].siz + 1 ), t[now].r, y );pushup( x );}else {y = now;split_id( t[now].l, cnt, x, t[now].l );pushup( y );}}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;if( t[x].key < t[y].key ) {t[x].r = merge( t[x].r, y );pushup( x );return x;}else {t[y].l = merge( x, t[y].l );pushup( y );return y;}
}void find_kth( int now, int x ) {while( 1 ) {if( t[t[now].l].siz >= x ) now = t[now].l;else if( t[t[now].l].siz + 1 == x ) {printf( "%d\n", t[now].val );return;}else x -= ( t[t[now].l].siz + 1 ), now = t[now].r;}
}int main() {int n, Q;scanf( "%d %d", &n, &Q );for( int i = 1;i <= n;i ++ )t[i].siz = 1, t[i].val = root[i] = i, t[i].key = rand();char opt[10]; int a, b, k;while( Q -- ) {scanf( "%s %d", opt, &a );if( opt[0] == 'U' ) {scanf( "%d", &b );++ n;if( t[root[a]].siz < t[root[b]].siz )swap( a, b );root[n] = root[a];int l, r, L, R;while( root[b] ) {split_id( root[b], 1, l, r );split_val( root[n], t[l].val, L, R );root[n] = merge( merge( L, l ), R );root[b] = r;}}else {scanf( "%d", &k );find_kth( root[a], k );}}return 0;
}

[HNOI2012]永无乡

luogu3224

与上一题几乎是一模一样

不过刁钻了一下,给的是集合中某一个点,并不一定直接是集合的根

其实也米有什么变化

套一个并查集记录每个点所在集合的根就行了

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 500005
struct node {int l, r, id, val, key, siz;
}t[maxn];
int root[maxn], p[maxn], f[maxn];int find( int x ) {return x == f[x] ? x : f[x] = find( f[x] );
}void pushup( int x ) {t[x].siz = t[t[x].l].siz + t[t[x].r].siz + 1;
}void split_val( int now, int val, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[now].val <= val ) {x = now;split_val( t[now].r, val, t[now].r, y );pushup( x );}else {y = now;split_val( t[now].l, val, x, t[now].l );pushup( y );}}
}void split_id( int now, int cnt, int &x, int &y ) {if( ! now ) x = y = 0;else {if( t[t[now].l].siz + 1 <= cnt ) {x = now;split_id( t[now].r, cnt - ( t[t[now].l].siz + 1 ), t[now].r, y );pushup( x );}else {y = now;split_id( t[now].l, cnt, x, t[now].l );pushup( y ); }}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;if( t[x].key < t[y].key ) {t[x].r = merge( t[x].r, y );pushup( x );return x; }else {t[y].l = merge( x, t[y].l );pushup( y );return y;}
}void find_kth( int rt, int x ) {while( 1 ) {if( t[t[rt].l].siz >= x ) rt = t[rt].l;else if( t[t[rt].l].siz + 1 == x ) {printf( "%d\n", t[rt].id );return;}else x -= ( t[t[rt].l].siz + 1 ), rt = t[rt].r;}
}int main() {int n, m, Q, x, y, k;char opt[10];scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%d", &p[i] );for( int i = 1;i <= n;i ++ ) {t[i].val = p[i];t[i].key = rand();t[i].siz = 1;t[i].id = i;root[i] = i;f[i] = i;}for( int i = 1;i <= m;i ++ ) {scanf( "%d %d", &x, &y );if( find( x ) == find( y ) ) continue;x = find( x );y = find( y );if( t[root[x]].siz < t[root[y]].siz ) swap( x, y );root[++ n] = root[x];f[n] = n;while( root[y] ) {int l, r, L, R;split_id( root[y], 1, l, r );split_val( root[n], t[l].val, L, R );root[n] = merge( merge( L, l ), R );root[y] = r;}f[find( x )] = f[find( y )] = n;}scanf( "%d", &Q );while( Q -- ) {scanf( "%s %d", opt, &x );if( opt[0] == 'Q' ) {scanf( "%d", &k );x = find( x );if( t[root[x]].siz < k ) printf( "-1\n" );else find_kth( root[x], k );}else {scanf( "%d", &y );if( find( x ) == find( y ) ) continue;x = find( x );y = find( y );if( t[root[x]].siz < t[root[y]].siz ) swap( x, y );root[++ n] = root[x];f[n] = n;while( root[y] ) {int l, r, L, R;split_id( root[y], 1, l, r );split_val( root[n], t[l].val, L, R );root[n] = merge( merge( L, l ), R );root[y] = r;}f[find( x )] = f[find( y )] = n;}}return 0;
}

Play with Chain

HDU3487

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 300005
vector < int > ans;
struct node {int l, r, val, key, siz, tag;
}t[maxn];void pushup( int x ) {t[x].siz = t[t[x].l].siz + t[t[x].r].siz + 1;
}void pushdown( int x ) {if( ! t[x].tag ) return;swap( t[x].l, t[x].r );t[t[x].l].tag ^= 1;t[t[x].r].tag ^= 1;t[x].tag = 0;
}void split( int now, int cnt, int &x, int &y ) {if( ! now ) x = y = 0;else {pushdown( now );if( t[t[now].l].siz + 1 <= cnt ) {x = now;split( t[now].r, cnt - ( t[t[now].l].siz + 1 ), t[now].r, y );pushup( x );}else {y = now;split( t[now].l, cnt, x, t[now].l );pushup( y );}}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;if( t[x].key < t[y].key ) {pushdown( x );t[x].r = merge( t[x].r, y );pushup( x );return x;}else {pushdown( y );t[y].l = merge( x, t[y].l );pushup( y );return y;}
}void print( int x ) {if( ! x ) return;pushdown( x );print( t[x].l );ans.push_back( t[x].val );print( t[x].r );
}int main() {int n, m, a, b, c; char opt[10];while( scanf( "%d %d", &n, &m ) ) {if( n == -1 and m == -1 ) return 0;for( int i = 1;i <= n;i ++ ) {t[i].l = t[i].r = t[i].tag = 0;t[i].siz = 1;t[i].val = i;t[i].key = rand();}int rt = 0;for( int i = 1;i <= n;i ++ )rt = merge( rt, i );int l, r, L, R;while( m -- ) {scanf( "%s %d %d", opt, &a, &b );if( opt[0] == 'C' ) {scanf( "%d", &c );split( rt, a - 1, l, r );split( r, b - a + 1, L, R );rt = merge( l, R );split( rt, c, l, r );rt = merge( merge( l, L ), r );}else {split( rt, a - 1, l, r );split( r, b - a + 1, L, R );t[L].tag ^= 1;rt = merge( l, merge( L, R ) );}}print( rt );printf( "%d", ans[0] );for( int i = 1;i < ans.size();i ++ )printf( " %d", ans[i] );printf( "\n" );ans.clear();}return 0;
}

[NOI2005]维修数列

BZOJ1500

把线段树的所有计算方法全都搬到平衡树上就行

#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 500005
#define lson t[now].l
#define rson t[now].r
#define inf 0x3f3f3f3f
queue < int > q;
struct node {int l, r, siz, val, key, reverse, cover, sum, max_sum, max_l, max_r;
}t[maxn];
int Size;int MakeNode( int x ) {int now;if( ! q.empty() ) now = q.front(), q.pop();else now = ++ Size;lson = 0;				//左儿子 rson = 0;				//右儿子 t[now].reverse = 0;		//翻转标记 t[now].cover = inf;		//覆盖标记 t[now].val = x;			//权值 t[now].sum = x;			//区间和 t[now].max_l = x;		//从区间左端点开始连续最大子段和 t[now].max_r = x;		//从区间右端点开始连续最大子段和 t[now].max_sum = x;		//区间最大子段和 t[now].key = rand();	//修正值/键值t[now].siz = 1;			//子树大小 return now;
}void pushup( int now ) {if( ! now ) return;t[now].siz = t[lson].siz + t[rson].siz + 1;t[now].sum = t[lson].sum + t[rson].sum + t[now].val;t[now].max_sum = max( max( t[lson].max_sum, t[rson].max_sum ), max( 0, t[lson].max_r ) + t[now].val + max( 0, t[rson].max_l ) );t[now].max_l = max( t[lson].max_l, t[lson].sum + t[now].val + max( 0, t[rson].max_l ) );t[now].max_r = max( t[rson].max_r, t[rson].sum + t[now].val + max( 0, t[lson].max_r ) );
}void modify( int now, int val ) {t[now].val = val;t[now].cover = val;t[now].sum = t[now].siz * val;t[now].max_l = max( 0, t[now].sum );t[now].max_r = max( 0, t[now].sum );t[now].max_sum = max( val, t[now].sum );
}void operation( int now ) {swap( lson, rson );swap( t[now].max_l, t[now].max_r );t[now].reverse ^= 1;
}void pushdown( int now ) {if( t[now].reverse ) {if( lson ) operation( lson );if( rson ) operation( rson );t[now].reverse = 0;}if( t[now].cover ^ inf ) {if( lson ) modify( lson, t[now].cover );if( rson ) modify( rson, t[now].cover );t[now].cover = inf;}
}void split( int now, int cnt, int &x, int &y ) {if( ! now ) x = y = 0;else {pushdown( now );if( t[lson].siz + 1 <= cnt) {x = now;split( rson, cnt - ( t[lson].siz + 1 ), rson, y );pushup( x );}else {y = now;split( lson, cnt, x, lson );pushup( y );}}
}int merge( int x, int y ) {if( ! x or ! y ) return x + y;pushdown( x );pushdown( y );if( t[x].key < t[y].key ) {t[x].r = merge( t[x].r, y );pushup( x );return x;}else {t[y].l = merge( x, t[y].l );pushup( y );return y;}
}void inque( int now ) {if( ! now ) return;q.push( now );inque( lson );inque( rson ); 
}int n, m, rt, l, r, L, R, k, pos, x;
char opt[10];
int main() {scanf( "%d %d", &n, &m );t[0].val = t[0].max_sum = -inf;for( int i = 1;i <= n;i ++ ) {scanf( "%d", &x );rt = merge( rt, MakeNode( x ) );}while( m -- ) {scanf( "%s", opt );switch( opt[2] ) {case 'S' : { //INSERTscanf( "%d %d", &pos, &k );split( rt, pos, l, r );for( int i = 1;i <= k;i ++ ) {scanf( "%d", &x );l = merge( l, MakeNode( x ) );}rt = merge( l, r );break;}case 'L' : { //DELETEscanf( "%d %d", &pos, &k );split( rt, pos - 1, l, r );split( r, k, L, R );rt = merge( l, R );inque( L );break;}case 'K' : { //MAKE-SAMEscanf( "%d %d %d", &pos, &k, &x );split( rt, pos - 1, l, r );split( r, k, L, R );modify( L, x );rt = merge( l, merge( L, R ) );break;}case 'V' : { //REVERSEscanf( "%d %d", &pos, &k );split( rt, pos - 1, l, r );split( r, k, L, R );operation( L );rt = merge( l, merge( L, R ) );break;}case 'T' : { //GET_SUMscanf( "%d %d", &pos, &k );split( rt, pos - 1, l, r );split( r, k, L, R );printf( "%d\n", t[L].sum );rt = merge( l, merge( L, R ) );break;}case 'X' : { //MAX-SUM;printf( "%d\n", t[rt].max_sum );break;}}}return 0;
}

只需要相信:只要多pushdown就不会出现标记与点不对应的情况,那么这与线段树有什么区别呢??

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

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

相关文章

让ASP.NET Core支持GraphQL之-GraphQL的实现原理

众所周知RESTful API是目前最流行的软件架构风格之一&#xff0c;它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。RESTful的优越性是毋庸置疑的&#xff0c;不过GraphQL也可以作为一种补充&am…

CodeForces 1514A Perfectly Imperfect Array

CodeForces 1514A Perfectly Imperfect Array 题意&#xff1a; 给你n个数&#xff0c;是否存在一个数不是平方数 题解&#xff1a; 先开方&#xff0c;转int&#xff0c;判断是否等于平方 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf(&quo…

另一个博客

在博客园搞了个博客&#xff0c;目前来说两边会同时更新的。 有些题目不放出来&#xff0c;都写在来博客园那边&#xff0c;虽然你们也不知道密码 链接:https://www.cnblogs.com/QuantAsk/

洛谷P4173:残缺的字符串(FFT、通配符匹配)

解析 通配符匹配的经典题。 设单词串为 AAA,文章串为 BBB。 把 AAA 翻转一下&#xff0c;判断问题就能转化为一个卷积的形式&#xff1a; F(p)&i0m−1match(Ai1,Bp−i)F(p)\&_{i0}^{m-1}match(A_{i1},B_{p-i})F(p)&i0m−1​match(Ai1​,Bp−i​) match(a,b)match(…

[2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

文章目录CF1251C Minimize The Integeracwing164&#xff1a;可达性统计Facebook Hacker Cup 2016 Round 1 Boomerang Tournament[Zjoi2012]小蓝的好友(mrx)CF1251C Minimize The Integer ………………… 给你一个大整数aaa&#xff0c;它由nnn位数字&#xff0c;也可能有前导…

Entity Framework 的一些性能建议

点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章&#xff0c;至今适用&#xff08;没错&#xff0c;我说的就是适用于EF Core&#xff09;。因此使用微信重新推送&#xff0c;希望能帮到大家。自从我用了EF&#xff0c;每次都很关心是否有潜在的性能问题。所以每次…

AND 0, Sum Big CodeForces - 1514B

AND 0, Sum Big CodeForces - 1514B 题意&#xff1a; 构造一个含n个k位二进制数的序列&#xff0c;使得序列中所有数按位与的结果为0&#xff0c;且序列和最大&#xff0c;求构造方案数。 题解&#xff1a; 对于n个数的每一位&#xff0c;都至少有个0&#xff0c;这样可以…

CF438E:The Child and Binary Tree(生成函数)

解析&#xff1a; 设计 fif_ifi​ 表示权值为 iii 的方案数&#xff0c;f01f_01f0​1。 枚举根节点权值&#xff0c;可以写出转移&#xff1a; fn∑gk∑ififn−k−i∑ijknfifjgkf_n\sum g_k\sum_{i}f_if_{n-k-i}\sum_{ijkn}f_if_jg_kfn​∑gk​i∑​fi​fn−k−i​ijkn∑​fi​…

[2021-09-04 AtCoder Beginner Contest 217] 题解

文章目录A - Lexicographic OrderB - AtCoder QuizC - Inverse of PermutationD - Cutting WoodsE - Sorting QueriesF - Make PairG - Groups网址链接A - Lexicographic Order 签到题 #include <cstdio> #include <iostream> using namespace std; int main() {…

微软内部全面拥抱开源流程Inner Source

微软过去几年一直是 GitHub 平台上开源贡献者最多的公司。不仅如此&#xff0c;微软还将继续拥抱开源&#xff0c;内部有一项名为 Inner Source 的计划&#xff0c;将开源开发流程引入到公司内部。事实上&#xff0c;Inner Source 已经存在于微软内部多年&#xff0c;包括更多代…

洛谷P5110:块速递推(特征根方程、光速幂)

解析 去你的搬砖生成函数&#xff0c;特征根太香了。 一开始我是用生成函数解的&#xff0c;和特征根相比有亿点点搬砖… 但是这个东西原理似乎使用一些神奇的等比差分&#xff0c;有些玄学&#xff0c;生成函数较易理解。 背下来背下来&#xff01; 就以本题为情境讲一下特征…

Product 1 Modulo N CodeForces - 1514C

Product 1 Modulo N CodeForces - 1514C 题意&#xff1a; 在[1,n-1]中选x个数&#xff0c;使得乘积mod n 1&#xff0c;求x的最大值&#xff0c;并输出所选的数 题解&#xff1a; 我们设S为所选x个数的乘积 S%n 1说明gcd(S,n)1,即所选的x个数均与n互质&#xff0c;如果不…

k8s使用helm打包chart并上传到腾讯云TencentHub

本文只涉及Helm的Chart操作&#xff0c;不会对其他知识进行过多描述。至于安装这块&#xff0c;麻烦自行百度吧&#xff0c;一大堆呢。在容器化的时代&#xff0c;我们很多应用都可以部署在docker&#xff0c;很方便&#xff0c;而再进一步&#xff0c;我们还有工具可以对docke…

数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

文章目录[ZJOI2008]骑士[IOI2008] Island[NOIP2018 提高组] 旅行 加强版CF1454E Number of Simple PathsTraffic Network in NumazuCard Game基环树的常见解法若干个基环树互相独立断环为链&#xff08;随便断一条&#xff09;环外树和环外树之间的树形DP环变链后整体可以用数据…

1090. 绿色通道

1090. 绿色通道 题意&#xff1a; n个题&#xff0c;每个题所花时间为ai&#xff0c;最多只用不超过t分钟做这个&#xff0c;肯定会有题目做不完&#xff0c;下标连续的一些空题称为一个空题段&#xff0c;问在t分钟内最长的空题段至少有多长&#xff1f; 题解&#xff1a; …

模板:BSGS(数论)

所谓 BSGS&#xff0c;就是北上广深。 &#xff08;逃&#xff09; BSGS 给出 a,b,pa,b,pa,b,p&#xff0c;请处出满足 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的最小非负正数解或者报告无解。 a,b,p≤109,gcd⁡(a,p)1a,b,p\le 10^9,\gcd(a,p)1a,b,p≤109,gcd(a,p)1 由于 …

如何在ASP.NET Core中自定义Azure Storage File Provider

主题&#xff1a;如何在ASP.NET Core中自定义Azure Storage File Provider作者&#xff1a; Lamond Lu地址: https://www.cnblogs.com/lwqlun/p/10406566.html项目源代码&#xff1a; https://github.com/lamondlu/AzureFileProvider背景ASP.NET Core是一个扩展性非常高的框架…

splay/fhq-treap 问卷调查反馈—— [JSOI2008]火星人prefix(splay),Strange Queries(fhq-treap)

文章目录[JSOI2008]火星人prefixStrange Queries[JSOI2008]火星人prefix BZOJ1014 思路很好想&#xff0c;哈希字符串即可 只是平衡树的码量大 注意因为splay加入哨兵的原因&#xff0c;每个点在平衡树内的排名比真实排名大111&#xff08;有极小值的占位&#xff09; 考虑…

AcWing 1091. 理想的正方形

AcWing 1091. 理想的正方形 题意&#xff1a; 有一个 ab 的整数组成的矩阵&#xff0c;现请你从中找出一个 nn 的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 题解&#xff1a; 前置知识&#xff1a;已经学会了一维的单调队列优化dp 在本题中要求…

美好生活从撸好代码开始

楔子 昨天晚上做了个梦&#xff0c;梦到老板对我说了一番道理&#xff0c;他说对家庭要用爱心&#xff0c;做人对社会要有包容心&#xff0c;对工作要有责任心&#xff0c;对老板要有同理心。 我深以为然。现在的老板确实太不容易了&#xff0c;尤其是作为一家承载梦想&#xf…