题目描述

如果玩过俄罗斯方块,应该见过如下图形:

我们称它为一个 \(T\) 形四格拼板 。其中心被标记为\(×\)。

小苗画了一个 \(m\) 行 \(n\) 列的长方形网格。行从 \(0\) 至 \(m-1\) 编号,列从 \(0\) 至 \(n-1\) 编号。

她将网格中的一些格子标记为 特殊格子 。

然后,她想要她的朋友帮助她将 \(T\) 形四格拼板按找如下规则摆放:

\(1\)、 特殊格子的数量与 \(T\) 形四格拼板的数量相同,每个 \(T\) 形四格拼板的中心在网格上的位置必须是特殊格子。

\(2\)、 \(T\) 形四格拼板之间不能有重叠部分。

\(3\)、 所有拼板的部分均在网格内。

注意,\(T\) 形四格拼板有四种摆放方式:

如果方案不存在,输出 \(No\),否则请找出一种方案使得被拼板覆盖的数总和最大,求出这个最大值。

输入格式

从文件 \(t-covering.in\) 中读入数据。

第一行两个整数 \(m,n\) 分别表示行数和列数。

接下来 \(m\) 行,每行 \(n\) 个整数,第 \(i\) 行第 \(j\) 个数(从 \(0\) 开始编号)表示方格中第 \(i\) 行第 \(j\) 列的数 \(a_{i,j}\)

接下来一行,一个整数 \(k\) ,表示特殊格子的数量。

接下来 \(k\) 行,每行两个整数 \(r_i,c_i\),表示第 \(i\) 个被标记的特殊格子的位置。

输出格式

如果有方案,输出可能的被覆盖的格子内数总和的最大值,否则输出 \(No\)。

注意,本题 \(10\) 组测试数据均绑点, 只输出 \(1\) 个 \(No\) 不会得分.

样例

样例输入

  1. 5 6
  2. 7 3 8 1 0 9
  3. 4 6 2 5 8 3
  4. 1 9 7 3 9 5
  5. 2 6 8 4 5 7
  6. 3 8 2 7 3 6
  7. 3
  8. 1 1
  9. 2 2
  10. 3 4

样例输出

  1. 67

【样例 \(1\) 解释】

其中一种最优的方案如下:

\((1,1)\) 位置的摆放方式为 \(⊣\)。

\((2,2)\) 位置的摆放方式为\(⊢\)。

\((3,4)\) 位置的摆放方式为 \(⊥\)。

样例 \(2\) 输入

  1. 5 6
  2. 7 3 8 1 0 9
  3. 4 6 2 5 8 3
  4. 1 9 7 3 9 5
  5. 2 6 8 4 5 7
  6. 3 8 2 7 3 6
  7. 3
  8. 1 1
  9. 2 2
  10. 3 3

【样例 \(2\) 输出】

  1. No

数据范围与提示

分析

把这道题打成了大模拟

思路是这样的:

\(1\)、把所有必须选的格子选上,这样的 \(T\) 有三种



第一种是在边界上,第二种是两个格子直接相邻,第三种是两个格子对角线相邻

在没有限制的情况下,每一个 \(T\) 可以在周围的四个格子中任意选三个

而给了限制之后就只能选固定的三个了

要注意在选择过程中我们选择了一个格子后会使其它 \(T\) 能选择的格子减少

也就是说只能选择固定格子的 \(T\) 增加了,这个要存一下

\(2\)、对于两个 \(T\) 相隔一个格子的情况用并查集维护



把所有相隔一个格子的 \(T\)合并,如果形成的联通块没有环,可以贪心去掉一个最小的

如果有一个环,必须全部选上

如果有两个环即以上,则不合法

\(3\)、剩下的贪心去掉最小的即可

