[考试反思]0917csp-s模拟测试45:天命
又倒一了。
关于心态,有不少想说的。
首先旁边坐了一个kx。他上来入手T1没多久就切了然后开始对拍拍了几十万组AC。
然而我觉得T1是神仙题。先进T2。
挺简单的,5分钟出正解,然后在打出来的时候突然有了个主意,感觉是等价的,就按照后来的那种想法打了。
然而根本就没有想,其实后者是错的,错的极其可笑,随随便便就能hack。
然而我没有证明也没有hack,就把正解埋没了。
大样例一过就交了,果断爆零。
这是后skyh开始犯贱,开始瞅着别人笑,我和mikufun鄙视了他一下后继续答题。
然后进T3。显然是个数据结构题。
思路还比较好想,花了15分钟想就想出来了。
但是瞬间就发现这题用的知识点有点多:链修改,求两点间最大边权,最小生成树。
也就是lct/树链剖分+克鲁斯卡尔。。。我脑子抽了还倍增了一下lca以及求距离
剩的时间比较多,我有一个致命的想法:
我平时考场上基本没A掉数据结构题过,这样下去不利于发展。
于是我毅然觉然地走上了正解的道路。
二营长虚了把空调关了,然后我本来就离空调远,特别热。。。
然后越打越头晕,感觉体温都上来了,而且看屏幕都逐渐有了重影(其实是屏幕的问题)
换了个稍硬的键盘敲不动,打各种板子的过程极其痛苦。。。
不管怎么说,2个小时,打出来了,过掉了大样例,心情极佳。
我感觉这是我为数不多能在考场上干掉的大型数据结构题。
然后数据出锅了,只有10分。
也感谢数据没有特别狗屎还给我留下了10分,不然我这场考试就爆零了。
考场上的我并不知道,我以为我A掉2个了。我感觉我状态不错,虽然头晕眼花满头大汗。
还有一个小时给T1,我一想kx在我旁边几十分钟就切了T1,我感觉我应该也可以。
然而感觉自己状态已经抗不住了,先出去透了个风,散散热,缓了一下脑子。
但是还是不会,一如既往的想用网络流乱搞二分图匹配。
按照数据范围说应该是60分?那么260应该不会太低。
所以不再冒着风险想正解了,开始调网络流。
死循环,调了一阵,过了大样例。交了,70分。
感觉数组开大了怕MLE,于是开小一点,再试了一遍大样例,再交。
这一次忘了删freopen了,用0分把70分盖掉了。
结束了,总分10分。
心态还是不行:期望太高了。考场上千万不能盲目自信。
然后还有在最后几分钟着急容易致错。这已经是第二次freopen出锅了。
另外题目的难易度判断也有问题。先T3后T1是个巨大的失误。。。
不要相信大样例!!!一定要对拍!!!
不要想太多。得分高就是王道。
就这样吧。
T1:kill
据说可以nlog做,不会。
两种n2都很好想。但都需要先发现一个性质。
一个性质是打的怪是连续的区间,枚举第一个打的即可。
另一个性质是按位置排序后,每个人打的每个怪的位置是递增的。
两个性质都很好证,但是考场上发现也是不容易。
然后就可以dp乱搞了。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int abs(int p){return p>?p:-p;}
int dp[][],n,m,s,p[],q[];
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=n;++i)scanf("%d",&p[i]);
for(int i=;i<=m;++i)scanf("%d",&q[i]);
sort(p+,p++n);sort(q+,q++m);memset(dp,0x3f,sizeof dp);
for(int i=;i<=m;++i)dp[i][]=;
for(int i=;i<=m;++i)for(int j=;j<=n;++j)
dp[i][j]=min(dp[i-][j],max(dp[i-][j-],abs(p[j]-q[i])+abs(s-q[i])));
printf("%d\n",dp[m][n]);
}
#include<cstdio>
#include<iostream>
using namespace std;
int fir[],l[],to[],cnt,n,m,p[],q[],s,dep[];
bool v[];int qu[];
int abs(int p){return p>?p:-p;}
void link(int a,int b,int vv){
l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;v[cnt]=vv;
}
bool bfs(){
int top=;for(int i=;i<=n+m+;++i)dep[i]=-;
for(int qh=;qh<=top;++qh)for(int i=fir[qu[qh]];i;i=l[i])if(v[i]&&dep[to[i]]==-)
dep[to[i]]=dep[qu[qh]]+,qu[++top]=to[i];
return dep[n+m+]!=-;
}
int dfs(int p,int flow){//printf("%d %d\n",p,flow);
if(p==n+m+)return flow;
int res=flow;
for(int i=fir[p];i;i=l[i])if(dep[to[i]]==dep[p]+&&v[i]&&res){
int acs=dfs(to[i],);
if(!acs){dep[to[i]]=;continue;}
v[i]=;v[i^]=;res--;
}
return flow-res;
}
bool chk(int tim){
int maxflow=;
for(int i=;i<=n+m+;++i)fir[i]=;cnt=;
for(int i=;i<=n;++i)link(,i,),link(i,,);
for(int i=;i<=m;++i)link(n+i,n+m+,),link(n+m+,n+,);
for(int i=;i<=n;++i)for(int j=;j<=m;++j)if(abs(p[i]-q[j])+abs(q[j]-s)<=tim)
link(i,n+j,),link(n+j,i,);
while(bfs())maxflow+=dfs(,n);//,printf("%d\n",maxflow);
return maxflow==n;
}
int main(){freopen("kill.in","r",stdin);
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=n;++i)scanf("%d",&p[i]);
for(int j=;j<=m;++j)scanf("%d",&q[j]);
int l=,r=;
while(l<r-)if(chk(l+r>>))r=l+r>>;else l=(l+r>>)+;
if(chk(l))printf("%d\n",l);else printf("%d\n",r);
}
把freopen去掉后是个70分的暴力(二分答案,网络流判定)
思路积累:
- 猜测性质,发现性质,证明性质。
- 网络流乱搞二分图匹配。
- 网络流求最大权值时不能直接求,采用二分答案。
T2:beauty
贪心。
从下往上回溯时,你当然不想让子树里的点配对,让它们往上一起延伸显然会使答案更优。
但是如果子树外能配对的点的数量已经没有子树里面的多了,那么就必须在这里配对几个了。
不能理解为:如果子树里多余k就必须配对,错的。
两遍dfs。
#include<cstdio>
int n,k,a,fir[],l[],to[],cnt,siz[],r[];long long ans;
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
void dfs(int p,int fa){
r[p]=siz[p];
for(int i=fir[p];i;i=l[i])if(to[i]!=fa)dfs(to[i],p),siz[p]+=siz[to[i]];
}
void DFS(int p,int fa){
for(int i=fir[p];i;i=l[i])if(to[i]!=fa)DFS(to[i],p),r[p]+=r[to[i]],ans+=r[to[i]];
if(p==)return;
while(r[p]>k*-siz[p])r[p]-=;
}
int main(){//freopen("beauty.in","r",stdin);
scanf("%d%d%d",&n,&k,&a);
for(int i=,x;i<=k<<;++i)scanf("%d",&x),siz[x]++;
for(int i=,x,y;i<n;++i)scanf("%d%d",&x,&y),link(x,y),link(y,x);
dfs(,);DFS(,);printf("%lld\n",ans);
}
思路积累:
- 树上贪心:考虑链的延伸。
- 不要投机取巧,认真写式子,仔细证明。
T3:weight
数据出锅,不保证联通,所有与1号点不联通的边的答案都是0。
因为std是从1号节点开始dfs的,所以不联通的点没更新,答案都是0。
观察题目,既然题目一直在说最小生成树,那就把最小生成树弄出来吧。
发现:已经在树上的边,答案一定不比目前权值小超过1,对于非树上的边答案一定不比当前权值小。
对于非树边,只要它的权值小于最小生成树上对应两点之间的边权最大值,那么它就可以取代那条边进入最小生成树。
对于树边,它不能被取代,所以它要小于所有经过这条边的非树边的最小值。
链修改,树上两点距离,单点查询。
lct板子。或者树链剖分。或者倍增离线处理(推荐zkt的,很好打)。cbx说可以线段树合并。
思路不难,关键在实现。
因为数据有锅,所以不能用“p的父亲的重儿子是否为p”的方法判p是否为重链顶端。会炸成10分。
//对于不再最小生成树上的边,答案为两点之间边的最大值-1
//更新答案时,它只会覆盖一条链上的所有边,这条链上的所有边的答案对其权值-1取min
//链操作--树链剖分?lct?
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a,fir[],l[],to[],siz[],cnt,hson[],tfe[];
int ans[],top[],dep[],f[][],mx[][],v[];
int len[],tcnt,lc[],rc[],w[],rt[],lz[];
int cl[],cr[],tmp[],g[];
void build(int &p,int l,int r){
p=++tcnt;w[p]=;
cl[p]=l;cr[p]=r;
if(l==r)return;
build(lc[p],l,l+r>>);
build(rc[p],(l+r>>)+,r);
}
void down(int p){//printf("%d %d %d %d %d\n",p,lc[p],rc[p],w[lc[p]],w[rc[p]]);
w[lc[p]]=min(w[lc[p]],lz[p]);
w[rc[p]]=min(w[rc[p]],lz[p]);
if(lz[lc[p]])lz[lc[p]]=min(lz[lc[p]],lz[p]);else lz[lc[p]]=lz[p];
if(lz[rc[p]])lz[rc[p]]=min(lz[rc[p]],lz[p]);else lz[rc[p]]=lz[p];
lz[p]=;//printf("%d %d %d %d %d\n",p,lc[p],rc[p],w[lc[p]],w[rc[p]]);
}
void set(int p,int l,int r,int W){//printf("%d %d %d %d %d %d\n",p,l,r,w,cl[p],cr[p]);
if(l<=cl[p]&&cr[p]<=r){if(lz[p])lz[p]=min(lz[p],W);else lz[p]=W;w[p]=min(w[p],W);return;}
if(l<=cr[lc[p]])set(lc[p],l,r,W);
if(r>=cl[rc[p]])set(rc[p],l,r,W);
}
void ask(int p){//printf("%d\n",p);
if(cl[p]==cr[p]){tmp[cl[p]]=w[p];return;}
if(lz[p])down(p);
ask(lc[p]);ask(rc[p]);
}
struct edge{
int a,b,v,num;
friend bool operator<(edge a,edge b){return a.v<b.v;}
}e[];
void link(int a,int b,int vv,int gg){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;v[cnt]=vv;g[cnt]=gg;}
int fa[],in[];
int find(int k){return fa[k]==k?k:fa[k]=find(fa[k]);}
void Kruscal(){
sort(e+,e++m);
for(int i=;i<=n;++i)fa[i]=i;
for(int i=;i<=m;++i)if(find(e[i].a)!=find(e[i].b))
fa[fa[e[i].a]]=fa[e[i].b],in[e[i].num]=,
link(e[i].a,e[i].b,e[i].v,e[i].num),link(e[i].b,e[i].a,e[i].v,e[i].num);
}
void dfs(int p,int fa){
siz[p]=;dep[p]=dep[fa]+;f[p][]=fa;
for(int i=;i<=;++i)f[p][i]=f[f[p][i-]][i-],mx[p][i]=max(mx[p][i-],mx[f[p][i-]][i-]);
for(int i=fir[p];i;i=l[i])if(to[i]!=fa){
mx[to[i]][]=v[i];
dfs(to[i],p),siz[p]+=siz[to[i]],tfe[to[i]]=g[i];
if(siz[to[i]]>siz[hson[p]])hson[p]=to[i];
}
}
void DFS(int p,int tp){
top[p]=tp;len[tp]=dep[p]-dep[tp]+;
for(int i=fir[p];i;i=l[i])if(to[i]!=f[p][]&&to[i]!=hson[p])DFS(to[i],to[i]);
if(hson[p])DFS(hson[p],tp);
}
int lca(int a,int b){
if(dep[a]<dep[b])swap(a,b);
int subdep=dep[a]-dep[b];
for(int i=;~i;--i)if(subdep&<<i)a=f[a][i];
if(a==b)return a;
for(int i=;~i;--i)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
return f[a][];
}
int cal(int p,int fa){
int re=,subdep=dep[p]-dep[fa];
for(int i=;~i;--i)if(subdep&<<i)re=max(re,mx[p][i]),p=f[p][i];
return re;
}
void update(int p,int fa,int w){
while(top[p]!=top[fa]){
set(rt[top[p]],,dep[p]-dep[top[p]]+,w);
p=f[top[p]][];
}
if(p!=fa)set(rt[top[p]],dep[fa]-dep[top[p]]+,dep[p]-dep[top[p]]+,w);
}
void dfs_hson(int p,int ord){
ans[tfe[p]]=tmp[ord]-;
if(hson[p])dfs_hson(hson[p],ord+);
}
int main(){//freopen("weight.in","r",stdin);
scanf("%d%d%d",&n,&m,&a);
for(int i=;i<=m;++i)scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].v),e[i].num=i;
Kruscal();dfs(,);DFS(,);
for(int i=;i<=n;++i)if(len[i])build(rt[i],,len[i]);
for(int i=;i<=m;++i)if(!in[e[i].num]){
int LCA=lca(e[i].a,e[i].b),DT=max(cal(e[i].a,LCA),cal(e[i].b,LCA));
ans[e[i].num]=DT-;
update(e[i].a,LCA,e[i].v);update(e[i].b,LCA,e[i].v);
}
for(int i=;i<=n;++i)if(hson[f[i][]]!=i)ask(rt[i]),dfs_hson(i,);//for(int i=1;i<=4;++i)printf("%d\n",tmp[i]);
for(int i=;i<=m;++i)if(ans[i]==)printf("-1 ");else printf("%d ",ans[i]);
}
思路积累:
- 链修改的各种方法:lct,熟练剖分。
- 离线。
- 最小生成树的性质。
- 判熟练剖分重儿子的方法。
[考试反思]0917csp-s模拟测试45:天命的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- 2019.9.17 csp-s模拟测试45 反思总结
来了来了,垃圾二连.[指两次发博客] 看了一下题就匆匆回去上课,在课上一边听课一边水oi,大概用1h40min的时间想完三道题.最后回到机房只剩下40min的时间敲代码,于是T1骗了70分就走了… 这 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试45]题解
开局一行$srand$,得分全靠随机化. A.kill 发现两个并不显然的性质: 1.选中的人和怪物一定是按顺序的.第一个人打所有被选中怪物的第一只,第二个人打第二只,$etc$. 2.最优方案打的怪 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
随机推荐
- [Java web] JSP 内置对象
1. Application 服务器启动后产生,所有用户共用一个Application,可以往里面存一些键值对 2. Session 会话对象,第一个JSP页面被装载时自动创建.从一个客户打开浏览器并 ...
- IDEA 学习笔记之 Web项目开发
Web项目开发: 添加新模块: 起名: 添加jars: 添加Tomcat/local: 添加项目: 启动Tomcat: 看到web页面: 修改页面: 重新部署页面:
- ADB命令无法导出文件到物理机上处理办法
因为想查看一下脚本生成的sqlite文件.就想导出文件,,结果导出adb pull命令一直报错.使用su也是错误的..最后发现adb pull 不能再adb的命令状态下执行.需要退出adb命令.然后直 ...
- Cocos Creator实现大炮英雄,附代码!
游戏预览 开始场景 搭建开始场景 摆放一个背景图,在背景图上添加背景地面.开始按钮.4个角色选择按钮.游戏logo. 创建游戏脚本 1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景.跳转 ...
- Maven下载速度过慢问题已解决
因为Maven 默认仓库的服务器在国外所以我们国内的使用效果极差,我们可以修改成为国内镜像地址加速下载. 两种方法 修改全局文件 C:\Users\您电脑帐号\ .m2\settings.xml没有文 ...
- Tomcat基本知识(一)
顶层架构先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务 ...
- eclipse中的项目运行时不出现run as→java application选项
eclipse中的运行java project时不出现run as→java application选项? 解决方案☞必须有正确的主方法,即public static void main(String ...
- sqli-labs靶机注入笔记1-10关
嗯,开始记录sqli-lab的每关笔记,复习一次 1-2关 基于错误的字符串/数字型注入 闭合的符号有区别而已 http://www.sqli-lab.cn/Less-1/?id=1 or 1=1 - ...
- 实验吧之【拐弯抹角】(url伪静态)
题目地址:http://ctf5.shiyanbar.com/indirection/ 打开后给了源码 <?php // code by SEC@USTC echo '<html>& ...
- RIDE的Edit界面
有四种类型的Edit界面(注:测试套件主要是存放测试案例,资源文件主要是存放用户关键字) 1.测试套件(file类型)的Edit界面 首先展开Setting: 对右侧红框按钮简单说明: Library ...