CF 631B 题解】的更多相关文章

题面 注意到每次只染色一行或者一列,那么我们最后输出第i行第j列的数字是多少的时候只需要看一下最后一次i行和第j行被染了什么颜色,所以我们需要对每一行和一列记录最后一次染色的颜色. 但是我们也需要比较是行比列后染色还是列比行后染色,所以我们还需要记录一下每行每列染色的最后时间. 然后模拟即可 #include <cstdio> #include <iostream> using namespace std; ],y[],z[]; ],cnt1,row[],cnt2; ],bo2[]…
C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情况 代码 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <ctime> #i…
\(0x01~~Preface\) \(emmm\)这次CF本身打的很顺畅,但是居然unrated了--咕咕咕咕 这是头一次CF有比赛我全部题目都做了--可喜可贺可喜可贺233 简单总结一下前面四道题\(\color{red}{Link}\): A题:sb题,\(O(n^2)\)枚举的红题(或许都不到),但是我\(check\)的时候太粗心WA了一次身败名裂XD B题:sb题,一个模拟,需要一个可以处理优先级的数据结构(其实就是堆但是我一开始想的是线段树) C题:sb题,一个贪心(其实是数学上可…
状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]... 于是如果我们求出了g,就可以求出ans 可是怎么求出g呢 我们记f[i]表示a&i==i这样的a的个数,那么如果i某一位上为1,则a这一位上也为1 于是我们可以枚举所有可能的结果(0-10^6),然后观察这个结果是否是某一个可能结果的子集,如果是的话就累计个数 详细说一下,就是我首先读入所有数…
虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Educational Round打的还可以,虽然吧没有涨分(因为我是紫色的啊). 做了前4题,后面3题也比较简单,陆续也做完了. 所以心情好,来写一篇题解! [A]花园 题意: 长度为\(k\)的线段,用若干个长度为\(a_i\)的线段,正好覆盖.(\(a_i|k\)) 给定\(n\)个\(a_i\),求出最小的\…
CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #include<set> #include<map> using namespace std; #define M…
才知道knight念奈特,而不念科耐特 这个题显然是一个数据结构题目,我搬运的CF上的题 CF的题解好长超长哒,而且可以在线,但是并不能看懂 于是自己想了一个一种做法A掉了,唯一的缺陷就是做法有些繁琐 首先我们把所有操作离线,之后给节点打上时间标记,从来没有被暴揍过的城市时间为m+1 之后我们考虑对于一个查询,什么样子的城市国王不会休息 显然这个城市的时间标记>=val,但是这样还不够,如果这个城市的时间标记大于当前时刻i,证明在当前查询的时候它并没有被暴揍 所以一个城市国王不会休息的充要条件是…
题目链接:http://codeforces.com/problemset/problem/676/B 题意:一个n层的平面酒杯金字塔,如图,每个杯子的容量相同.现在往最顶部的一个杯子倒 t 杯酒,求流动结束后有多少个杯子被装满. 思路:每个局部的两代三个杯子的流动过程是一致的,因此可以用递归来模拟求解. 具体为:设add(cur, i, l)执行“往第 i 个杯子倒cur量的酒”,附加信息: i 位于第 l 层.若执行完剩余了surplus量的酒,则往 i 的下一层左右两侧的杯子各倒surpl…
解法 又是一道结论题? 我的做法比较奇怪且没有证明 #include <cstdio> #include <cmath> #define ll long long int main(){ ll ans = 0; ll n, bs = 1; scanf("%I64d", &n); while (n > 1){ ans += (n >> 1) * bs; n -= (n >> 1); bs <<= 1; } prin…
题意 序列s有n个数,每个数都是不同的,把它每个数分成两个数,组成两个序列a和b,使ab序列各自去掉个数后各自的其它数字都不同. 如果存在一个划分,就输出YES,并且输出两个序列,否则输出NO. 分析 两个月前做的一题,那时候问学长才会做的,现在刚看到题又懵逼了.再做过了一遍. 序列s的每个数都是不同的,我们先给s按递增排序,然后构造:k=   前个数 第二个个数  剩下≤个数 s s[i] s[i+k] s[i+2*k] a s[i] 0   b 0 s[i+k] 0 1 2 ...  ..2…