代码

  1. #include<cstdio>
  2. #include<vector>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<iostream>
  7. #define rg register
  8. inline int read(){
  9. rg int x=0,fh=1;
  10. rg char ch=getchar();
  11. while(ch<'0' || ch>'9'){
  12. if(ch=='-') fh=-1;
  13. ch=getchar();
  14. }
  15. while(ch>='0' && ch<='9'){
  16. x=(x<<1)+(x<<3)+(ch^48);
  17. ch=getchar();
  18. }
  19. return x*fh;
  20. }
  21. const int maxn=1e6+5;
  22. int n,m,k,cnt;
  23. std::vector<int> a[maxn],id[maxn];
  24. bool jud=0,vis[maxn],haha[maxn],inq[maxn],huan[maxn],s[maxn];
  25. int tot[maxn],zxz[maxn],ans=0,js[maxn],sta[maxn],tp,jla[maxn],jlb[maxn];
  26. struct asd{
  27. int nx,ny;
  28. asd(){}
  29. asd(int aa,int bb){
  30. nx=aa,ny=bb;
  31. }
  32. }b[maxn];
  33. void xg(int nx,int ny){
  34. if(nx<1 || ny<1 || nx>n || ny>m) return;
  35. if(vis[id[nx][ny]]) return;
  36. if(s[id[nx][ny]]==0) return;
  37. js[id[nx][ny]]--;
  38. if(!inq[id[nx][ny]]){
  39. sta[++tp]=id[nx][ny];
  40. inq[id[nx][ny]]=1;
  41. }
  42. }
  43. int fa[maxn];
  44. int zhao(int xx){
  45. if(fa[xx]==xx) return xx;
  46. return fa[xx]=zhao(fa[xx]);
  47. }
  48. int main(){
  49. freopen("t_covering.in","r",stdin);
  50. freopen("t_covering.out","w",stdout);
  51. memset(zxz,0x3f,sizeof(zxz));
  52. n=read(),m=read();
  53. rg int aa,bb;
  54. for(rg int i=1;i<=n;i++){
  55. a[i].push_back(0);
  56. id[i].push_back(0);
  57. for(rg int j=1;j<=m;j++){
  58. aa=read();
  59. a[i].push_back(aa);
  60. cnt++;
  61. id[i].push_back(cnt);
  62. }
  63. }
  64. k=read();
  65. if(k*4>n*m){
  66. printf("No\n");
  67. for(rg int i=1;i<=k;i++){
  68. aa=read(),bb=read();
  69. }
  70. return 0;
  71. }
  72. for(rg int i=1;i<=k;i++){
  73. aa=read(),bb=read();
  74. aa++,bb++;
  75. if(s[id[aa][bb]]==1){
  76. jud=1;
  77. }
  78. b[i].nx=aa,b[i].ny=bb;
  79. jla[id[aa][bb]]=aa,jlb[id[aa][bb]]=bb;
  80. s[id[aa][bb]]=1;
  81. }
  82. if(k){
  83. if(n==1 || m==1) jud=1;
  84. }
  85. if(jud){
  86. printf("No\n");
  87. return 0;
  88. }
  89. for(rg int i=1;i<=k;i++){
  90. js[id[b[i].nx][b[i].ny]]=4;
  91. }
  92. for(rg int i=1;i<=k;i++){
  93. aa=b[i].nx,bb=b[i].ny;
  94. if((aa==1 || aa==n) && (bb==1 || bb==m)){
  95. printf("No\n");
  96. return 0;
  97. }
  98. if(aa==1){
  99. vis[id[aa][bb]]=1;
  100. if(haha[id[aa][bb]] || haha[id[aa][bb-1]] || haha[id[aa][bb+1]] || haha[id[aa+1][bb]]){
  101. printf("No\n");
  102. return 0;
  103. }
  104. xg(aa,bb+2);
  105. xg(aa,bb-2);
  106. xg(aa+2,bb);
  107. haha[id[aa][bb]]=haha[id[aa][bb-1]]=haha[id[aa][bb+1]]=haha[id[aa+1][bb]]=1;
  108. ans+=a[aa][bb-1]+a[aa][bb+1]+a[aa+1][bb]+a[aa][bb];
  109. } else if(aa==n){
  110. vis[id[aa][bb]]=1;
  111. if(haha[id[aa][bb]] || haha[id[aa][bb-1]] || haha[id[aa][bb+1]] || haha[id[aa-1][bb]]){
  112. printf("No\n");
  113. return 0;
  114. }
  115. xg(aa,bb+2);
  116. xg(aa,bb-2);
  117. xg(aa-2,bb);
  118. haha[id[aa][bb]]=haha[id[aa][bb-1]]=haha[id[aa][bb+1]]=haha[id[aa-1][bb]]=1;
  119. ans+=a[aa][bb-1]+a[aa][bb+1]+a[aa-1][bb]+a[aa][bb];
  120. } else if(bb==1){
  121. vis[id[aa][bb]]=1;
  122. if(haha[id[aa][bb]] || haha[id[aa-1][bb]] || haha[id[aa+1][bb]] || haha[id[aa][bb+1]]){
  123. printf("No\n");
  124. return 0;
  125. }
  126. xg(aa-2,bb);
  127. xg(aa+2,bb);
  128. xg(aa,bb+2);
  129. haha[id[aa][bb]]=haha[id[aa-1][bb]]=haha[id[aa+1][bb]]=haha[id[aa][bb+1]]=1;
  130. ans+=a[aa-1][bb]+a[aa+1][bb]+a[aa][bb+1]+a[aa][bb];
  131. } else if(bb==m){
  132. vis[id[aa][bb]]=1;
  133. if(haha[id[aa][bb]] || haha[id[aa-1][bb]] || haha[id[aa+1][bb]] || haha[id[aa][bb-1]]){
  134. printf("No\n");
  135. return 0;
  136. }
  137. xg(aa-2,bb);
  138. xg(aa+2,bb);
  139. xg(aa,bb-2);
  140. haha[id[aa][bb]]=haha[id[aa-1][bb]]=haha[id[aa+1][bb]]=haha[id[aa][bb-1]]=1;
  141. ans+=a[aa-1][bb]+a[aa+1][bb]+a[aa][bb-1]+a[aa][bb];
  142. }
  143. }
  144. rg int mx,my;
  145. for(rg int i=1;i<=k;i++){
  146. aa=b[i].nx,bb=b[i].ny;
  147. if(aa+1<=n){
  148. mx=aa+1,my=bb;
  149. if(s[id[mx][my]]){
  150. if(!vis[id[mx][my]]){
  151. vis[id[mx][my]]=1;
  152. if(haha[id[mx][my+1]] || haha[id[mx][my-1]] || haha[id[mx+1][my]] || haha[id[mx][my]]){
  153. printf("No\n");
  154. return 0;
  155. }
  156. xg(mx,my+2);
  157. xg(mx,my-2);
  158. xg(mx+2,my);
  159. haha[id[mx][my+1]]=haha[id[mx][my-1]]=haha[id[mx+1][my]]=haha[id[mx][my]]=1;
  160. ans+=a[mx][my+1]+a[mx][my-1]+a[mx+1][my]+a[mx][my];
  161. }
  162. if(!vis[id[aa][bb]]){
  163. vis[id[aa][bb]]=1;
  164. if(haha[id[aa][bb-1]] || haha[id[aa][bb+1]] || haha[id[aa-1][bb]] || haha[id[aa][bb]]){
  165. printf("No\n");
  166. return 0;
  167. }
  168. xg(aa,bb-2);
  169. xg(aa,bb+2);
  170. xg(aa-2,bb);
  171. haha[id[aa][bb-1]]=haha[id[aa][bb+1]]=haha[id[aa-1][bb]]=haha[id[aa][bb]]=1;
  172. ans+=a[aa][bb-1]+a[aa][bb+1]+a[aa-1][bb]+a[aa][bb];
  173. vis[id[aa][bb]]=1;
  174. }
  175. }
  176. }
  177. if(bb+1<=m){
  178. mx=aa,my=bb+1;
  179. if(s[id[mx][my]]){
  180. if(!vis[id[mx][my]]){
  181. vis[id[mx][my]]=1;
  182. if(haha[id[mx+1][my]] || haha[id[mx-1][my]] || haha[id[mx][my+1]] || haha[id[mx][my]]){
  183. printf("No\n");
  184. return 0;
  185. }
  186. xg(mx-2,my);
  187. xg(mx+2,my);
  188. xg(mx,my+2);
  189. haha[id[mx+1][my]]=haha[id[mx-1][my]]=haha[id[mx][my+1]]=haha[id[mx][my]]=1;
  190. ans+=a[mx+1][my]+a[mx-1][my]+a[mx][my+1]+a[mx][my];
  191. }
  192. if(!vis[id[aa][bb]]){
  193. vis[id[aa][bb]]=1;
  194. if(haha[id[aa-1][bb]] || haha[id[aa+1][bb]] || haha[id[aa][bb-1]] || haha[id[aa][bb]]){
  195. printf("No\n");
  196. return 0;
  197. }
  198. xg(aa-2,bb);
  199. xg(aa+2,bb);
  200. xg(aa,bb-2);
  201. haha[id[aa-1][bb]]=haha[id[aa+1][bb]]=haha[id[aa][bb-1]]=haha[id[aa][bb]]=1;
  202. ans+=a[aa-1][bb]+a[aa+1][bb]+a[aa][bb-1]+a[aa][bb];
  203. vis[id[aa][bb]]=1;
  204. }
  205. }
  206. }
  207. }
  208. for(rg int i=1;i<=k;i++){
  209. aa=b[i].nx,bb=b[i].ny;
  210. if(aa+1<=n && bb+1<=m){
  211. mx=aa+1,my=bb+1;
  212. if(s[id[mx][my]]){
  213. if(!vis[id[mx][my]]){
  214. vis[id[mx][my]]=1;
  215. if(haha[id[mx+1][my]] || haha[id[mx-1][my]] || haha[id[mx][my+1]] || haha[id[mx][my]]){
  216. printf("No\n");
  217. return 0;
  218. }
  219. xg(mx-2,my);
  220. xg(mx+2,my);
  221. xg(mx,my+2);
  222. haha[id[mx+1][my]]=haha[id[mx-1][my]]=haha[id[mx][my+1]]=haha[id[mx][my]]=1;
  223. ans+=a[mx+1][my]+a[mx-1][my]+a[mx][my+1]+a[mx][my];
  224. }
  225. if(!vis[id[aa][bb]]){
  226. vis[id[aa][bb]]=1;
  227. if(haha[id[aa+1][bb]] || haha[id[aa-1][bb]] || haha[id[aa][bb-1]] || haha[id[aa][bb]]){
  228. printf("No\n");
  229. return 0;
  230. }
  231. xg(aa-2,bb);
  232. xg(aa+2,bb);
  233. xg(aa,bb-2);
  234. haha[id[aa+1][bb]]=haha[id[aa-1][bb]]=haha[id[aa][bb-1]]=haha[id[aa][bb]]=1;
  235. ans+=a[aa+1][bb]+a[aa-1][bb]+a[aa][bb-1]+a[aa][bb];
  236. vis[id[aa][bb]]=1;
  237. }
  238. }
  239. }
  240. if(bb-1>=1 && aa+1<=n){
  241. mx=aa+1,my=bb-1;
  242. if(s[id[mx][my]]){
  243. if(!vis[id[mx][my]]){
  244. vis[id[mx][my]]=1;
  245. if(haha[id[mx+1][my]] || haha[id[mx-1][my]] || haha[id[mx][my-1]] || haha[id[mx][my]]){
  246. printf("No\n");
  247. return 0;
  248. }
  249. xg(mx-2,my);
  250. xg(mx+2,my);
  251. xg(mx,my-2);
  252. haha[id[mx+1][my]]=haha[id[mx-1][my]]=haha[id[mx][my-1]]=haha[id[mx][my]]=1;
  253. ans+=a[mx+1][my]+a[mx-1][my]+a[mx][my-1]+a[mx][my];
  254. }
  255. if(!vis[id[aa][bb]]){
  256. vis[id[aa][bb]]=1;
  257. if(haha[id[aa+1][bb]] || haha[id[aa-1][bb]] || haha[id[aa][bb+1]] || haha[id[aa][bb]]){
  258. printf("No\n");
  259. return 0;
  260. }
  261. xg(aa-2,bb);
  262. xg(aa+2,bb);
  263. xg(aa,bb+2);
  264. haha[id[aa+1][bb]]=haha[id[aa-1][bb]]=haha[id[aa][bb+1]]=haha[id[aa][bb]]=1;
  265. ans+=a[aa+1][bb]+a[aa-1][bb]+a[aa][bb+1]+a[aa][bb];
  266. vis[id[aa][bb]]=1;
  267. }
  268. }
  269. }
  270. }
  271. for(rg int i=1;i<=tp;i++){
  272. if(vis[sta[i]]) continue;
  273. if(js[sta[i]]<=2){
  274. printf("No\n");
  275. return 0;
  276. } else {
  277. mx=jla[sta[i]],my=jlb[sta[i]];
  278. ans+=a[mx][my+1]+a[mx][my-1]+a[mx+1][my]+a[mx-1][my]+a[mx][my];
  279. vis[sta[i]]=1;
  280. if(haha[id[mx][my+1]]){
  281. ans-=a[mx][my+1];
  282. xg(mx-2,my);
  283. xg(mx+2,my);
  284. xg(mx,my-2);
  285. } else if(haha[id[mx][my-1]]){
  286. ans-=a[mx][my-1];
  287. xg(mx-2,my);
  288. xg(mx+2,my);
  289. xg(mx,my+2);
  290. } else if(haha[id[mx-1][my]]){
  291. ans-=a[mx-1][my];
  292. xg(mx,my-2);
  293. xg(mx,my+2);
  294. xg(mx+2,my);
  295. } else {
  296. ans-=a[mx+1][my];
  297. xg(mx,my-2);
  298. xg(mx,my+2);
  299. xg(mx-2,my);
  300. }
  301. }
  302. }
  303. for(rg int i=1;i<=cnt;i++){
  304. fa[i]=i;
  305. }
  306. rg int cc,dd;
  307. for(rg int i=1;i<=k;i++){
  308. if(vis[id[b[i].nx][b[i].ny]]) continue;
  309. aa=b[i].nx,bb=b[i].ny;
  310. cc=id[b[i].nx][b[i].ny];
  311. tot[cc]+=a[aa][bb]+a[aa-1][bb]+a[aa+1][bb]+a[aa][bb-1]+a[aa][bb+1];
  312. zxz[cc]=std::min(std::min(a[aa+1][bb],a[aa-1][bb]),std::min(a[aa][bb-1],a[aa][bb+1]));
  313. }
  314. for(rg int i=1;i<=k;i++){
  315. if(vis[id[b[i].nx][b[i].ny]]) continue;
  316. aa=b[i].nx,bb=b[i].ny;
  317. mx=b[i].nx+2,my=b[i].ny;
  318. if(mx<=n && s[id[mx][my]]){
  319. cc=zhao(id[aa][bb]),dd=zhao(id[mx][my]);
  320. if(cc==dd){
  321. if(huan[cc]){
  322. printf("No\n");
  323. return 0;
  324. }
  325. huan[cc]=1;
  326. tot[cc]-=a[aa+1][bb];
  327. zxz[cc]=0;
  328. } else {
  329. tot[cc]+=tot[dd];
  330. tot[cc]-=a[aa+1][bb];
  331. zxz[cc]=std::min(zxz[cc],zxz[dd]);
  332. fa[dd]=cc;
  333. }
  334. }
  335. mx=b[i].nx,my=b[i].ny+2;
  336. if(my<=m && s[id[mx][my]]){
  337. cc=zhao(id[aa][bb]),dd=zhao(id[mx][my]);
  338. if(cc==dd){
  339. if(huan[cc]){
  340. printf("No\n");
  341. return 0;
  342. }
  343. huan[cc]=1;
  344. tot[cc]-=a[aa][bb+1];
  345. zxz[cc]=0;
  346. } else {
  347. tot[cc]+=tot[dd];
  348. tot[cc]-=a[aa][bb+1];
  349. zxz[cc]=std::min(zxz[cc],zxz[dd]);
  350. fa[dd]=cc;
  351. }
  352. }
  353. }
  354. for(rg int i=1;i<=k;i++){
  355. if(vis[id[b[i].nx][b[i].ny]]) continue;
  356. mx=b[i].nx,my=b[i].ny;
  357. if(fa[id[mx][my]]!=id[mx][my]) continue;
  358. ans+=tot[id[mx][my]]-zxz[id[mx][my]];
  359. }
  360. printf("%d\n",ans);
  361. return 0;
  362. }

