云剪贴板
云剪贴板
结论:假完了。
虽然可以改,但是洛谷题解做法更简洁。
但是可以把换根 DP 改成求直径吧。
1
30 30 20
1 2
2 3
1 4
3 5
3 6
2 7
2 8
6 9
9 10
10 11
3 12
12 13
4 14
13 15
8 16
11 17
2 18
4 19
6 20
9 21
15 22
5 23
13 24
18 25
20 26
22 27
5 28
28 29
5 30
做法
求求大神帮忙 hack t3/kel,真没招了/kel
下面是做法:

代码
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {
constexpr int N=1e5+7;
int T,n;
int h,t,len;
vector<int> to[N];
int dep[N],st1[N],st2[N];
int *toh,*tot;
void re() { swap(h,t), swap(toh,tot); }
void dfs0(int u,int fa) {
toh[u]=fa;
for(int v : to[u]) if(v^fa) {
dfs0(v,u);
}
}
void build_tot() {
int x=t;
while(x!=h) tot[toh[x]]=x, x=toh[x];
}
int dfs(int u,int fa) {
dep[u]=dep[fa]+1;
toh[u]=0;
int mx=dep[u];
for(int v : to[u]) if(v^fa) {
int tmp = dfs(v,u);
if(tmp>mx) mx=tmp, toh[u]=v;
}
return mx;
}
void run() {
dep[tot[h]]=0;
dfs(h,tot[h]);
while(toh[h]) h=toh[h],t=toh[t];
build_tot();
// pf("%d %d\n",h,t); fflush(stdout);
}
void getlen() {
len=1;
int x=t;
while(x!=h) ++len, x=toh[x];
// pf("len = %d\n",len);
}
int mxdep[N];
bool check(int u,int fa) {
dep[u]=dep[fa]+1;
mxdep[u]=dep[u];
int cnt=0;
for(int v : to[u]) if(v^fa) {
if(check(v,u)) return 1;
mxdep[u]=max(mxdep[u],mxdep[v]);
if(mxdep[v]-dep[u]+1>=len) ++cnt;
}
// pf("%d %d %d\n",u,fa,mxdep[u]);
if(cnt>=2) return 1;
return 0;
}
void main() {
sf("%d",&T);
// int line=0;
while(T--) {
sf("%d%d%d",&n,&h,&t);
// pf("line %d\n",line+1);
// line+=n;
rep(i,1,n) to[i].clear();
toh=st1,tot=st2;
rep(i,1,n-1) {
int u,v;
sf("%d%d",&u,&v);
to[u].push_back(v), to[v].push_back(u);
}
// assert(dep[0]==0);
dfs0(h,0);
build_tot();
run();
re();
run();
re();
run();
// 走到直径上
getlen();
dep[toh[t]]=0;
if(check(t,toh[t])) puts("YES");
else puts("NO");
}
}
}
int main() {
#ifdef LOCAL
// freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#else
freopen("inverse.in","r",stdin);
freopen("inverse.out","w",stdout);
#endif
wing_heart :: main();
}
第一个出错的数据(模拟赛题数据)
http://cplusoj.com/d/senior/record/6916a972cd056b0e09db9484
3-7,有 \(4\) 个错点,均是应输出 YES。其中第一个出错位置在 in 的第 12264 行,out 的 44 行。下面的数据就是这个位置截出来的。
3-8 没错。
CF 上 WA on #2。输出的前 100 行里,只有第 43 行出错。也是应输出 YES。https://codeforces.com/contest/1381/submission/348842167
应当输出 YES。
1
294 1 2
222 167
222 137
222 270
222 240
240 76
76 118
76 52
118 84
167 175
167 202
270 181
270 283
270 216
222 291
283 212
52 71
84 272
291 129
216 29
216 182
76 258
181 273
283 154
137 201
76 117
117 250
117 229
240 24
201 51
229 239
52 192
84 263
216 26
240 87
87 274
52 280
283 95
95 284
283 7
258 156
95 73
182 190
240 35
84 93
280 32
250 226
137 12
250 247
93 106
258 265
280 107
51 235
240 281
84 249
84 49
239 251
212 79
35 163
229 147
274 60
235 160
273 246
26 238
76 178
181 41
60 220
251 294
284 231
265 267
190 259
294 9
249 50
226 223
87 39
35 68
163 83
239 19
52 282
201 45
118 217
235 72
212 266
107 43
190 159
263 91
39 36
178 89
223 287
93 165
35 139
49 112
216 179
251 113
73 180
93 237
43 205
45 15
283 22
106 6
223 157
7 232
265 242
287 186
89 153
26 230
283 285
291 85
22 114
230 140
147 150
6 290
43 245
231 99
83 38
165 191
192 155
24 31
150 256
107 127
52 116
267 264
191 188
89 145
72 151
180 293
38 121
160 206
294 288
113 120
288 255
127 100
274 286
245 20
6 279
251 187
93 143
114 104
293 253
155 133
265 90
154 62
232 98
274 200
113 70
29 2
76 236
188 146
186 125
121 173
222 94
129 275
93 162
114 34
151 144
275 130
91 11
279 80
235 101
281 126
258 1
264 44
6 261
236 47
12 82
101 17
281 149
106 243
159 184
179 252
223 214
51 213
184 69
206 57
69 131
29 53
214 25
84 92
214 103
95 115
129 142
118 59
144 193
9 18
283 194
34 33
38 152
101 14
127 3
33 174
94 23
214 96
144 119
32 218
117 4
25 42
290 66
223 228
84 177
20 262
149 123
99 148
125 168
106 161
123 88
76 78
139 203
87 204
2 61
79 234
238 135
266 110
160 199
152 244
79 185
284 77
259 176
32 207
107 254
223 5
290 128
202 260
69 21
126 170
19 211
31 109
226 209
90 221
236 233
96 138
201 65
200 158
50 169
115 292
255 198
170 172
204 197
35 8
21 268
172 40
280 16
260 86
274 122
200 30
70 215
71 124
152 55
160 46
25 105
228 166
185 27
270 224
101 132
20 136
82 102
140 81
228 67
238 257
85 164
211 28
142 97
255 56
224 171
98 241
115 189
117 276
28 108
293 37
15 210
273 248
192 227
152 10
8 134
194 183
136 289
270 54
262 64
9 13
274 75
228 277
244 195
104 74
217 58
125 48
291 225
283 63
160 208
235 111
122 219
76 141
154 196
12 278
78 271
238 269
提供对拍代码
我拍了很多 \(n=16,n=30,n=100\),没拍出来/ll
Linux 版。
shuju.cpp
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {
int n=16;
mt19937 rd(random_device{}());
int rand(int l,int r) { return rd()%(r-l+1)+l; }
void main() {
puts("1");
int x=rand(1,n);
int y=rand(1,n);
while(x==y) y=rand(1,n);
pf("%d %d %d\n",n,x,y);
rep(i,2,n) {
int fa=rand(1,i-1);
pf("%d %d\n",fa,i);
}
}
}
int main() {
freopen("in.txt","w",stdout);
wing_heart :: main();
}
checker.cpp
std 需要关闭文件读写。
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
int main() {
while(1) {
system("./shuju");
system("./inverse < in.txt");
system("./std < in.txt > std.out");
if(system("diff my.out std.out")) {
puts("WA");
exit(0);
} else puts("AC");
}
}
题目菱形 一种情况证明
题目菱形 一种情况证明
要证明这种情况为什么可以转化成别的情况,而不是需要 \(5\) 个点。

