NOI ONLINE 提高组 序列 根据性质建图
题目链接
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,才满足,因为没有边可以使它产生变化。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
long long val[N];
struct Edge{
int to,next;
}e[N];
struct Node{
int t,u,v;
}p[N];
int Head[N],len,sum,flag;
void Ins(int a,int b){
e[++len].to=b;e[len].next=Head[a];Head[a]=len;
}
int f[N],belong[N],a[N],b[N];
int find(int x){
return f[x]==x?x:(f[x]=find(f[x]));
}
void Mer(int a,int b){
int u=find(a),v=find(b);
if(u!=v){
f[u]=v;val[v]+=val[u];//并查集缩点
}
}
void dfs(int x,int bin){
belong[x]=bin;
if(bin)sum+=val[x];
else sum-=val[x];
for(int i=Head[x];i;i=e[i].next){
int v=e[i].to;
if(belong[v]==-)dfs(v,bin^);//利用了^的性质
else if(belong[x]==belong[v])//说明v已经被提前访问过并且bin的值与x一样,那么就一定形成了奇数环
flag=;
}
}
int main(){
// freopen("a.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
int m,n,ans=;len=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
scanf("%d",&b[i]),val[i]=b[i]-a[i];
for(int i=;i<=n;i++)
f[i]=i,belong[i]=-,Head[i]=;
for(int i=;i<=m;i++){
scanf("%d%d%d",&p[i].t,&p[i].u,&p[i].v);
if(p[i].t==){
Mer(p[i].u,p[i].v);//合并操作二
}
}
for(int i=;i<=m;i++){
if(p[i].t==){
Ins(find(p[i].u),find(p[i].v));//这里已经缩点所以要合并根
Ins(find(p[i].v),find(p[i].u));
}
}
for(int i=;i<=n;i++){
if(find(i)==i&&belong[i]==-){
flag=sum=;
dfs(i,);
for(int x=Head[i];x;x=e[x].next){
if(e[x].to==i)flag=;//自环
}
if(Head[i]==&&sum!=)ans=;//没有边连入
else if(flag==&&sum%!=)ans=;//奇数环
else if(flag==&&sum!=)ans=;//偶数环
}
}
if(ans)printf("YES\n");
else printf("NO\n");
}
}
NOI ONLINE 提高组 序列 根据性质建图的更多相关文章
- NOI Online 提高组 题解
来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...
- luogu P6570 [NOI Online #3 提高组]优秀子序列 二进制 dp
LINK:P6570 [NOI Online #3 提高组]优秀子序列 Online 2的T3 容易很多 不过出于某种原因(时间不太够 浪了 导致我连暴力的正解都没写. 容易想到 f[i][j]表示前 ...
- [NOI Online 2021 提高组] 积木小赛
思路不说了. 想起来自己打比赛的时候,没睡好.随便写了个\(HASH\),模数开小一半分都没有. 然后学了\(SAM\),发现这个判重不就是个水题. \(SAM\)是字串tire的集合体. 随便\(d ...
- NOIP2018初赛总结(提高组)(试题+答案+简要解析)
NOIP2018初赛总结(提高组) 更新完毕(纯手敲),如果有错误请在下面留言 单选题 T1.下列四个不同进制的数中,与其它三项数值上不相等的是 A.\((269)_{16}\) B.\((617)_ ...
- noip2017爆炸记——题解&总结&反省(普及组+提高组)
相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...
- NOIP提高组题目归类+题解摘要(2008-2017)
因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...
- 2017清北学堂(提高组精英班)集训笔记——动态规划Part3
现在是晚上十二点半,好累(无奈脸),接着给各位——也是给自己,更新笔记吧~ 序列型状态划分: 经典例题:乘积最大(Luogu 1018) * 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它 ...
- NOIP2018提高组省一冲奖班模测训练(四)
NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
随机推荐
- LeetCode~1033.移动石子直到连续
1033.移动石子直到连续 三枚石子放置在数轴上,位置分别为 a,b,c. 每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z.从位置 x 或者是位置 z ...
- 【最简单的vim教程】vim学习笔记-基础操作
说明 C-字母 = Ctrl + 字母 char = 任意字符 开始编辑 insert 按键 功能 说明 i(I) insert 当前位置插入(当前行前) a(A) append 当前字符后面插入(当 ...
- golang 统计系统测试覆盖率
golang 统计系统测试覆盖率 参考资料 https://www.elastic.co/blog/code-coverage-for-your-golang-system-tests https:/ ...
- plsql-工具安装部署及使用配置
参考文档链接:https://blog.csdn.net/li66934791/article/details/83856225 简介: PL/SQL Developer是一个集成开发环境,专门开发面 ...
- CVE-2019-0708 远程桌面漏洞复现
漏洞影响Windows版本: Windows XP SP3 x86Windows XP Professional x64 Edition SP2Windows XP Embedded SP3 x86W ...
- 小白学 Python 数据分析(11):Pandas (十)数据分组
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- CMSampleBufferRef解析
CMTime:64位的value,32位的scale, media的时间格式 CMVideoFormatDesc:video的格式,包括宽高.颜色空间.编码格式.SPS.PPS CVPixelBuff ...
- Mybatis-Plus代码生成器使用详解
首先创建springboot的项目(创建步骤省略) 创建好项目后要配置maven依赖,附上pom.xml: <?xml version="1.0" encoding=&quo ...
- 数据挖掘入门系列教程(二)之分类问题OneR算法
数据挖掘入门系列教程(二)之分类问题OneR算法 数据挖掘入门系列博客:https://www.cnblogs.com/xiaohuiduan/category/1661541.html 项目地址:G ...
- springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
springboot连接redis报错 超时连接不上 可以从以下方面排查 1查看自己的配置文件信息,把超时时间不要设置0毫秒 设置5000毫秒 2redis服务长时间不连接就会休眠,也会连接不上 重 ...