模拟赛38 B. T形覆盖 大模拟的更多相关文章

  1. noip模拟赛#38

    我打开了#39的problem...想了半个小时多发现我一道题都不会写...于是我打开了#38的problem T1:循环数字的定义为能够将该数划分为若干相同长度的段并且都相同. n=2e18. =& ...

  2. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  3. [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)

    [题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...

  4. 模拟赛小结:2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    比赛链接:传送门 本场我们队过的题感觉算法都挺简单的,不知道为啥做的时候感觉没有很顺利. 封榜后7题,罚时1015.第一次模拟赛金,虽然是北欧的区域赛,但还是有点开心的. Problem B Best ...

  5. 【2020.8.23NOIP模拟赛】失落

    [ 2020.8.23 N O I P 模 拟 赛 ] 失 落 [2020.8.23NOIP模拟赛]失落 [2020.8.23NOIP模拟赛]失落 题目描述 出题人心情很失落,于是他直接告诉你让你求出 ...

  6. HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛

    题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...

  7. 2016ACM-ICPC网络赛北京赛区 1001 (trie树牌大模拟)

    [题目传送门] 1383 : The Book List 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The history of Peking University ...

  8. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  9. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

随机推荐

  1. Java网关服务-AIO(二)

    Java网关服务-AIO(二) 概述 AIO的特点就是用户程序注册一个事件后就可以做其他事情,当事件被内核执行并得到结果后,我们的CompletionHandler会在I/O回调线程中被自动调用,有点 ...

  2. Apache POI 合并单元格--简单解释版带Demo

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  );   CellRangeAddress  对象的构造 ...

  3. CodeForces 1093F Vasya and Array

    题意 给一个长度为 \(n\) 的整数序列 \(a\),其中 \(a_i\) 要么为 \(-1\),要么为 \(1\sim k\) 中的整数. 求出将所有 \(-1\) 替换为 \(1\sim k\) ...

  4. OpenCascade拓扑对象之:TopoDS_Shape的三要素

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  5. Go语言中的互斥锁和读写锁(Mutex和RWMutex)

    目录 一.Mutex(互斥锁) 不加锁示例 加锁示例 二.RWMutex(读写锁) 并发读示例 并发读写示例 三.死锁场景 1.Lock/Unlock不是成对出现 2.锁被拷贝使用 3.循环等待 虽然 ...

  6. 这么设置Intellij IDEA,据说效率还不错~

    显示工具条 (1)效果图 (2)设置方法 标注1:View–>Toolbar 标注2:View–>Tool Buttons 设置鼠标悬浮提示 (1)效果图 (2)设置方法File–> ...

  7. 【Java GC系列】垃圾收集简介(1)

    说明: 在本文中, Garbage Collection 翻译为 "垃圾收集", garbage collector 翻译为 "垃圾收集器"; 一般认为, 垃圾 ...

  8. SAP S/4HANA 2020安装实录

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 今天开始试着安装SAP S/4HANA 2020版本,也是目前SAP ERP最高的版本,总安装文件大小大概50GB,数据库版本必须是HANA ...

  9. 1 select,poll和epoll

    其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了. 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点. se ...

  10. 利用Kotlin扩展函数实现任意View的点击处理(点击效果和防止快速点击)

    利用Kotlin扩展函数实现View的点击处理(点击效果和防止快速点击) kotlin经典写法: view?.setOnClickListener { //实现 } 项目实践证明,这种写法存在问题 例 ...