文章目录

  • ResultResultResult
  • HyperlinkHyperlinkHyperlink
  • DescriptionDescriptionDescription
  • SolutionSolutionSolution
  • CodeCodeCode

ResultResultResult


HyperlinkHyperlinkHyperlink

http://noip.ybtoj.com.cn/contest/105/problem/3


DescriptionDescriptionDescription

一张无向图G{n,m}G\{n,m\}G{n,m},给定点权和边权,现在要求降低这张图的点权,使得任意一条边权等于它连接的两个点的点权和

求最小/大的点权和

数据范围:n≤5×105,m≤3×106n\leq 5\times 10^5,m\leq 3\times 10^6n≤5×105,m≤3×106


SolutionSolutionSolution

最小点权和=点权和-最大可删除点权
最大点权和=点权和-最小可删除点权

考虑求删除点权的范围即可

假设我们选定一个点aaa,它的权值是xxx,现在有二条边a−>b−>ca->b->ca−>b−>c,边权分别为di,djd_i,d_jdi​,dj​,设b,cb,cb,c的权值为y,zy,zy,z

则有0≤di−x≤y0\leq d_i-x\leq y0≤di​−x≤y移项可以得到yyy的取值范围
同理,有0≤dj−di+x≤z0\leq d_j-d_i+x\leq z0≤dj​−di​+x≤z移项可以得到zzz的取值范围

容易发现,aaa可以到达的点(即同一个联通块内),每个点的取值范围都是关于xxx的一次函数f(x)=kx+bf(x)=kx+bf(x)=kx+b,显然我们讨论kkk即可得到他们的取值范围,最后取它们解集的交集即可

需要注意的是,如果构成了环,那么会得到方程k1x+b1=k2x+b2k_1x+b_1=k_2x+b_2k1​x+b1​=k2​x+b2​,其中k1,b1k_1,b_1k1​,b1​是你通过这条返祖边(构成环的那条边)得到的kkk和bbb,k2,b2k_2,b_2k2​,b2​是这个点之前得到的kkk和bbb
讨论它解的情况即可

具体地,若k1=k2k_1=k_2k1​=k2​,当且仅当b1=b2b_1=b_2b1​=b2​时该方程有无限组解,否则无解
无限组解说明这个点的权值随便改,那我们可以不用管它,无解返回0即可
否则,则方程存在根x=b2−b1k1−k2x=\frac {b_2-b_1}{k_1-k_2}x=k1​−k2​b2​−b1​​,判断这玩意儿是不是整数即可

时间复杂度:O(n+m)O(n+m)O(n+m)


