这么好的整数场,就终结了我连续莫名考好的记录。

功德圆满了。。。

还是炸了啊。而且炸的还挺厉害(自己又上不去自己粘的榜单啦)

说实在的这场考试做的非常差劲。虽说分数不算特别低但是表现是真的特别差。

T1看错数据范围,数组开小。

真的我以后只要不MLE还是多开一点数组吧不会锅的。

而且好好看题好好看数据范围!!!

T2乱搞+剪枝,数据水就过了。

关键是T3。如果T3打个特别简单的暴力拿40就滚的话就是并列rank1了(虽说在文件评测下skyh多了5分会变成rank2)

但是因为正解很好想,想到了正解就没有打暴力。

一个半小时,到死也没调出来。

不要那么自信啊喂你那么菜老老实实打暴力啊先!!!

临考前出这么多问题,也不知道我是要怎样。

改。改就是了。

T1:组合

根据题目暗示可以抽象成图论。

然后发现就是一个有/无向图欧拉路板子。及时重置fir数组以及当前枚举的边i。(就是当前弧优化)

板子,看代码就好了,这真的没法说。

注意数据范围以及n和m的含义不要看反,不要想当然以为nm同级。

 #include<cstdio>
#define gg return puts("NO"),0
int t,n,m,cnt=,fir[],l[],to[],in[],out[],deg[];
int al[],S,E,el[],ans[],tp;
void dfs(int p){
al[p]=;
for(int i=fir[p];i;i=l[i])if(!al[to[i]])dfs(to[i]);
}
void DFS(int p){
for(int i=fir[p];i;)if(!el[i]){
el[i]=;fir[p]=l[i];
if(t==)el[i^]=;
DFS(to[i]);
ans[++tp]=i;i=fir[p];
}else fir[p]=i=l[i];
}
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;in[b]++;out[a]++;}
int main(){
freopen("merge.in","r",stdin);
freopen("merge.out","w",stdout);
scanf("%d%d%d",&t,&n,&m);
if(t==){
for(int i=,x,y;i<=m;++i)scanf("%d%d",&x,&y),link(x,y),link(y,x);
for(int i=;i<=n;++i)if(in[i]&)
if(!S)S=i;else if(!E)E=i;else gg;
if(!S)for(int i=;i<=n;++i)if(in[i])S=i;
dfs(S);
for(int i=;i<=n;++i)if(!al[i]&&in[i])gg;
puts("YES");
DFS(S);
while(tp)printf("%d ",(ans[tp]>>)*(ans[tp]&?-:)),tp--;
}else{
for(int i=,x,y;i<=m;++i)scanf("%d%d",&x,&y),link(x,y);
for(int i=;i<=n;++i)
if(in[i]==out[i]+){if(!E)E=i;else gg;}
else if(in[i]+==out[i]){if(!S)S=i;else gg;}
else if(in[i]!=out[i])gg;
if(!S)for(int i=;i<=n;++i)if(out[i])S=i;
dfs(S);
for(int i=;i<=n;++i)if(!al[i]&&in[i])gg;
puts("YES");
DFS(S);
while(tp)printf("%d ",ans[tp]-),tp--;
}
}

T2:统计

观察大样例,发现到了后来操作约等于没操作,只有很少的情况下会真正进行操作。

统计每个数后面有几个比它小的,如果没有那么就不操作。

这个统计可以在求逆序对时求出。

 #include<cstdio>
