题目链接

  https://www.luogu.com.cn/problem/P6185

题意

  应该不难懂,跳过

分析

  说实话第一眼看到这题的时候我有点懵,真不知道怎么做,不过一看数据,还好还好,暴力能拿一半分,于是我就真拿了一半分。。。。。

  但某大佬说暴力能拿60,但我拿一半就满意了   我不会啊

  考完后忍不住好奇这道题要怎么做,于是就看了看题解,发现题解也。。。有点难懂,主要是我看到一个字,图??这明明是个数的问题咋还和图扯上了关系,awsl,果然还是我太       

     仔细读了一下,明白了一些。先看操作一:如果有(a1,a2)(a2,a3)(a3,a1),那么其中任意一个数都能自己加减二,如a1,a1+1,a2+1,a2-1,a3-1,a3+1,a1+1这样就能让a1自己加减二,同理a1换成任何数都可以,这里要注意,必须是奇数个点并且形成环才能这样办,所以每个奇数环上的数都能加减二,偶数个点为什么不行自己举个例子就明白了。再看操作二:如果有(a1,a2)(a2,a3)那么可以知道(a1,a3),a1+1,a2-1,a2+1,a3-1由此,a1+1,a3-1,可见操作二是具有传递性的,如果把它们看做是一个联通块,那么这个联通块可以任意加1,减1,所以如果这个联通块需要加的值和需要减的值一样,那么就满足。于是我们只要把每个操作二都缩成点,每个操作一建边,然后开始判断每块联通块是不是满足题意。

判断方法为,如果未形成奇数环,则需要使联通块内相加的数与相减的数相等,因为只能加一减一,否则使需要变化的总数是偶数即可,注意自环也要判断,因为自环相当于(a1,a2,1)(a1,a2,2)即a1+1,a2+1,a2-1,a1+1,这样也能使任意数加减二,

然后还有就是对于没有边连入的点,只有需要变化的值为0,才满足,因为没有边可以使它产生变化。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=2e5+;
  6. long long val[N];
  7. struct Edge{
  8. int to,next;
  9. }e[N];
  10. struct Node{
  11. int t,u,v;
  12. }p[N];
  13. int Head[N],len,sum,flag;
  14. void Ins(int a,int b){
  15. e[++len].to=b;e[len].next=Head[a];Head[a]=len;
  16. }
  17. int f[N],belong[N],a[N],b[N];
  18. int find(int x){
  19. return f[x]==x?x:(f[x]=find(f[x]));
  20. }
  21. void Mer(int a,int b){
  22. int u=find(a),v=find(b);
  23. if(u!=v){
  24. f[u]=v;val[v]+=val[u];//并查集缩点
  25. }
  26. }
  27. void dfs(int x,int bin){
  28. belong[x]=bin;
  29. if(bin)sum+=val[x];
  30. else sum-=val[x];
  31. for(int i=Head[x];i;i=e[i].next){
  32. int v=e[i].to;
  33. if(belong[v]==-)dfs(v,bin^);//利用了^的性质
  34. else if(belong[x]==belong[v])//说明v已经被提前访问过并且bin的值与x一样,那么就一定形成了奇数环
  35. flag=;
  36. }
  37. }
  38. int main(){
  39. // freopen("a.txt","r",stdin);
  40. int t;
  41. scanf("%d",&t);
  42. while(t--){
  43. int m,n,ans=;len=;
  44. scanf("%d%d",&n,&m);
  45. for(int i=;i<=n;i++)
  46. scanf("%d",&a[i]);
  47. for(int i=;i<=n;i++)
  48. scanf("%d",&b[i]),val[i]=b[i]-a[i];
  49. for(int i=;i<=n;i++)
  50. f[i]=i,belong[i]=-,Head[i]=;
  51. for(int i=;i<=m;i++){
  52. scanf("%d%d%d",&p[i].t,&p[i].u,&p[i].v);
  53. if(p[i].t==){
  54. Mer(p[i].u,p[i].v);//合并操作二
  55. }
  56. }
  57. for(int i=;i<=m;i++){
  58. if(p[i].t==){
  59. Ins(find(p[i].u),find(p[i].v));//这里已经缩点所以要合并根
  60. Ins(find(p[i].v),find(p[i].u));
  61. }
  62. }
  63. for(int i=;i<=n;i++){
  64. if(find(i)==i&&belong[i]==-){
  65. flag=sum=;
  66. dfs(i,);
  67. for(int x=Head[i];x;x=e[x].next){
  68. if(e[x].to==i)flag=;//自环
  69. }
  70. if(Head[i]==&&sum!=)ans=;//没有边连入
  71. else if(flag==&&sum%!=)ans=;//奇数环
  72. else if(flag==&&sum!=)ans=;//偶数环
  73. }
  74. }
  75. if(ans)printf("YES\n");
  76. else printf("NO\n");
  77. }
  78. }

