闲扯

今天又是暴力满满(并不)的一天呢

昨天老师说了分数要正态分布,今天看起来...不过暴力分很多,虽然我人太傻逼又没打满

T1 woc?不是说送分的吗,看起来又是个树形DP神题,暴力告辞,链上的搞一搞

T2 woc?又是树 纪中这么喜欢出图/树题的吗?第一眼暴力dij告辞

T3 woc?又又又是树?!看起来十分码农?!部分分还好很多,想到昨天老师提到了天天爱跑步的例子,感觉可以搞一搞...于是就开始爆肝了...结果期望30分开了个fread爆0了

\(30+30+0\)凉凉,T2堆改成\(paring\)_\(heap\)就50了,辣鸡STL.虽然有一个更优的暴力...

T1 lkf

又是道神奇树形DP,分析先咕会

懒得写了,看代码注释吧...

这道题好题啊

学会两个技巧

  • 对于差值恰为\(k\)的毒瘤限制,转化为小于等于\(k\)的限制,答案就是小于等于k的减去小于等于k-1的

  • 对于可能重复计算的状态强制安排一个顺序,如dfs序之类的防止算重

/*code by RyeCatcher
*/
inline char gc(){static char buf[SIZE],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
template <class T>inline void read(T &x){x=0;int ne=0;char c;while((c=gc())>'9'||c<'0')ne=c=='-';x=c-48;while((c=gc())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
}
const int maxn=3335;
const int inf=0x7fffffff;
const int P=19260817;
struct Edge{int ne,to;
}edge[maxn<<1];
int h[maxn],num_edge=1;
inline void add_edge(int f,int to){edge[++num_edge].ne=h[f];edge[num_edge].to=to;h[f]=num_edge;
}
int n,k,w[maxn],mx=-inf;
int id,o,lim;
ll f[maxn][maxn];
ll ans=0;
void dfs(int now,int fa){int v;ll p=1;//printf("%d %d\n",now,fa);for(ri i=h[now];i;i=edge[i].ne){v=edge[i].to;if(v==fa)continue;if(w[v]>=o&&w[v]<=o+lim&&(w[v]!=o||(w[v]==o&&v>id))){//前两个限制是因为状态的设计本身,第三个限制是防止联通块算重,如果还有一个点值为枚举的最小值,我们可能已经计算了那个联通块的个数//于是我们强制安排一个顺序使得不重不漏dfs(v,now);p=p*(f[v][lim]+1)%P;//乘法原理,连上v贡献为f[v][lim] 否则为1}}f[now][lim]=p;return ;
}
int main(){int x,y;read(n),read(k);for(ri i=1;i<=n;i++){read(w[i]);}for(ri i=1;i<n;i++){read(x),read(y);add_edge(x,y);add_edge(y,x);}for(ri i=1;i<=n;i++){o=w[i],id=i,lim=k;dfs(i,0);if(k==0){ans=(ans+f[i][k])%P;//f[i][k]表示最小值为i,最大值与最小值之差小于等于k的不同联通块}else{lim=k-1;dfs(i,0);ans=(ans+(f[i][k]-f[i][lim])%P+P)%P;//显然f[i]][k]-f[i][k-1]即为差值刚好为k的联通块个数}}printf("%lld\n",ans%P);return 0;
}

T2 worry

有个性质就是因为你树上边随便走,你断掉一条树边后你最多走一条非树边。\(naiive\)的做法就是枚举了,有没有更高明的呢?

我们边从小到大排序,发现对于边\((x,y)\),它影响\((x,y)\)路径上的边(也就是断掉路径上的任何一条边还可以通过\((x,y)\)联通),也就是\(x,y\)分别到\(lca(x,y)\)路径上的

树链剖分

那么链剖就可以搞喽,线段树维护一个永久标记,如果有标记了也不管(因为边权从小到大排序)

跑得还挺快

/*code by RyeCatcher
*/
inline char gc(){static char buf[SIZE],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
}
template <class T>inline void read(T &x){x=0;int ne=0;char c;while((c=gc())>'9'||c<'0')ne=c=='-';x=c-48;while((c=gc())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
}
const int maxn=200005;
const int inf=0x7fffffff;
int n,m;
struct Edge{int ne,to;ll dis;
}edge[maxn<<1];
int h[maxn],num_edge=1;
inline void add_edge(int f,int to,ll c){edge[++num_edge].ne=h[f];edge[num_edge].to=to;edge[num_edge].dis=c;h[f]=num_edge;
}
pair<int,int> qwq[maxn];
struct Niconiconi{int x,y;ll dis;Niconiconi(){x=y=dis=0;}Niconiconi(int _x,int _y,ll _c){x=_x,y=_y,dis=_c;}bool operator <(const Niconiconi &rhs)const{return dis<rhs.dis;}
}con[maxn<<1];
int dep[maxn],fa[maxn],son[maxn],size[maxn],top[maxn],dfn[maxn],rnk[maxn],tot=0;
void dfs1(int now){int v;size[now]=1;//printf("%d %d\n",now,fa[now]);for(ri i=h[now];i;i=edge[i].ne){v=edge[i].to;if(v==fa[now])continue;dep[v]=dep[now]+1,fa[v]=now;dfs1(v);size[now]+=size[v];if(!son[now]||size[son[now]]<size[v])son[now]=v;}return ;
}
void dfs2(int now,int t){int v;top[now]=t,dfn[now]=++tot,rnk[tot]=now;if(!son[now])return ;dfs2(son[now],t);for(ri i=h[now];i;i=edge[i].ne){v=edge[i].to;if(v==fa[now]||v==son[now])continue;dfs2(v,v);}return ;
}
int tag[maxn<<2],w[maxn];
int L,R,dta;
inline void pushdown(int now){if(!tag[now<<1])tag[now<<1]=tag[now];//tag[now<<1|1]=tag[now];if(!tag[now<<1|1])tag[now<<1|1]=tag[now];
}
void update(int now,int l,int r){if(tag[now])return ;if(L<=l&&r<=R){tag[now]=dta;return ;}int mid=(l+r)>>1;pushdown(now);if(L<=mid&&!tag[now<<1])update(now<<1,l,mid);if(mid<R&&!tag[now<<1|1])update(now<<1|1,mid+1,r);return ;
}
void ahaha(int now,int l,int r){if(l==r){if(tag[now])w[rnk[l]]=tag[now];else w[rnk[l]]=-1;return ;}int mid=(l+r)>>1;pushdown(now);ahaha(now<<1,l,mid);ahaha(now<<1|1,mid+1,r);return ;
}
inline void update_path(int x,int y){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])std::swap(x,y);L=dfn[top[x]],R=dfn[x];update(1,1,n);x=fa[top[x]];}if(dep[x]>dep[y])std::swap(x,y);L=dfn[x]+1,R=dfn[y];//printf("--%d %d--\n",rnk[L],rnk[R]);if(L>R)return ;update(1,1,n);
}
int main(){int x,y;ll z;FO(worry);read(n),read(m);for(ri i=1;i<n;i++){read(x),read(y);add_edge(x,y,0);add_edge(y,x,0);qwq[i]=pair<int,int>(x,y);}for(ri i=1;i<=m;i++){read(x),read(y),read(z);con[i]=Niconiconi(x,y,z);}std::sort(con+1,con+1+m);dep[1]=0,fa[1]=0;dfs1(1);dfs2(1,1);memset(tag,0,sizeof(tag));for(ri i=1;i<=m;i++){x=con[i].x,y=con[i].y,dta=con[i].dis;update_path(x,y);}ahaha(1,1,n);for(ri i=1;i<n;i++){x=qwq[i].first,y=qwq[i].second;if(dep[x]<dep[y])std::swap(x,y);printf("%d\n",w[x]);}return 0;
}

并查集

题解是更高明的并查集做法,我还是Too Young Too Simple,只会SB暴力树剖

每个点指向下一个没被打标记的点\(nxt[x]\)(以点代边),显然这是可传递的

这样的话每次查询直接往上跳就好了,连LCA都不用求

居然跑到rank1哈哈

/*code by RyeCatcher
*/
inline char gc(){static char buf[SIZE],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
template <class T>inline void read(T &x){x=0;int ne=0;char c;while((c=gc())>'9'||c<'0')ne=c=='-';x=c-48;while((c=gc())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
}
const int maxn=100005;
const int inf=0x7fffffff;
int n,m;
struct Edge{int ne,to;
}edge[maxn<<1];
int h[maxn],num_edge=1;
inline void add_edge(int f,int to){edge[++num_edge].ne=h[f];edge[num_edge].to=to;h[f]=num_edge;
}
struct Niconiconi{int x,y,z;bool operator <(const Niconiconi &qwq)const{return z<qwq.z;}
}nico[maxn];
int ans[maxn],dep[maxn],fa[maxn],nxt[maxn],fa_id[maxn];
int get(int x){return (nxt[x]==x)?nxt[x]:nxt[x]=get(nxt[x]);}
void dfs(int now){int v;for(ri i=h[now];i;i=edge[i].ne){if((v=edge[i].to)==fa[now])continue;fa[v]=now,dep[v]=dep[now]+1,fa_id[v]=i;dfs(v);}return ;
}
int main(){int x,y,z,p;FO(worry);read(n),read(m);nxt[n]=n;for(ri i=1;i<n;i++){read(x),read(y);add_edge(x,y),add_edge(y,x);nxt[i]=i;}for(ri i=1;i<=m;i++){read(nico[i].x),read(nico[i].y),read(nico[i].z);}std::sort(nico+1,nico+1+m);fa[1]=0,dfs(1);for(ri i=1;i<=m;i++){x=get(nico[i].x),y=get(nico[i].y),z=nico[i].z;while(x!=y){if(dep[x]<dep[y])std::swap(x,y);ans[fa_id[x]]=z;nxt[x]=x=get(fa[x]);    }}p=2*n;for(ri i=2;i<p;i+=2){printf("%d\n",ans[i]?ans[i]:(ans[i^1]?ans[i^1]:-1));}return 0;
}

转载于:https://www.cnblogs.com/Rye-Catcher/p/9819789.html

[NOIP2018模拟赛10.19]只会暴力报告相关推荐

  1. 备战Noip2018模拟赛10(B组) T1 Max 和最大

    10月20日备战Noip2018模拟赛10 T1 Max和最大 题目描述 CYF的黑题,偏题,怪题,黑科技题,大码农题都做腻了,于是她想做一下签到水题,她希望从有一个长度为ň的整数序列(A1,A2,. ...

  2. 备战Noip2018模拟赛11(B组)T4 Path 好路线

    10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...

  3. 备战Noip2018模拟赛20 (A组) T1 Cz 礼物

    10月24日备战Noip2018模拟赛20(A组) T1 Cz礼物 题目描述 有Ñ种物品,第I种物品的价格为六,每天最多购买XI个. 有米天,第我天c♂x有无线的钱,他会不停购买能买得起的最贵的物品( ...

  4. 备战Noip2018模拟赛7(B组)T1 Voting 兔子选举

    10月5日备战Noip2018模拟赛7(B组) T1 Voting 兔子选举 题目描述 兔子常常感到孤独,所以一组的兔子决定走到一起,并举行选美比赛,以确定它们之间谁拥有最漂亮的耳朵.规则如下: 每只 ...

  5. 备战Noip2018模拟赛3(B组)T1 Apple 韬韬抢苹果

    10月3日备战Noip2018模拟赛3(B组) T1 Apple韬韬抢苹果 题目描述 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发生 ...

  6. 备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈

    10月3日备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈 题目描述 在全世界人民的期盼下,2008年北京奥林匹克运动会终于隆重召开了! 为了展示中华民族博大精深的优秀传统文化,负责开 ...

  7. 备战Noip2018模拟赛5(B组)T2 Tree 采果子

    10月4日备战Noip2018模拟赛5(B组) T2 Tree采果子 题目描述 LYL大牛今天心情不错,于是走到埃及郊外旅游.他边走边向四周望望,发现周围有许多果树.这些树之间互相到达的时间LYL是知 ...

  8. 备战Noip2018模拟赛7(B组)T2 Pearl 数数

    10月5日备战Noip2018模拟赛7(B组) T2珍珠数 题目描述 给定Ñ个整数,求值在某个范围内的数的个数. 输入格式 第一行为正整数ñ. 第二行有Ñ个整数(0 <=数值<= 231- ...

  9. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

最新文章

  1. Vue.nextTick()理解
  2. 湖北省政府网站刊文:感染新冠肺炎的适龄男性应进行生育力检查
  3. C#中对文件进行选择对话框打开和保存对话框进行复制
  4. 【27前端】base标签带有href属性会让chrome里的svg元素url失效
  5. chrome 开发者工具,查看元素 hover 样式
  6. java 常量区存放 new_java---堆、栈、常量池的存储数据
  7. 装饰者模式(Decorator)
  8. jquery 逗号分割截取字符串_经典面试题:分割回文串
  9. springmvc个人小结
  10. linux学习记录8
  11. JavaScript学习心得04
  12. K-fold vs. Monte Carlo cross-validation(K折交叉验证与蒙特卡洛交叉验证(MCCV))
  13. 阶段3 1.Mybatis_03.自定义Mybatis框架_2.自定义Mybatis的分析-创建代理对象的分析
  14. 在WPF里面实现以鼠标位置为中心缩放移动图片
  15. 对方qq空间权限需要申请访问怎么破解
  16. 【机器学习中的矩阵求导】(五)矩阵对矩阵求导
  17. DDOS攻击如何防御
  18. Java 随机数之从指定数据范围内随机选取n个不重复的数据
  19. TCP协议格式和特点
  20. linux 校园网 自动认证,使用 Padavan 路由器实现校园网自动 Web 认证

热门文章

  1. 用javascript伪造太阳系模型系统
  2. Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
  3. Java 技术篇-用java自带的内存检测工具排查内存泄漏问题,查看java垃圾回收情况,监控java堆内存变化
  4. Chrome 技术篇-console控制台检测xpath、css唯一性
  5. stm32寄存器映射
  6. [YTU]_2911(我想放假)
  7. logspace--创建对数等分向量
  8. Android NDK环境搭建
  9. 关于web.xml3.0启动报错
  10. 关于面试,我也有说的