题目链接:https://vjudge.net/problem/CodeForces-1494E

题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种类型:

  1. +uvc+\ u\ v\ c+ u v c:增加一条 u−>vu->vu−>v 的有向边,边权为 ccc
  2. −uv-\ u\ v− u v:删除 u−>vu->vu−>v 的有向边
  3. ?k?\ k? k:检查是否存在着一条路径经过了 kkk 个点(可以重复),满足 a1−>a2−>...−>aka_1->a_2->...->a_ka1​−>a2​−>...−>ak​ 存在着一条路径且 ak−>ak−1−>...−>a2−>a1a_k->a_{k-1}->...->a_2->a_1ak​−>ak−1​−>...−>a2​−>a1​ 也存在着一条路径,且两条路径的边权组成的序列相同

题目保证每次操作都是合法的

题目分析:看到上面的条件需要分析环,因为题目中不会出现自环,所以最简单的环就是 u−>vu->vu−>v 且 v−>uv->uv−>u 这样的一个环了

假设存在着这样的一个环,那么对于每次操作三,当 kkk 为奇数的时候,一定可以从 uuu 或 vvv 出发然后回到自身,所以如果存在着环,无论边权,答案都是可以构造出来的

那么当 kkk 为偶数的情况,依然沿着环走的话,会变成以 uuu 为起点,且以 vvv 为终点的情况,也就是说正着的路径为 uvuv....vu\ v\ u\ v....\ vu v u v.... v,反着的路径为 vuvu...uv\ u\ v\ u\ ...\ uv u v u ... u,如果要想让这两条路径的序列相等的话,必须要满足 u−>vu->vu−>v 和 v−>uv->uv−>u 这两条路径的权值相等才行

这样一来只需要维护这样的环是否存在即可,代码实现起来也比较简单

代码:

// Problem: E. A-Z Graph
// Contest: Codeforces - Educational Codeforces Round 105 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1494/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
char s[N];
map<pair<int,int>,char>mp;
set<pair<int,int>>diff,equ;
void add_diff(int u,int v) {if(u>v) {swap(u,v);}diff.insert({u,v});
}
void add_equ(int u,int v) {if(u>v) {swap(u,v);}equ.insert({u,v});
}
void del_diff(int u,int v) {if(u>v) {swap(u,v);}diff.erase({u,v});
}
void del_equ(int u,int v) {if(u>v) {swap(u,v);}equ.erase({u,v});
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;read(n),read(m);while(m--) {string op;cin>>op;if(op=="+") {int u,v;read(u),read(v);scanf("%s",s+1);mp[{u,v}]=s[1];if(mp[{v,u}]!=0) {if(mp[{v,u}]==s[1]) {add_equ(u,v);} else {add_diff(u,v);}}} else if(op=="-") {int u,v;read(u),read(v);if(mp[{v,u}]!=0) {if(mp[{v,u}]==mp[{u,v}]) {del_equ(u,v);} else {del_diff(u,v);}}mp[{u,v}]=0;} else if(op=="?") {int k;read(k);if(k&1) {if(diff.size()||equ.size()) {puts("YES");} else {puts("NO");}} else {if(equ.size()) {puts("YES");} else {puts("NO");}}}}return 0;
}

