[考试反思]1018csp-s模拟测试79:荒谬

[考试反思]1018csp-s模拟测试79:荒谬

对,如果你想把第5名粘进来,那么图片就是这么夸张。

然而和我并没有什么关系,实在是太菜了。

但是还是想吐槽出题人是真心没良心啊。。。做了达哥的良心题之后眼光极其挑剔

这套题的部分分设置非常愚蠢,唯一一个可用的部分分在T2,但是T2说的还很不清楚。

T2其实已经完成了最艰难的转化题意,但是最后败在了细节上。

T1也基本上是全场切,结果出锅了。

 

我想问一个问题啊:在时间比较紧的情况下,是应该打完题就打对拍,还是优先往下做题啊?

 

skyh就是没脸。去厕所遇到他的话我这场绝对炸。

发现T2题意前遇到的

我:我估计我60分

FACEFACE:那我肯定不止60分了。我发现T2的题意了,难题。

然后我差点就弃T2了,差点就只剩下50分了。。。

 

T1暴力弹栈暴力恢复,结果恢复的时候往栈里应该是倒序加,而不应该是正序。。。挂70

T2计算$C_n^3$时没除6锅了20分。

。。。

心情稍低沉。越发感觉自己像个傻子。

会题不一定不是傻子。

拿不到分那就是个傻子。。。

吸取教训吧。。。

对拍。要对拍。就你那个程度不打对拍肯定锅。

 

T1:树

因为我蠢所以没想到正解。考场上维护了一个单调栈,然后离线暴干。

会被蒲公英图/扫帚图干掉成$O(n^2)$。但是出题人保证数据随机。我没打正解我没脸。

正解很简单,按照递减序建树,倍增乱搞就行。没心情打了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 vector<int>anc[100005],c[100005],id[100005],tmp[100005];
 7 int fir[100005],l[200005],to[200005],cnt,n,q,w[100005],dep[100005];
 8 int sta[100005],top,sdep[100005],sw[100005],ans[100005];
 9 void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
10 bool com(int a,int b){return a>b;}
11 void dfs(int p,int fa){
12     dep[p]=dep[fa]+1;
13     while(top&&sw[top]<=w[p])top--,tmp[p].push_back(sta[top+1]);
14     sta[++top]=p;sw[top]=w[p];sdep[top]=dep[p];
15     for(int i=0;i<id[p].size();++i){
16         int ed=lower_bound(sw+1,sw+1+top,c[p][i],com)-sw,st=lower_bound(sdep+1,sdep+1+top,dep[anc[p][i]])-sdep;
17         ans[id[p][i]]=max(0,ed-st);
18     }
19     for(int i=fir[p];i;i=l[i])if(to[i]!=fa)dfs(to[i],p);
20     top--;
21     for(int i=(int)tmp[p].size()-1;~i;--i)sta[++top]=tmp[p][i],sw[top]=w[sta[top]],sdep[top]=dep[sta[top]];
22 }
23 int main(){
24     scanf("%d%d",&n,&q);
25     for(int i=1;i<=n;++i)scanf("%d",&w[i]);
26     for(int i=1,x,y;i<n;++i)scanf("%d%d",&x,&y),link(x,y),link(y,x);
27     for(int i=1,u,v,C;i<=q;++i)scanf("%d%d%d",&u,&v,&C),anc[u].push_back(v),c[u].push_back(C),id[u].push_back(i);
28     dfs(1,0);
29     for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
30 }
View Code

相关文章: