总参赛人数:15

有点菜。

不知道是撞了什么大运没有滚出A层。

但是一回到A层就暴露出了一个大问题:码速

不是调试速度,,就是纯粹码的速度。。。

边讲考试状态边说吧。。。

上来肝T1。一看,是个换根的题?没做过啊。。。

LCT?啊?还要维护子树???这不是之前看的top_tree吗?

600行的玩意考场上还是不要考虑的。

然后就走上了一条不归路。

一个真正坑的暴力就是暴力的码量和调试难度都比正解还高。

幸而都是打熟了的东西,板子出锅倒不多。

但是纯粹码出来用了一个小时???感觉状态也不是很好。

然后没有过大样例,调了一阵没找出来然后决定先看T2T3。

其实出锅的地方是我想尝试改一下板子的某一个地方还坚定地认为它是对的。

T3只要有一点二进制思想就会的特别蠢的dp打出来,尝试优化,明知道它是个多项式。

但因为不会母函数所以即使打了NTT也只会多13分,而时间不够了就没有打(两小时了三道题还都没有分)

随便扔了个暴力dp上去,赶紧回去调T1。

中途给T2打表尝试找规律,然后脸去上厕所,回来的时候看我还在打表发呆就笑话我。

我也不知道他在笑话什么,大概意思就是他T1切了T2也找到规律了吧。。与我无瓜。

最后回T1,怕爆零于是打了一个更暴力的(21分)然后与目标40分的对拍。

打暴力+对拍又码了好久(大半个小时?)。然后调出来倒挺快的。但是这时候只剩下21分钟了。

这时候估计就算想出来哪道题了也打不完了吧。。。于是把T2的表扔了上去,没开long long丢了16分。

期望40+13+46=99。实际86。

可以发现。我的最高期望得分还不如A掉一个然后剩下两个都爆零。

说白了这次考试过程看下来的确很忙但是有一个特点:

没时间思考。一直在码。

这就很不妙了,码到底不出锅还不如认认真真打一道题。。。

看全机房最胖的三个都把T1A了总分就是前三名。

OI主要考的不是码力,真正要区分的就是脑子!

其实我也不能说是不会。T1的代码框架也已经出来了,再想想肯定不会局限与40分。

因为正解并不鬼畜,虽然新颖一些,但是难度并不高。

要思考。

说是在的到底为什么没有思考呢?其实原因倒有很多:首先有点不适应A卷,然后对数据结构有些害怕,还有潜意识里貌似就把自己拍死在暴力上了。

说白了就一句:不要怂,动脑子!

某种意义上,没有思考的话,可能就是浪费了一套卷子。

和前面的考试有些不一样,有时候是想了太久没码,有时候是码了太久没想。

积累经验,自行权衡。

第一次回A卷就不说什么了,希望下一次能不要这么惨吧。。。

T1:Tree

换根是假的。

拍在dfs序上维护子树。

分类讨论要操作的点和当前的根的关系来判断要修改的dfs序区间。

没有那么难。

 #include<cstdio>