考虑对菱形进行不劣的变换。
当菱形越来越像正方形时,它的边长会变短。
这是一种情况(情况 A)(因为有一个点可以到顶点,所以 \(3\) 个点可以确定出菱形):

假如有一个蓝色的点,就会变成下面这种情况 B:

如果向远离正方向的方向对菱形进行变换,会有:
下面这个也是情况 A,同理,如果有一个蓝点卡住就会变成情况 B。

下面是情况 C:

唉,要是变换的时候有一个红色点出去了怎么办?
比如这种,左下角的红点出去了是因为它的位置太下了。边长又缩短了,它就出去了。
可以把菱形往远离正方形的方向(即边长变长)变换,变成上面的情况,左下角的红点一定会被变换后的菱形严格包含。

还有一些其他的情况,感觉无法全部列完,比如下面这种:

似乎可以总结成两种情况,分别向远离正方形和靠近正方向两个方向变换。变换直到某条边被一个点卡住为止。下图演示的是被新的蓝色点卡住的情况(蓝色点未标出):

至此证明了这一种情况一定会被别的情况搜到。
我们其实是要找一种枚举若干点的方案,使得《若干点》可以确定出唯一的菱形,且所有有用的点集都会被搜到。
考虑一个点集,找出它的凸包。(黑色是点集的凸包)
显然点集被菱形包含完全等价于凸包被菱形包含。
假设存在一个合法的红色菱形,这个菱形与凸包可能有若干个交点,如下图这种情况:

显然可以先把一个黑边贴着菱形(平移):

