UOJ Round 19 题解

虽然打得的确一般般,但是不知道为什么有心情来写(

开场……这 T3 怎么这么眼熟?然而数据范围这么大……

写了再说,反正跑不满,说不定卡进去了(

然而不行,5e5 的大样例跑了 0.5s+……

卡了一会感觉布星,溜了。

开始找 T1 的一堆性质,感觉找到了。

然后要找很多极小环,但是不会。

码了个 T2 的暴力就去搞 T1 的极小环了,以为能有 70,最后连那个说大不大的样例都过不去,一画图发现假了。

这时只剩下 10min,改成 20 分暴力走人了。

丢人 20+20+85=125,rk22,居然还能 +78,我也是服。

而且是因为少了一题的区分度,要是 T3 不是原题我就死绝了(


T1

考场思路:

对于 1 操作,如果有两次操作的环有共用边,那么可以等价于一些没有公共边的环。最后肯定可以变成两两没有公共边的一些环。

对于 2 操作,把白点看成 0,黑点看成 1,就是每条边的权值异或上两个端点的权值。所以多次 2 操作可以等价于一次。

也就是说,只要有解(不考虑步数),就一定存在 \(\le\lfloor\frac{m}{3}\rfloor+1\) 步的解。

判断有解,注意到 2 操作中每个点独立,所以可以对于每个点,相邻的边集拿出来。

然后再找出所有极小环。任意的操作都可以等价于某些极小环。

然后高斯消元/线性基就行了。

然而一开始想假了,以为极小环两两没有共用边,然后暴毙了。

70 分做法:

别找极小环了。

随便拎个生成森林,然后每条非树边与树上那条路径的环。

容易发现每个简单环都能等价于某些这种环。(对我没听说过,我孤陋寡闻了 /cy)

那么 \(m\) 个元,bitset 优化即可 \(O(\frac{Tm^3}{w})\)。

满分做法:

考虑只用 1 操作能完成哪些图。

发现就是只考虑 1 边,每个点的度数都是偶数就可以。就是等价于一些简单环在度数大于 2 的地方拼起来(太棒了,学到许多)

那么记录下每个点度数的奇偶性。可以让度数奇偶性变化的,只剩操作 2 了。

操作 2 只有 \(n\) 个方程,元也是 \(n\) 个,复杂度是 \(O(\frac{Tn^3}{w})\)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=555;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
	char ch=getchar();ll x=0,f=0;
	while(ch<‘0‘ || ch>‘9‘) f|=ch==‘-‘,ch=getchar();
	while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
	return f?-x:x;
}
int T,n,m;
bitset<maxn> B,b[maxn],lb[maxn];
void insert(bitset<maxn> b){
	ROF(i,n,1) if(b[i]){
		if(lb[i]==0){
			lb[i]=b;
			break;
		}
		b^=lb[i];
	}
}
bool check(bitset<maxn> b){
	ROF(i,n,1) if(b[i]) b^=lb[i];
	return b==0;
}
int main(){
	T=read();
	while(T--){
		n=read();m=read();
		B=0;
		FOR(i,1,n) b[i]=lb[i]=0;
		while(m--){
			int u=read(),v=read(),w=read();
			b[u][v]=b[v][u]=1;
			if(w) B[u]=B[u]^1,B[v]=B[v]^1;
		}
		FOR(i,1,n){
			if(b[i].count()&1) b[i][i]=1;
			insert(b[i]);
		}
		puts(check(B)?"yes":"no");
	}
}

T2(未完成)

考场思路:

什么想法都没有,写了个大暴力。

T3(未完成)

考场思路:

跟这个一样。

原文地址:https://www.cnblogs.com/1000Suns/p/12636428.html

时间: 2024-10-28 00:34:21

UOJ Round 19 题解的相关文章

“玲珑杯”ACM比赛 Round #19题解&amp;源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】

A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT 5 20 1314 SAMPLE OUTPUT 5 21 1317 SOLUTION “玲珑杯”ACM比赛 Round #19 题目链接:http://www.ifrog.cc/acm/problem/1145 分析: 这个题解是官方写法,官方代码如下: 1 #include <iostream>

【UOJ Round #1】

枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受…… 其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $ 也就是先将a[i]全部加起来,然后再

【UOJ Round #8】

A 一道不错的题,虽然大家都觉得是水题,然而蒟蒻我想出来的好慢……Orz alpq 发现其实就是一个网格图,每一个大块都是同一颜色……横纵坐标互不干扰…… 1 //UOJ Round #8 A 2 #include<vector> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8

“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)

“玲珑杯”ACM比赛 Round #19 Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-07-29 16:42:55 Private B -- Buildings Time Limit:2s Memory Limit:128MByte Submissions:590Solved:151 DESCRIPTION There are nn buildings lined up, and th

HDU-5108-Alexandra and Prime Numbers (BestCoder Round #19)

Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 319    Accepted Submission(s): 120 Problem Description Alexandra has a little brother. He is new to programming. One

玲珑杯 Round 19 B Buildings (RMQ + 二分)

DESCRIPTION There are nn buildings lined up, and the height of the ii-th house is hihi. An inteval [l,r][l,r](l≤r)(l≤r) is harmonious if and only if max(hl,-,hr)?min(hl,-,hr)≤kmax(hl,-,hr)?min(hl,-,hr)≤k. Now you need to calculate the number of harmo

codeforces Beta Round #19 D. Point (线段树 + set)

题目大意: 对平面上的点进行操作. add x y 在 (x,y )上加一个点. remove x y 移除 (x,y)上的点. find x y 求出在(x,y)右上角离他最近的点,优先级是靠左,靠下. 思路分析: find 操作 比较麻烦. 要保证x大的同时还要确保x最小,而且该x上还要有点. 这样要找大的时候要小的,就是在线段树上选择性的进入左子树还是右子树. 所以核心就是,用set维护叶子节点. 然后查找的时候去叶子节点找,如果这个叶子节点有蛮子的 x y  就输出,否则回溯去另外一个子

Codeforces Round #541 题解

codeforces Round #541 C 题意 给你100个人,让你将它们围成一个圆,使得:"任意相邻的两人身高差的绝对值" 中的最大值 最小 题解 显然的构造方法:先排序,让所有人1 2 报数,报2的出列,排尾变排头接到报 1 的原队列后面 证明: 显然这样的构造方法保证身高差最大为 max{(a[i+2]-a[i]) }(i=1..n,环状,a[i]升序): 我们可以说明对于任意的i,身高差至少为(a[i+2]-a[i]), 如果我们将每个人看成一个点,相邻关系看成一条无向边

CFEducational Codeforces Round 66题解报告

CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第\(k\)小的值 那么问题就变成了 每一个数变成了\([x-mid,x+mid]\)的一段区间,如果有一个位置被覆盖了超过\(k\)次 那么\(mid\)一定合法 类似括号匹配 每次碰到左端点就贡献+1 右端点就统计答案然后-1 维护答案的同时顺便维护位置就好了 #include<cstdio>