CodeForces - 1494E A-Z Graph(构造+思维)相关推荐

  1. CodeForces - 1265D Beautiful Sequence(贪心+构造+思维)

    题目链接:点击查看 题目大意:给出a个0,b个1,c个2,d个3,要求构造一种序列,使得数列两两之间绝对值之差等于1,若不能构造输出NO 题目分析:首先我们需要稍微讨论一下特殊情况,那就是对于两端的数 ...

  2. CodeForces - 798D Mike and distribution(构造+思维/玄学随机数)

    题目链接:点击查看 题目大意:给出两个长度为n的数列,现在要求选出n/2+1个位置,使得两个序列中这些位置的和分别大于各自序列之和的一半 题目分析:题意换句话说,是需要让我们从数组中选出一半,要大于另 ...

  3. codeforces 148 C. Terse princess(思维,构造)

    C. Terse princess(思维,构造) 题目链接:codeforces 148C 题意:     有个公主找王子,如果这个人比之前所有王子的财富都高,公主就会Oh,              ...

  4. CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)

    题目链接:点击查看 题目大意:给出一个 n,再给出一个 x,要求构造一个数列,满足该数列的所有子串的异或和都不等于 0 且都不等于 x,在满足上面的条件下尽可能长 题目分析:因为这个题目最终的目标是需 ...

  5. CodeForces - 1090D Similar Arrays(构造+思维)

    题目链接:点击查看 题目大意:第一行给出两个数n和m,n代表有n个数,m代表有m组比较关系,接着给出m组关系pos_a和pos_b,代表在一个数组中,pos_a和pos_b存在一种比较关系 现在要求我 ...

  6. CodeForces - 765D Artsem and Saunders(数学化简+构造+思维)

    题目链接:点击查看 题目大意:给出一个序列f(x),要求我们构造出两个序列g(x)和h(x),满足: g(h(x))=x g(x)定义域[1,n],值域[1,m] h(g(x))=f(x) h(x)定 ...

  7. CodeForces - 715A Plus and Square Root(思维+构造)

    题目链接:点击查看 题目大意:我们在玩一个游戏,屏幕上有一个数字,我们设这个数字为x,初始值为2,我们一开始的等级是k,我们每一次可以有两种操作: 加法:可以让x加上k 开根号:可以让x开根号,并且等 ...

  8. 【CodeForces - 483C】Diverse Permutation(思维构造)

    题干: Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of ndistinct posit ...

  9. 【CodeForces - 340D】Bubble Sort Graph (思维,nlogn最长上升子序列类问题)

    题干: Iahub recently has learned Bubble Sort, an algorithm that is used to sort a permutation with n e ...

最新文章

  1. 详细说说Transformer (超详细图解,一图胜千言)
  2. 《Adobe InDesign CS5中文版经典教程》—第1课1.7节使用上下文菜单
  3. 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别
  4. ContentProvider学习笔记
  5. 1864: [Zjoi2006]三色二叉树
  6. VBS转化为exe可执行文件实例演示,vbs转exe工具推荐
  7. SpringMVC学习(一)——快速搭建SpringMVC开发环境(非注解方式)
  8. 什么是电视光端机?电视光端机是怎么分类的?
  9. cv2 imwrite中文路径_python3下使用cv2.imwrite存储带有中文路径图片的方法
  10. c++框架有哪些_平顶彩钢活动房特点以及用途有哪些?
  11. preg_match_all中的标记
  12. 鸿蒙os智能座舱,华为智能座舱的野心:HiCar上车,为鸿蒙OS铺路
  13. DPM2012学习(二),添加本地磁盘
  14. C++string类常用函数 c++中的string常用函数用法总结
  15. Meson构建系统(二)
  16. Word 2010如何对论文中参考文献进行标注
  17. python中sub函数用法_Python pandas.DataFrame.sub函数方法的使用
  18. 透析BAT人工智能生态图谱:AI大战一触即发
  19. 再次收到魅族公司赠送的一箱子礼物,感谢
  20. go语言复数包_Go语言圣经 2.3-复数

热门文章

  1. linux java top_Linux top和负载的解释(转载)
  2. 向量值函数在计算机工程与应用,拟Newton法在高阶矩阵中的应用-计算机工程与应用.PDF...
  3. IOC 容器中那些鲜为人知的细节
  4. Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器
  5. IO概述(概念分类)
  6. 数据库-数据库设计原则-范式概念
  7. 函数的参数-在函数内部针对参数赋值不会影响外部实参
  8. logback日志记录器讲解
  9. Hystrix Health Indicator及Metrics Stream支持
  10. 上海全球“编程一小时”活动记