然后把上面绿色的角(顶角)调小(保证面积相同),变成下面的样子。(:

然后把顶角调大,同时向下平移(保证面积相同),直到粉色或者橙色的边碰到凸包:
下图是橙色碰到凸包(情况 A):

下图数粉色碰到凸包(情况 B):

下面是顶角开到最大粉色和橙色仍然都碰不到凸包(情况 C):

显然没有其他情况了。
然后要继续转化情况 B。
平移直到右下边碰到凸包,如下图:

用于测试
欢迎使用 Cmd Markdown 编辑阅读器
二级标题
三级标题
四级标题
五级标题
六级标题
( x^n )
你好!
Windows/Mac/Linux 全平台客户端
你好。
请保留此份 Cmd Markdown 的欢迎稿兼使用说明,如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键
Ctrl+Alt+N。
行内代码
什么是 Markdown
Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题,分割不同的段落,粗体 或者 斜体 某些文字,更棒的是,它还可以
1. 制作一份待办事宜 Todo 列表
2. 书写一个质能守恒公式[^LaTeX]
3. 高亮一段代码[^code]
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {
void main() {
}
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
wing_heart :: main();
}
Cmd Markdown 支持的全部十九种图表参考
8. 绘制表格
| 项目 | 价格 | 数量 |
|---|---|---|
| 计算机 | $1600 | 5 |
| 手机 | $12 | 12 |
| 管线 | $1 | 234 |
答案
根据二项式定理:\((x+y)^n = \sum_{i=0}^n \binom{n}{i} x^i y^{n-i}\)
注意到当 \(i>m\) 的时候 \(\binom{m}{i}=0\),
所以 \(F(x) = (1+x)^m\)。
再见!
为什么这样证明出来吉司机线段树区间取 min,区间加,区间求和的复杂度是单 log,求找漏洞?(大雾)
省流版:
只讨论进行过取 \(\min\) 操作的数。
观察一个区间长度为 \(len\) 的线段树节点。我们把极长的值相同的数字成为一个平台。平台个数不小于数字颜色数。势能定义为平台个数。
区间取 \(\min\) 会使平台增加 \(O(1)\) 个。
单点修改会使平台增加 \(O(1)\) 个。
区间加会使边界的平台分裂,多出 \(O(1)\) 个,而可能处于操作边界的线段树节点只有 \(O(\log n)\) 个。
在没有区间加操作的时候,我们定义一个线段树区间的势能是数字的颜色个数(值相同的数字为同一颜色)。因为每次取 min 递归一次就会把一个区间的最大值和严格次大值合并,势能减 \(1\)。因此时间复杂度等于总势能。
对于初始的线段树,一个区间长度为 \(len\) 的节点势能是 \(O(len)\)。总势能等于所有节点的区间长度之和,即 \(O(n \log n)\)。
我们把目光放到一个长度为 \(len\) 的区间。
我们建立横轴是下标,数轴是值的坐标系,有 \(len\) 个初始点,不妨认为初始点的个数就是势能,即 \(len\)。这里初始点的个数不小于点的颜色数。
对 \([l,r]\) 的初始点进行取 \(\min\) 操作,高处的初始点会“坍塌”到同一高度,形成一个“平台”。我们认为坍塌的点被开除了初始点的名单,成为了一个新的平台。后文平台的定义都是指极大的值相同连续段(不考虑仍然属于初始点的点)。
对于初始点,进行单点和区间加操作不改变势能,因此我们只需要考虑平台的势能。
定义一个区间所有平台的势能等于平台的个数。平台个数不小于属于平台的数的颜色数,所以这么定义是可以的。
一次取 \(\min\) 操作会形成或者裂开 \(O(1)\) 个平台。容易发现只做取 \(\min\) 操作,平台间只存在相邻关系和包含关系(包含就是在一个平台中间再坍塌下去一个小平台)。我们不妨把一个平台包含另一个平台拆开成三个相邻的平台,这不影响平台个数的数量级。因此平台不相交。
对原有平台进行一次单点加操作会生成 \(O(1)\) 个新平台。有 \(\log n\) 个线段树节点会受此影响。
对原有平台进行一次区间加操作,因为平台不相交,被操作完全覆盖的平台只会整体上下平移,只有边界的 \(2\) 个平台会被分裂,因此平台个数增加 \(O(1)\) 个。有 \(2 \log n\) 个线段树节点可能出现被割开的平台。
因此总复杂度是 \(O((n+m) \log n)\) 的。
本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/18706254

浙公网安备 33010602011771号