#include<algorithm>
int a[],n,m,cnt[],t[],r[],rp[],tp;long long ans;
void add(int p,int w=){for(;p<=n;p+=p&-p)t[p]+=w;}
int ask(int p,int a=){for(;p;p^=p&-p)a+=t[p];return a;}
void cal(int p){tp=;
for(int i=p;i<=n;++i)if(a[i]<=a[p])r[++tp]=a[i],rp[tp]=i;
std::sort(r+,r++tp);
for(int i=;i<=tp;++i)a[rp[i]]=r[i];
for(int i=;i<=n;++i)t[i]=;
for(int i=n;i>=p;--i)ans-=cnt[i],ans+=(cnt[i]=ask(a[i]-)),add(a[i]);
}
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
for(int i=n;i;--i)ans+=(cnt[i]=ask(a[i]-)),add(a[i]);
printf("%lld ",ans);
while(m--){
int x;scanf("%d",&x);
if(cnt[x])cal(x);
printf("%lld ",ans);
}
}

然而其实复杂度并不好,需要用线段树或链表优化这个过程。

T3:点亮

首先声明:题解傻逼了那个不是方案数那个是最优转移值。。。

至今不知道考场上打的怎么错了。

猜测随机数据生成的树与完全二叉树相近,其实差不多,只不过2变成了e,log变成了ln。

考虑每一个点对最终答案的贡献。

枚举u,再枚举所有点v,得到lca(u,v),根据u和lca(u,v)就可以知道贡献是a[u][v]还是b[u][v]还是0。

所以预处理之后其实贡献就与v无关了,只与u和lca有关。

因为随机树的深度期望为$ln \ n$(实际测试点里稍大,为14)

所以可以状压祖先链上所有的点,1表示这个点的子树里点亮的点大于等于一半。

然后就可以根据祖先链上的情况判断每个点在现在情况下的贡献了。

然后状态定义就是dp[i][j][k]表示以i为根的子树里已经有j个点被点亮了,此时i的祖先链上的状态为k。

然后就可以dp了。转移就是经典的子树归并(所以可能需要滚动dp数组或者使用辅助数组,其实也可以不用)。

形式也很简单,什么DP[p][S+s][j]=max(dp[p][S][j]+dp[son][s][k])什么的。

状态数挺多的,得拿vector来resize存。

没什么好说的。初值-inf。该预处理的预处理。

然后就是代码细节问题。。。不是很好调,真的。。。

话说我感觉我这个$O(n^2)$递推求出所有点对的lca还是挺帅的(仅适用于这种f[i]<i的)

 #include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define inf -66666666
int max(int a,int b){return a>b?a:b;}
int read(){
register int nt=,p=;register char ch=getchar();
while(ch<''||ch>'')nt=ch=='-',ch=getchar();
while(ch>=''&&ch<='')p=(p<<)+(p<<)+ch-'',ch=getchar();
return nt?-p:p;
}
int n,f[],a[][],b[][],lca[][],pre[][][];
int fir[],l[],to[],cnt,sz[],Dep[],DP[][];
vector<int>dp[][];
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
void DFS(int p){
sz[p]=;Dep[p]=Dep[f[p]]+;
for(int i=fir[p];i;i=l[i])DFS(to[i]),sz[p]+=sz[to[i]];
}
void dfs(int p){int dep=Dep[p],alsz=,S=(<<dep)-;
for(int i=;i<=sz[p];++i)dp[p][i].resize(S+),dp[p][i].resize(S+);
for(int i=;i<=sz[p];++i)for(int j=;j<<<dep;++j)dp[p][i][j]=dp[p][i][j]=inf;
for(int j=;j<<<dep;++j){
dp[p][][j]=dp[p][][j]=;
for(int i=;i<=;++i)if(!(j&<<i-))dp[p][][j]+=pre[][p][i];else dp[p][][j]+=pre[][p][i];
}
for(int i=fir[p];i;i=l[i]){int t=to[i];
dfs(t);
for(int i=;i<=alsz+sz[t];++i)for(int j=;j<<<dep;++j)DP[i][j]=inf;
for(int j=;j<=sz[t];++j)for(int k=;k<<<dep;++k)for(int x=;x<=alsz;++x)
DP[x+j][k]=max(DP[x+j][k],dp[p][x][k]+max(dp[t][j][k],dp[t][j][k+S+]));
for(int i=;i<=alsz+sz[t];++i)for(int j=;j<<<dep;++j)dp[p][i][j]=DP[i][j];
alsz+=sz[t];
}
for(int i=;i<=sz[p];++i)for(int j=;j<<<dep;++j)
if(i<sz[p]-i&&j&<<dep-)dp[p][i][j]=inf;
else if(i>=sz[p]-i&&!(j&<<dep-))dp[p][i][j]=inf;
}
main(){
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
n=read();
for(int i=;i<=n;++i)f[i]=read(),link(f[i],i);
for(int i=;i<=n;++i){
for(int j=;j<i;++j)a[i][j]=read(),b[i][j]=read();
for(int j=i+;j<=n;++j)a[i][j]=read(),b[i][j]=read();
}
for(int i=;i<=n;++i)lca[i][i]=i;
for(int i=;i<=n;++i)for(int j=;j<i;++j)lca[i][j]=lca[j][i]=lca[f[i]][j];
for(int i=;i<=n;++i)for(int j=i+;j<=n;++j)lca[i][j]=lca[j][i];
DFS();
for(int i=;i<=n;++i)for(int j=;j<=n;++j)lca[i][j]=Dep[lca[i][j]];
for(int i=;i<=n;++i)for(int j=;j<=n;++j)
pre[][i][lca[i][j]]+=a[i][j],pre[][i][lca[i][j]]+=b[i][j];
dfs();
int ans=inf;
for(int i=;i<=sz[];++i)ans=max(ans,max(dp[][i][],dp[][i][]));
printf("%d\n",ans);
}

