Luogu P3520 [POI2011]SMI-Garbage】的更多相关文章

题目 把要变边权的边拿出来找欧拉回路就行了.正确性显然,因为一条边经过两次相当于对欧拉回路度数的奇偶性没有影响. 然后把一个个小环输出即可,具体的我也不知道怎么输,题目没讲清楚,我按着题解的来的. #include<cstdio> #include<cctype> using namespace std; namespace IO { char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*…
[LOJ#2162][POI2011]Garbage(欧拉回路) 题面 LOJ 题解 首先有一个比较显然的结论,对于不需要修改颜色的边可以直接删掉,对于需要修改的边保留.说白点就是每条边要被访问的次数可以直接模二.证明的话就是如果一条边被经过了两次,证明其连通了两侧的两个块,那么把这两次删掉,可以把两侧各拆分成一个欧拉回路,不会影响答案. 于是剩下的边直接对于每一个连通块算欧拉回路. 然后对于强制定向之后的图直接\(dfs\)找到所有简单环就可以了. #include<iostream> #i…
题目链接 \(Click\) \(Here\) 线段树合并,没想到学起来意外的很简单,一般合并权值线段树. 建树方法和主席树一致,即动态开点.合并方法类似于\(FHQ\)的合并,就是把两棵树的信息整合到一个里面.暂时没写过定义域不同的线段树合并,具体方法也想象不出来,写到了再详细讲吧. 算法复杂度:均摊\(O(NlogN)\),实际空间时间复杂度都不够稳定,需要谨慎使用. #include <bits/stdc++.h> using namespace std; const int N = 2…
这道题暴力做法就是枚举每个起点,然后向后拓展到不能拓展 就像这样(红框是每个位置的取值范围,绿线是你取的值构成的折线) 应该可以发现,左端点往右移的过程中,右端点也只能不动或往右移,所以我们可以每次移动右端点,然后移动左端点直到合法 如果现在取出来了一个合法区间,加入下一个右端点,合法条件当且仅当当前区间右端所取的值不超过新加入的右端点的上界.所以我们可以在左端点右移的过程中,维护右边取值的变化(有点迷是不是) 我们可以开一个单调不降的单调队列维护区间内每个位置的取值到该位置的下界的大小,如果队…
BZOJ 2212 从下到上线段树合并. 考虑到每一个子树内部产生的贡献不可能通过换儿子消除,所以一次更换只要看看把哪个儿子放在左边产生的逆序对数少就可以了. 逆序对数可以在线段树合并的时候顺便算出来. 由于只有叶子结点有权值 + 二叉树的特性,大大方便了这道题的代码和细节处理. 注意点数总共要开到$2 * n$. 时间复杂度$O(nlogn)$. Code: #include <cstdio> #include <cstring> using namespace std; typ…
题目大意:给一张$n$个点$m$条边的无向图,每条边是黑色的或白色的,要求变成一个目标颜色.可以从任意一个点开始,走一个简单环,回到开始的点,所经过的边颜色翻转.可以走无数次.问是否有一个方案完成目标.有则输出任意方案. 题解:不用改变颜色的边不用管,因为可以通过走两个环使得这条边经过两次,而剩下的部分会拼成一个大环. 即要求是找互不相交的环,使得构成整张图 卡点:1.输出格式要求起点输出两次 2.找到环后不可以退出 C++ Code: #include <cstdio> #include &…
思路:整体二分 提交:4次 错因:树状数组开的$int$ 题解: 二分操作序列,将仅用$[l,md]$即可满足要求的国家递归到左半边,将仅用$[l,md]$不能满足要求的国家,把他们的要求去掉左半边的贡献,递归到右半边. 具体来说,开一个以空间站为下标的树状数组(把环展成链),区间加单点求和转化为差分和前缀和,依次加入$[l,md]$中的所有操作区间: 然后每个国家枚举自己的所有空间站,计算贡献,判断前$[l,md]$是否满足,来决定向左右递归的方向. #include<iostream> #…
[POI2011]Garbage 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2278 https://loj.ac/problem/2162 https://www.luogu.org/problemnew/show/P3520 思路 求欧拉回路 求不到就GG 不过好像复杂度不对,一直TLE luogu90TLE loj85TLE bzojwrong 不过本地只跑1e7,std跑2e7 代码 #include <iostream>…
如果两个环相交,那么相交的部分相当于没走. 因此一定存在一种方案,使得里面的环都不相交. 把不需要改变状态的边都去掉,剩下的图若存在奇点则无解. 否则,每找到一个环就将环上的边都删掉,时间复杂度$O(n+m)$. #include<cstdio> const int N=2000010,BUF=20000000; int n,_m,m,i,j,k,x,y,d[N],s[N],e[N][3],a[N],v[N],q[N],t; int cnt,now,tmp[N],ans[N],pos; cha…
首先研究环上性质,发现如果状态不变的边就不需要动了,每次改的环上边肯定都是起末状态不同的边且仅改一次,因为如果有一条边在多个环上,相当于没有改,无视这条边之后,这几个环显然可以并成一个大环.所以,我们只关注起末状态不同的边. 然后,这些边形成一张图.对于每个连通块,如果有解的话,应当是一堆边不相交的简单环通过点互相连接的.这样一张图等价于一个欧拉回路,所以只要判每个连通块是不是欧拉回路(偶数度)即可. 然后是求解,目标就是把每个连通块所有的简单环都拎出来.回顾上述欧拉回路判断,实际上正是因为若干…