SRM 590 DIV1
转载请注明出处,谢谢 viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents
水水更健康,最终回到1800+了。。。
DIV2 1000pt
显然每一列是独立的。分开考虑。
对于某一列。假设按单个字符U , D从下往上考虑的话。发现连续两个U的话。以下的U能够移动的位置受上面一个影响。
只是因此能够想到相邻的U , D互相限制位置,能够依次处理。相邻同样字符的话。 能够作为一个字符。
做法:把相邻的U合并,相邻的D合并。dp[i][j]表示前i个部分处理完。第i个部分最靠上的一个位置为j。
这种话,假设当前为U。那么向上移动的最远位置为下一个部分最靠下的D的位置。
假设当前为D。那么向下移动的最远位置便是上一个部分最靠上的U的位置。
这样就能够搞出每个部分的上下界,然后分别DP。
typedef long long LL;
const LL MOD = 1000000007;
const int N = 55;
LL dp[N][N];
void add (LL &a , LL b) {
a += b;
a = (a % MOD + MOD) % MOD;
}
LL mut (LL a , LL b) {
a = a * b % MOD;
a = (a + MOD) % MOD;
return a;
}
LL gao_up (vector<int>&v , int limit) {
int n = v.size();
LL c[N][N]; memset (c , 0 , sizeof(c));
c[n - 1][limit - 1] = 1;
for (int i = n - 2 ; i >= 0 ; i --) {
for (int j = limit ; j >= 0 ; j --) {
if (c[i + 1][j] == 0) continue;
for (int k = v[i] ; k < j ; k ++) {
add (c[i][k] , c[i + 1][j]);
}
}
}
LL ans = 0;
for (int i = 1 ; i <= limit ; i ++) {
add (ans , c[0][i]);
}
return ans;
}
LL gao_down (vector<int>&v , int down , int up) {
int n = v.size();
LL c[N][N]; memset (c , 0 , sizeof(c));
c[0][down] = 1;
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j <= up ; j ++) {
if (c[i][j] == 0) continue;
for (int k = j + 1 ; k <= v[i] ; k ++)
add (c[i + 1][k] , c[i][j]);
}
}
return c[n][up];
}
vector<vector<int> > v;
class FoxAndShogi {
public:
int differentOutcomes(vector <string> board) {
int row = board.size() , col = board[0].size();
LL ans = 1LL;
for (int c = 0 ; c < col ; c ++) {
memset (dp , 0 , sizeof(dp));
string s = "";
v.clear ();
for (int r = row - 1 ; r >= 0 ; r --)
s = s + board[r][c];
int first = -1;
for (int i = 0 , pre = -1 ; i < s.size() ; i ++) {
if (s[i] == '.') continue;
if (s[i] == 'D' && pre == 0) {
v[v.size() - 1].push_back (i + 1);
}
else if (s[i] == 'U' && pre == 1) {
v[v.size() - 1].push_back (i + 1);
}
else {
if (first == -1) {
if (s[i] == 'U') first = 0;
else first = 1;
}
vector<int>t;
t.push_back(i + 1);
v.push_back(t);
if ( s[i] == 'U') pre = 1;
else pre = 0;
}
}
dp[0][0] = 1;
for (int i = 0 ; i < v.size() ; i ++) {
for (int j = 0 ; j <= row ; j ++) {
if (dp[i][j] == 0) continue;
// up
if ((first == 0 && i % 2 == 0) || (first == 1 && i % 2 == 1)){
int now = v[i][v[i].size() - 1];
int limit = (i + 1) < v.size() ? v[i + 1][0] : (col + 1);
for (int k = now ; k < limit ; k ++) {
add (dp[i + 1][k] , mut (dp[i][j] , gao_up (v[i] , k + 1)));
}
}
//down
else {
int now = v[i][v[i].size() - 1];
for (int k = j + 1 ; k <= now ; k ++) {
add (dp[i + 1][k] , mut (dp[i][j] , gao_down (v[i] , j , k)));
}
}
}
}
LL tmp = 0;
for (int i = 0 ; i <= row ; i ++)
add (tmp , dp[v.size()][i]);
// cout << tmp << endl;
ans = mut (ans , tmp);
}
return ans;
}
};
DIV1 250PT
把L,R所有提取出来,先推断下是否一致。
然后 比較下位置
DIV1 500 PT
异或结果 小于等于LIMIT,先处理相等的情况,既异或结果每一位都和LIMIT相等,列方程组,求一下秩。
否则的话。必定存在某一位,LIMIT中为1。实际为0,并且高位和LIMIT一致,低位随意 。
所以枚举相隔的这个位置。相同是列方程组求解。
typedef long long LL;
int a[100][100];
int n , m ;
long long gauss(){ int i,j,row=1,col;
for (col=1;col<=m;++col){
for (i=row;i<=n;++i)
if (a[i][col])
break ;
if (i>n)
continue ;
if (i!=row){
for (j=col;j<=m;++j)
swap(a[row][j],a[i][j]);
swap(a[i][m + 1],a[row][m + 1]);
}
for (i=row+1;i<=n;++i)
if (a[i][col]){
for (j=col;j<=m;++j)
a[i][j]^=a[row][j];
a[i][m + 1]^=a[row][m + 1];
}
++row;
}
for (i=row;i<=n;++i)
if (a[i][m + 1])
return 0;
return 1ll<<(long long)(m-row+1);
}
class XorCards {
public:
long long numberOfWays(vector<long long> number, long long limit) {
LL ans = 0;
m = number.size();n = 61;
memset (a , 0 , sizeof(a));
for (int i = 0 ; i < 61 ; i ++) {
for (int j = 0 ; j < m ; j ++) {
if (number[j] & (1LL << i)) a[i + 1][j + 1] = 1;
}
a[i + 1][m + 1] = (limit & (1LL << i)) ? 1 : 0;
}
ans = gauss ();
for (int i = 0 ; i < 61 ; i ++) {
if (!(limit & (1LL << i))) continue;
memset (a , 0 , sizeof(a));
for (int j = i + 1 ; j < 61 ; j ++) {
for (int k = 0 ; k < m ; k ++) {
if (number[k] & (1LL << j)) a[j + 1][k + 1] = 1;
}
a[j + 1][m + 1] = (limit & (1LL << j)) ? 1 : 0;
}
for (int k = 0 ; k < m ; k ++) {
if (number[k] & (1LL << i)) a[i + 1][k + 1] = 1;
}
ans += gauss ();
}
return ans;
}
};
DIV1 1000PT
排序方式价格优势,然后 镶上每次迭代暴力,folyd寻求最短的价格后,值。。
。
SRM 590 DIV1的更多相关文章
- topcoder srm 590 div1 (max_flow_template)
problem1 link 对于每一个,找到其在目标串中的位置,判断能不能移动即可. problem2 link 如果最后的$limit$为$11=(1011)_{2}$,那么可以分别计算值为$(10 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- SRM 583 DIV1
A 裸最短路. class TravelOnMars { public: int minTimes(vector <int>, int, int); }; vector<int> ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- 状态压缩DP SRM 667 Div1 OrderOfOperations 250
Problem Statement Cat Noku has just finished writing his first computer program. Noku's compute ...
- 数学 SRM 690 Div1 WolfCardGame 300
Problem Statement Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...
- SRM 618 DIV1 500
非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A dp[n-1] A...A...A sgma(dp[j]*dp[ ...
随机推荐
- poj3259(spfa判负环)
题目连接:http://poj.org/problem?id=3259 题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时 ...
- Restlet+Fastjson 高速构建轻量级 Java RESTful Webservice
自己入门Java时做过一个小型RESTful Web Service的项目,这里总结一下. 服务的数据交换格式主要採用JSON,服务为REST风格.连接採用Http协议,数据库使用MySQL,OR M ...
- OPEN-E安装中注意的问题
安装OPEN-E的时候,OPEN-E需要单独安装到存储硬盘外的硬盘上,否则是没有办法使用安装了OPEN-E的硬盘上的空间的. OPEN-E免费许可证的容量问题 安装OPEN-E后申请的试用key只能试 ...
- 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务
原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...
- hdu 2051 Bitset (java)
问题: 之前做过类似题,但这次仍然不能解决相关问题. 字符串倒过来输:StringBuffer str=new StringBuffer(s); s=str.reverse().toString() ...
- Unity3D入门(二):碰撞检測
碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种 ...
- bat文件无法双击运行
问题: win7系统下新建txt文件,编辑脚本内容后,保存为test.bat.每次双击它,只会默认以txt格式打开它,而不是运行它. 解决: 1. 双击打开“我的电脑”,然后在“工具”下选择“文件夹选 ...
- 将鼠标移到文本弹出一些字幕CSS达到,不及格JS达到
使用css实施内容流行,否js代码,下面的代码,可直接使用复制, 需要背景图到下面的地址下载,谢谢! 住址:http://download.csdn.net/detail/zurich1979/722 ...
- 飘逸的python - 保持命名空间的整洁
API的设计是一个艺术活.往往需要其简单.易懂.整洁.不累赘. 很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的. 也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎 ...
- Intent有可能的使用(两)
Intent作为联系各Activity之间的纽带,其作用并不只只限于简单的数据传递. 通过其自带的属性.事实上能够方便的完毕非常多较为复杂的操作. 比如直接调用拨号功能.直接自己主动调用合适的程序打开 ...