注意那个pre数组的预处理,这个不能在里面枚举祖先状态时再枚举每一个点暴力求,会退化成$O(n^3)$

 #include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define inf -66666666
int max(int a,int b){return a>b?a:b;}
int read(){
register int nt=,p=;register char ch=getchar();
while(ch<''||ch>'')nt=ch=='-',ch=getchar();
while(ch>=''&&ch<='')p=(p<<)+(p<<)+ch-'',ch=getchar();
return nt?-p:p;
}
int n,f[],a[][],b[][],lca[][];
int fir[],l[],to[],cnt,sz[],Dep[],DP[][];
vector<int>dp[][];
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
void DFS(int p){
sz[p]=;Dep[p]=Dep[f[p]]+;
for(int i=fir[p];i;i=l[i])DFS(to[i]),sz[p]+=sz[to[i]];
}
void dfs(int p){int dep=Dep[p],alsz=,S=(<<dep)-;
for(int i=;i<=sz[p];++i)dp[p][i].resize(S+),dp[p][i].resize(S+);
for(int i=;i<=sz[p];++i)for(int j=;j<<<dep;++j)dp[p][i][j]=dp[p][i][j]=inf;
for(int j=;j<<<dep;++j){
dp[p][][j]=dp[p][][j]=;
for(int i=;i<=n;++i)if(!(j&<<lca[p][i]-))dp[p][][j]+=a[p][i];
for(int i=;i<=n;++i)if(j&<<lca[p][i]-)dp[p][][j]+=b[p][i];
}
for(int i=fir[p];i;i=l[i]){int t=to[i];
dfs(t);
for(int i=;i<=alsz+sz[t];++i)for(int j=;j<<<dep;++j)DP[i][j]=inf;
for(int x=;x<=alsz;++x)for(int j=;j<=sz[t];++j)for(int k=;k<<<dep;++k)
DP[x+j][k]=max(DP[x+j][k],dp[p][x][k]+max(dp[t][j][k],dp[t][j][k+S+]));
for(int i=;i<=alsz+sz[t];++i)for(int j=;j<<<dep;++j)dp[p][i][j]=DP[i][j]; alsz+=sz[t];
}
for(int i=;i<=sz[p];++i)for(int j=;j<<<dep;++j)
if(i<sz[p]-i&&j&<<dep-)dp[p][i][j]=inf;
else if(i>=sz[p]-i&&!(j&<<dep-))dp[p][i][j]=inf;
}
int main(){
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
n=read();
for(int i=;i<=n;++i)f[i]=read(),link(f[i],i);
for(int i=;i<=n;++i){
for(int j=;j<i;++j)a[i][j]=read(),b[i][j]=read();
for(int j=i+;j<=n;++j)a[i][j]=read(),b[i][j]=read();
}
for(int i=;i<=n;++i)lca[i][i]=i;
for(int i=;i<=n;++i)for(int j=;j<i;++j)lca[i][j]=lca[j][i]=lca[f[i]][j];
for(int i=;i<=n;++i)for(int j=i+;j<=n;++j)lca[i][j]=lca[j][i];
DFS();
for(int i=;i<=n;++i)for(int j=;j<=n;++j)lca[i][j]=Dep[lca[i][j]];
dfs();
int ans=inf;
for(int i=;i<=sz[];++i)ans=max(ans,max(dp[][i][],dp[][i][]));
printf("%d\n",ans);
}

