TC SRM 655 DIV1 250,500pt

250:

给一个n*n的格子图,每个格子颜色为白色或者红色。假设刚开始都是白色,每次可以涂k*k的一块正方形格子区域,涂成红色或白色,后面涂的可以覆盖前面涂的。给你最终状态,问从初始状态涂任意次数,可不可以涂成最终状态。

挺不错的题,感觉比500有意思。刚开始想简单了,就从前往后枚举,碰到跟最终状态不同就涂。很显然错了。其实实质还是贪心,因为后涂的覆盖前面涂的,所以从最后开始考虑,每次选一块完整颜色相同的出来,涂成该颜色,然后以后该区域的颜色就不会变了,这样贪心的每次选一块可以涂的区域出来,直到没有了为止。最后判断是否涂成最终状态。

500:

实质就是多元线性方程组的解,取模的。还久没碰这种题了,刚开始就去找这方面的陈题来看,推了半天,发现不过不是这题0和9一样的话,只要看化简一下就完了,剩下就是10的XX次方了。但是这里0和9这两个数跟其他数不一样。然后我就往化简、高斯消元方向想了。其实最土的DP也想过,就是记录9^5个状态,扫一遍5000,枚举状态9,总复杂度9^6*5000,不靠谱。看别人代码后才发现,就是这最土的DP的方向,然后关键要看出每列状态最多32种,所以不用扫描5000,大概就是预处理下,32*9^6的级别吧。

时间: 2024-11-10 01:19:31

TC SRM 655 DIV1 250,500pt的相关文章

Topcoder SRM 655 DIV1 250 CountryGroupHard

题意:不同国家的人站在一起,同一个国家的人相邻站,给你一个数组,表示 这个位置属于的国家有几个人,0可以是任何数字,问你能不能确定这个数组(只有一个解) 解题思路:搜索 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "CountryGroupHard.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cst

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

SRM 622 div1 250

Problem Statement    In the Republic of Nlogonia there are N cities. For convenience, the cities are numbered 0 through N-1. For each two different cities i and j, there is a direct one-way road from i to j. You are given the lengths of those roads a

Topcoder SRM 648 Div1 250

Problem 给一个长度为N的"AB"字符串S,S只含有两种字符'A' 或 'B',设pair(i,j)(0=<i<j<N)表示一对 i,j 使得S[i]='A',S[j]='B'.现给定一个K,求字符串S,使得pair(i,j)的个数恰好为K.若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [2, 50] K: [0 , N*(N-1)/2 ] Solution 若K>(N/2

[TC SRM 697 div1 lev1] DivisibleSetDiv1

Tutorial:https://apps.topcoder.com/wiki/display/tc/SRM+697#DivisibleSetDiv1 Note:证明过程值得一看. 主要内容:寻找[x1,x2,...,xn]使得满足bi * xi >= S - xi,其中S = x1 + x2 + ... + xn.

状态压缩DP SRM 667 Div1 250

题意:给n个01串,设计一种顺序,使得每次新出现的1的个数^2和最小 分析:比赛时不知道是div1的题,以为暴力贪心可以过,结果被hack掉了.题解说没有充分的证明使用贪心是很有风险的,正解是用状态压缩DP,详细解释. 收获:爆零还能涨分,TC真奇怪. 代码: int dp[(1<<20)+10]; int a[55]; class OrderOfOperations { public: int minTime( vector <string> s ) { int n = s.si

TC SRM 397 2 250

BreakingTheCode Problem Statement You have been given a secret mission where you must break the enemy's code. You have already figured out that they encode messages using the following method. Each letter between 'a' and 'z', inclusive, is assigned a

TopCoder SRM 660 Div1 250

然而我只得了95,太弱.. 给一个 n 行 m 列的矩阵,矩阵元素为0-9,表示权值.现在给不超过10个集合{dx,dy},表示如果我选择了(i,j),则我就选择了集合里每个(i+dx , j+dy)点.现在要求你选择两个不同的点作为中心点(当然,它们拓展出来的点可能会重合),使得被选择的点(重复只能算一次)权值之和最大..觉得不理解的,看tc的描述吧. N,M 在100内,且都>=2,其他数据都在合法范围内. 这种题就乱搞.题目里数据范围小的变量往往是突破点,先说我的想法吧,一共有10000个

TC SRM 638 DIV1 600 NarrowPassage2

Problem Statement 在一个狭长的通道中有$n$只狼,每只狼的体积为$size_i$,如果相邻的两只狼体积不超过$m$,则可以交换位置,求可以有多少种排列. $n≤50,1≤m≤1,000,000,000$ Tutorial 每次选出区间中体积最大的狼,如果其他狼可以越过它,那么即可在整个区间里自由移动,而不能越过它的狼则被隔离到两个区间里,可以分治. 区间总共有$n$只狼,能自由移动的狼个数为$cnt$,那么最后结果等于$$solve(l)*solve(r)*A_{n}^{cnt