CodeCodeCode

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 500010
using namespace std;int n,m,p[N],l[N],tot,u,v;
struct node{int next,to;LL w;}e[6000010];LL w;
inline void add(int u,int v,LL w){e[++tot]=(node){l[u],v,w};return (void)(l[u]=tot);return;}
LL sum,b[N],sumb,L,R,maxs,mins;
int k[N],sumk;
inline bool ck(int K1,LL B1,int K2,LL B2)
{if(K1==K2) return B1==B2;if((B2-B1)%(K1-K2)) return false;LL w=(B2-B1)/(K1-K2);if(w<L||w>R) return false;return (L=R=w,true);
}
inline bool dfs(int x)
{sumk+=k[x];sumb+=b[x];if(k[x]==1) L=max(L,-b[x]),R=min(R,p[x]-b[x]);else L=max(L,b[x]-p[x]),R=min(R,b[x]);if(L>R) return 0;for(register int i=l[x];i;i=e[i].next){int y=e[i].to;if(k[y]) {if(ck(-k[x],e[i].w-b[x],k[y],b[y])==0) return false;}else {k[y]=-k[x];b[y]=e[i].w-b[x];if(dfs(y)==0) return false;}}return 1;
}
inline LL read()
{LL d=1,f=0;char c;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{freopen("diamond.in","r",stdin);freopen("diamond.out","w",stdout);n=read();m=read();for(register int i=1;i<=n;i++) p[i]=read(),sum+=p[i];for(register int i=1;i<=m;i++) u=read(),v=read(),w=read(),add(u,v,w),add(v,u,w);for(register int i=1;i<=n;i++) if(k[i]==0){L=sumk=sumb=0;R=p[i];k[i]=1;if(dfs(i)==false) return puts("NIE\n")&0;else{if(sumk<0) maxs+=L*sumk+sumb,mins+=R*sumk+sumb;else maxs+=R*sumk+sumb,mins+=L*sumk+sumb;}}printf("%lld %lld\n",sum-maxs,sum-mins);
}

YbtOj#20073. 「NOIP2020 模拟赛 B 组 Day6」钻石守卫相关推荐

  1. YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/105/problem/3 题目大意 nnn个点mmm条边的图,保证每条边两边的点权和大于等于边权.现在要去减去最少/ ...

  2. YbtOJ#20072-[NOIP2020模拟赛B组Day6]相似子串【根号分治】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/105/problem/2 题目大意 一个010101串,qqq个询问,每次询问有多少个长度为mmm的子串010101 ...

  3. #20071-[NOIP2020模拟赛B组Day6]礼物购买【二分】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/105/problem/1 题目大意 nnn个物品,每个价格为viv_ivi​有xix_ixi​个,mmm次,开始有w ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

  6. 2021-07-17【普及组】模拟赛C组

    文章目录 2021.07.17[普及组]模拟赛C组 写在前面: T1: 题目大意: 正解: T2: 题目大意: 正解: T3: 题目大意: 正解: T4: 题目大意: 正解: 2021.07.17[普 ...

  7. 第十二届蓝桥杯(2021年)模拟赛 Python组(第一期) 题目+个人解答

    填空题 填空题-1 [问题描述] 如東整数a是整数b的整数倍,则称b是a的约数. 请问,有多少个正整数是2020的约数. [答案提交] 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一 ...

  8. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  9. 2021-07-15 【普及组】模拟赛C组总结

    文章目录 [普及组]模拟赛C组 写在前面: T1: 题目大意: 正解: T2: 题目大意: 正解: T3: 题目大意: 正解: T4: 题目大意: 正解: [普及组]模拟赛C组 写在前面: 今天的考试 ...

最新文章

  1. 如何在CPU上优化GEMM(下)
  2. dataframe两个表合并_史上代码最少的工作表拆分,仅需5行,不可思议
  3. Shiro与Spring集成时,Shiro权限注解@RequiresRoles等不生效的解决方案
  4. postman安装_Postman插件的应用与实战(二)
  5. Linux C 指针练习
  6. .net开发中常用的第三方组件
  7. 从内存布局上看,Rust的胖指针到底胖在栈上还是堆上?
  8. Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority
  9. SP_Flash_Tool_For_win10
  10. 使用帧相似度匹配编写无缝循环视频截取工具
  11. linux 删除网桥接口,linux 网桥代码分析 三 网桥及网桥端口的添加与删除
  12. Protocol buffer配置-生成jar包和java文件
  13. python编写英文字典_python如何制作英文字典
  14. 淘宝商品详情API|获取宝贝SKU、主图、评价等API接口
  15. Frida在windows上的玩法
  16. 5个私域流量运营方法,教你实现流量变现
  17. 中国计算机技术职业资格网(软考)考试用书(大纲、教程、辅导用书)
  18. 禁用服务器网络协议怎么设置,如何在Windows操作系统中启用和禁用DHCP?
  19. 2019河南对口升学高考试卷计算机专业课,2019年河南省对口升学:考试和录取
  20. 容联云以IM+RTC,开启新一代实时互动新视界

热门文章

  1. Potree使用指南
  2. Spring框架——基于xml文件的相关配置
  3. 软件架构与设计(十)-----架构技术
  4. java坦克大战子弹不动_Javase-坦克大战小游戏,为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着...
  5. JDK安装配置-只需两步即可(附jdk安装包,win10系统)
  6. canvas效果案例:安卓机器人
  7. Maven远程仓库配置(阿里云)
  8. 30.一张图理解EOS是什么
  9. 求C语言+MySQL数据库项目
  10. Keep 移动健身专家