NOI ONLINE 提高组 序列 根据性质建图的更多相关文章

  1. NOI Online 提高组 题解

    来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...

  2. luogu P6570 [NOI Online #3 提高组]优秀子序列 二进制 dp

    LINK:P6570 [NOI Online #3 提高组]优秀子序列 Online 2的T3 容易很多 不过出于某种原因(时间不太够 浪了 导致我连暴力的正解都没写. 容易想到 f[i][j]表示前 ...

  3. [NOI Online 2021 提高组] 积木小赛

    思路不说了. 想起来自己打比赛的时候,没睡好.随便写了个\(HASH\),模数开小一半分都没有. 然后学了\(SAM\),发现这个判重不就是个水题. \(SAM\)是字串tire的集合体. 随便\(d ...

  4. NOIP2018初赛总结(提高组)(试题+答案+简要解析)

    NOIP2018初赛总结(提高组) 更新完毕(纯手敲),如果有错误请在下面留言 单选题 T1.下列四个不同进制的数中,与其它三项数值上不相等的是 A.\((269)_{16}\) B.\((617)_ ...

  5. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  6. NOIP提高组题目归类+题解摘要(2008-2017)

    因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...

  7. 2017清北学堂(提高组精英班)集训笔记——动态规划Part3

    现在是晚上十二点半,好累(无奈脸),接着给各位——也是给自己,更新笔记吧~ 序列型状态划分: 经典例题:乘积最大(Luogu 1018) * 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它 ...

  8. NOIP2018提高组省一冲奖班模测训练(四)

    NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...

  9. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...

随机推荐

  1. 安卓权威编程指南 挑战练习 13.8 用于RecyclerView的空视图

    当前,CriminalIntent应用启动后,会显示一个空白列表.从用户体验上来讲,即使crime列表 是空的,也应展示提示或解释类信息. 请设置空视图展示类似“没有crime记录可以显示”的信息.再 ...

  2. C++扬帆远航——5(换分币)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:huanfenbi.cpp * 作者:常轩 * 完成日期:201 ...

  3. LeetCode【面试题 16.17. 连续数列】

    ------------恢复内容开始------------ 题目描述 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5 ...

  4. this软拷贝详解

    <script> if( !Function.prototype.softBind ){ Function.prototype.softBind = function( obj ){ va ...

  5. 【Amaple教程】6. 路由配置

    在 第1节<启动路由> 章节中为了能让单页应用顺利跑起来,我们提前介绍了简单的路由配置方法.我们已了解路由配置的目的是指定不同的url下对应的 模块节点(也叫做模块容器)内应该显示哪个模块 ...

  6. 没想到MySQL还会问这些...

    前言 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在前一阵子,大哥问过我:"你知道MySQL的原子性是怎么保 ...

  7. .Net Core WebApi在Linux上启动和关闭

    测试机器:阿里云云主机1核2g 安装环境:centos-7 服务器:Nginx 1.17.1 测试默认已启动 已安装配置:.Net Core 3.1 测试默认安装 连接配置:x-ftp,x-shell ...

  8. Ubuntu系统下环境安装遇到依赖冲突问题

    问题场景:在ubuntu系统下使用docker拉了一个python3.6的镜像,要在该容器中安装vim结果总是报已安装某些依赖的版本不满足要求 解决方法: 1.安装aptitude apt-get i ...

  9. 论nw.js的坑~~~感觉我所有的前端能遇到的坑都踩了一遍

    先总结:nw.js 真特么的...难用...文档,我得先百度才能看的稍微明白点文档......!!!!!!我感觉我所有的前端能遇到的坑都踩了一遍,此文针对前后端分离项目,别的先不说 一.不需要在项目里 ...

  10. 爬取疫情数据,以django+pyecharts实现数据可视化web网页

    在家呆着也是呆着,不如做点什么消磨时间呗~ 试试用django+pyecharts实现疫情数据可视化web页面 这里要爬疫情数据 来自丁香园.搜狗及百度的疫情实时动态展示页 先看看劳动成果: 导航栏: ...