int n,q,cnt,fir[],l[],to[],f[][],tim,root=;
long long W[];int re[],dfn[],rdfn[],dep[];
struct Segment_Tree{
int cl[],cr[];long long lz[],w[];
void build(int p,int l,int r){
cl[p]=l;cr[p]=r;
if(l==r){w[p]=W[re[l]];return;}
build(p<<,l,l+r>>);
build(p<<|,(l+r>>)+,r);
w[p]=w[p<<]+w[p<<|];
}
void down(int p){//printf("down:%d\n",p);
lz[p<<]+=lz[p];lz[p<<|]+=lz[p];
w[p<<]+=lz[p]*(cr[p<<]-cl[p<<]+);
w[p<<|]+=lz[p]*(cr[p<<|]-cl[p<<|]+);
lz[p]=;w[p]=w[p<<]+w[p<<|];
}
void add(int p,int l,int r,long long W){//printf("%d %d %d %lld\n",p,cl[p],cr[p],W);
if(l<=cl[p]&&cr[p]<=r){lz[p]+=W;w[p]+=W*(cr[p]-cl[p]+);return;}
if(lz[p])down(p);
if(l<=cr[p<<])add(p<<,l,r,W);
if(r>=cl[p<<|])add(p<<|,l,r,W);
w[p]=w[p<<]+w[p<<|];
}
long long ask(int p,int l,int r){//printf("ask:%d %d %d %lld\n",p,l,r,lz[p]);
if(l<=cl[p]&&cr[p]<=r)return w[p];
if(lz[p])down(p);
return (l<=cr[p<<]?ask(p<<,l,r):)+(r>=cl[p<<|]?ask(p<<|,l,r):);
}
}tree;
void dfs(int p){
dfn[p]=++tim;re[tim]=p;dep[p]=dep[f[p][]]+;
for(int i=;i<=;++i)f[p][i]=f[f[p][i-]][i-];
for(int i=fir[p];i;i=l[i])if(to[i]!=f[p][])f[to[i]][]=p,dfs(to[i]);
rdfn[p]=tim;
}
long long read(register long long p=,register char ch=getchar(),register int nt=){
while(ch<''||ch>''){if(ch=='-')nt=-;ch=getchar();}
while(ch>=''&&ch<='')p=(p<<)+(p<<)+ch-'',ch=getchar();
return p*nt;
}
int lca(int x,int y){
int subdep=dep[x]-dep[y];
if(subdep<)subdep*=-,x^=y^=x^=y;
for(int i=;~i;--i)if(subdep&<<i)x=f[x][i];
if(x==y)return x;
for(int i=;~i;--i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][];
}
int getson(int x,int ff){
int subdep=dep[x]-dep[ff]-;
for(int i=;~i;--i)if(subdep&<<i)x=f[x][i];
return x;
}
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
int main(){//freopen("tree2.in","r",stdin);freopen("my.out","w",stdout);
n=read();q=read();
for(int i=;i<=n;++i)W[i]=read();
for(int i=,a,b;i<n;++i)a=read(),b=read(),link(a,b),link(b,a);
dfs();tree.build(,,n);
for(int i=,opt,u,v,a,b,c,S,LCA;i<=q;++i){
opt=read();u=read();long long x;
if(opt==)root=u;
if(opt==){
v=read();x=read();
c=lca(u,v);a=lca(root,u);b=lca(root,v);
if(dep[a]>dep[b])LCA=a;else LCA=b;
if(dep[c]>dep[LCA])LCA=c;
if(LCA==root)tree.add(,,n,x);
else if(dfn[LCA]<=dfn[root]&&rdfn[root]<=rdfn[LCA])tree.add(,,n,x),S=getson(root,LCA),tree.add(,dfn[S],rdfn[S],-x);
else tree.add(,dfn[LCA],rdfn[LCA],x);
}
if(opt==){
if(root==u)printf("%lld\n",tree.ask(,,n));
else if(dfn[u]<=dfn[root]&&rdfn[root]<=rdfn[u])S=getson(root,u),printf("%lld\n",tree.ask(,,n)-tree.ask(,dfn[S],rdfn[S]));
else printf("%lld\n",tree.ask(,dfn[u],rdfn[u]));
}
}
}

思路积累:

  • 不要把思路拘束于新学的东西上。
  • 能换根的数据结构不多,但是换根不一定真的要重建树,而只是修改了父子关系而已。
  • 问题的转化。研究性质。

T2:Function

神仙题。另写题解

T3:Or

dp[i][j]为已经选了i个数,二进制下已经有了j个1。

 #include<cstdio>
#define int long long
#define mod 998244353
int pw[],f[][],n,k,fac[],invv[],inv[],ans;
int C(int b,int t){return fac[b]*inv[t]%mod*inv[b-t]%mod;}
main(){
scanf("%lld%lld",&n,&k);
invv[]=fac[]=fac[]=inv[]=inv[]=f[][]=pw[]=;pw[]=;
for(int i=;i<=k;++i)fac[i]=fac[i-]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-]*invv[i]%mod,pw[i]=(pw[i-]<<)%mod;
for(int i=;i<=n;++i)for(int j=i;j<=k;++j){
f[i&][j]=;
for(int t=i-;t<j;++t)f[i&][j]+=f[i&^][t]*C(k-t,j-t)%mod*pw[t]%mod;
f[i&][j]%=mod;//printf("%lld %lld %lld\n",i,j,f[i&1][j]);
}
for(int j=n;j<=k;++j)ans+=f[n&][j];
printf("%lld\n",ans%mod);
}