就像这样

%%%mikufun为什么调代码那么快啊我调了半场考试加一个晚上才弄出来他半个晚上就过样例直接秒切了

我好菜啊QAQ

[考试反思]1104csp-s模拟测试100: 终结的更多相关文章

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

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

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

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

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

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

  4. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

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

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

  6. [考试反思]1027csp-s模拟测试90:自我

    其实这套题很好. 但是这次,在T1爆炸的同时,T2和T3并没有出现能弥补的表现. 在AK仍然存在的同时,我居然连一个AC都没有. 所以最后就是一无是处的一场. 考试结束前估分:100+100+30=2 ...

  7. [考试反思]0816NOIP模拟测试23

    210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...

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

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

  9. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

随机推荐

  1. 教你使用Cocos Creator制作国旗头像生成器,附源码!

    关注「编程小王子」公众号回复[头像生成器]获得源码! 下面我重点介绍一下Cocos Creator H5头像生成的实现方法: 获取手机相册图片 在 Cocos Creator 中加载相册图片 Coco ...

  2. [Python] 豆瓣电影top250爬虫

    1.分析 <li><div class="item">电影信息</div></li> 每个电影信息都是同样的格式,毕竟在服务器端是用 ...

  3. [Note] Visual Studio Team Service 中的项目 转到 Git

    Git-tf是微软发布的一个Git工具集的补充,用来让开发人员使用git命令与TFS交互,当然现在VSTS已经直接支持git了,现在讲讲以前用了VSTS的老项目如何转到git,保留所有的change ...

  4. mysql 生成数据字典sql语句

    SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT FROM information_schema. C ...

  5. 卷积神经网络CNN识别MNIST数据集

    这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容. 程序的开头是导入TensorFlow: impor ...

  6. 分库分表(4) ---SpringBoot + ShardingSphere 实现分表

    分库分表(4)--- ShardingSphere实现分表 有关分库分表前面写了三篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3.分库 ...

  7. Redis持久化的方式有哪些?优缺点分别是什么?

    Redis持久化方式        持久化的目的主要是做灾难恢复,数据恢复.由于Redis的数据全都放在内存里面,如果Redis挂了,没有配置持久化的话,重启的时候数据会全部丢失.         突 ...

  8. mysql互为主从(双主)配置

    环境: ubuntu18.04.2 mysql5.7.21 #创建mysql属组 groupadd mysql useradd -g mysql mysql #查看属组 tail /etc/passw ...

  9. Kafka技术原理知识点总结

    1.Kafka是由Linkedin公司开发的,使用Scala语言编写的,分布式,多副本,多分区的,发布订阅模式的消息系统,他通常用于日志系统的搭建,2.Kafka和Zookeeper:Kafka通过Z ...

  10. jsonp与cors跨域解析

    1.浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain的不同 端口port的不 ...