46分暴力

转移的式子符合卷积形式,NTT做n遍可以多拿13分。

 #include<cstdio>
#define int long long
#define mod 998244353
int pw[],f[],n,k,fac[],invv[],inv[],ans,rev[],Inv,invNTT[],bin=;
int pow(int b,int t,int a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
void NTT(int *a,int opt){
for(int i=;i<bin;++i)if(rev[i]<i)a[i]^=a[rev[i]]^=a[i]^=a[rev[i]];
for(int mid=;mid<bin;mid<<=)
for(int i=,w=pow(,opt*(mod-)/mid/+mod-);i<bin;i+=mid<<)
for(int j=,wn=;j<mid;++j,wn=wn*w%mod){
int x=a[i+j],y=a[i+j+mid]*wn%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
}
if(opt==-)for(int i=;i<bin;++i)a[i]=a[i]*Inv%mod;
}
main(){
scanf("%lld%lld",&n,&k);
invv[]=fac[]=fac[]=inv[]=inv[]=f[]=pw[]=;pw[]=;
while(bin<=k)bin<<=; bin<<=;Inv=pow(bin,mod-);
for(int i=;i<=k;++i)fac[i]=fac[i-]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-]*invv[i]%mod,pw[i]=(pw[i-]<<)%mod;
for(int i=;i<=k;++i)invNTT[i]=inv[i];
for(int i=;i<bin;++i)rev[i]=rev[i>>]>>|(i&)*bin>>;
NTT(invNTT,);
for(int i=;i<=n;++i){
for(int s=;s<bin;++s)f[s]=f[s]*pw[s]%mod*fac[k-s]%mod;
NTT(f,);
for(int s=;s<bin;++s)f[s]=f[s]*invNTT[s]%mod;
NTT(f,-);
for(int s=;s<bin;++s)f[s]=f[s]*inv[k-s]%mod;
}
for(int j=;j<=k;++j)ans+=f[j];
printf("%lld\n",ans%mod);
}

59分NTT暴力

NC写的题解看不懂,还要高阶求导做前置知识。

然后用母函数倍增瞎改一下就A了。(题解待补)

 #include<cstdio>
#define int long long
#define mod 998244353
int pw[],f[],n,k,fac[],invv[],inv[],ans,rev[],Inv,bin=,re[];
int pow(int b,int t,int a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
void NTT(int *a,int opt){
for(int i=;i<bin;++i)if(rev[i]<i)a[i]^=a[rev[i]]^=a[i]^=a[rev[i]];
for(int mid=;mid<bin;mid<<=)
for(int i=,w=pow(,opt*(mod-)/mid/+mod-);i<bin;i+=mid<<)
for(int j=,wn=;j<mid;++j,wn=wn*w%mod){
int x=a[i+j],y=a[i+j+mid]*wn%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
}
if(opt==-)for(int i=;i<bin;++i)a[i]=a[i]*Inv%mod;
}
void mul(){
NTT(f,);NTT(re,);
for(int i=;i<bin;++i)f[i]=f[i]*re[i]%mod,re[i]=;
NTT(f,-);
for(int i=k+;i<bin;++i)f[i]=;
}
void G(int N){
if(N==){for(int i=;i<=k;++i)f[i]=inv[i];return;}
G(N>>);
for(int res=,i=;i<=k;++i)re[i]=(res=res*pw[N>>]%mod)*f[i]%mod; mul();
if(N&){for(int res=,i=;i<=k;++i)re[i]=(res=res*pw[N-]%mod)*inv[i]%mod; mul();}
}
main(){
scanf("%lld%lld",&n,&k);
invv[]=fac[]=fac[]=inv[]=pw[]=inv[]=;pw[]=;
while(bin<=k)bin<<=; bin<<=;Inv=pow(bin,mod-);
for(int i=;i<=k;++i)fac[i]=fac[i-]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-]*invv[i]%mod,pw[i]=(pw[i-]<<)%mod;
for(int i=;i<bin;++i)rev[i]=rev[i>>]>>|(i&)*bin>>;
G(n);
for(int j=n;j<=k;++j)ans=(ans+f[j]*fac[k]%mod*inv[k-j])%mod;
printf("%lld\n",ans);
}

[考试反思]0924csp-s模拟测试51:破碎的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. 2019.9.24 csp-s模拟测试51(a) 反思总结

    T1:还在头铁,顺便复习了一下lct[虽然这题用不上因为复杂度不对] 头铁结束. 虽然题目存在换根的操作,实际上并不用真的换根. 2操作中求lca的时候只要考虑原树上root和x.y的lca以及x,y ...

  3. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  4. [CSP-S模拟测试51]题解

    错失人生中第一次AK的机会…… A.attack 支配树板子题.考场上发明成功√ 首先支配树上两点路径之间的点都是必经之点,根据这个性质我们就可以yy出建树的方法.跑拓扑,在每个点(设为$x$)即将入 ...

  5. csp-s模拟测试51(b)attack,tree题解

    题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...

  6. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  7. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  8. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  9. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

随机推荐

  1. 1.Eclipse下载、常用配置、快捷键

    Eclipse官网下载:https://www.eclipse.org/downloads/packages/ 自动补全 位置:Eclipse——Window——Perferences——Java—— ...

  2. B-概率论-贝叶斯决策

    目录 贝叶斯决策 一.贝叶斯决策理论 二.贝叶斯公式 2.1 从条件概率公式推导贝叶斯公式 2.2 从全概率公式推导贝叶斯公式 三.贝叶斯公式应用 更新.更全的<机器学习>的更新网站,更有 ...

  3. 云计算之走进LINUX(一)

    引言 小比特的随笔: 亲爱的博友所有随笔部分记录的是小比特的一些学习笔记,阅读性不是太强仅供有基础的博友参考,对小白来说阅读起来可能会有些吃力.当然也可以参考啦!小比特将在文章部分提供详细的内容介绍供 ...

  4. SQL Server 2012企业版和标准版的区别

    关于使用Microsoft SQL Server 数据库的公司一般会有疑问,企业版数据库和标准版数据库的区别在哪?如果采购企业版的价格和标准版的价格相差很大,从多方资料查询发现,我认为最主要的区别是硬 ...

  5. kettle 利用 HTTP Client 获取猫眼电影API近期上映相关信息,并解析json

    前言 Kettle 除了常规的数据处理之外,还可以模拟发送HTTP client/post ,REST client. 实验背景 这周二老师布置了一项实验: 建立一个转换,实现一个猫眼API热映电影的 ...

  6. 最新2019Pycharm安装破解教程!内附破解码!

    本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...

  7. SecureCRT连接虚拟机下的CentOS7

    1.首先在VMWare下配置CentOS为桥接模式: 2.查看本机ip: 3.ip addr查看centos的mac地址: 4.在root权限下修改/etc/sysconfig/network-scr ...

  8. Web安全 --Wfuzz 使用大全

    前言:  做web渗透大多数时候bp来fuzz   偶尔会有觉得要求达不到的时候 wfuzz就很有用了这时候 用了很久了这点来整理一次 wfuzz 是一款Python开发的Web安全模糊测试工具. 下 ...

  9. C++ 利用template给函数中的变量赋初值

    #include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...

  10. PMBOK(第六版) PMP笔记——《十》第十章(项目沟通管理)

    PMBOK(第六版) PMP笔记——<十>第十章(项目沟通管理) 第十章 项目沟通管理: PM 大多数时间都用在与干系人的沟通上. 第十章有三个过程: 规划沟通管理:根据干系人的需求,制定 ...