[容斥] Topcoder SRM555DIV1. MapGuessing

42人阅读 评论(0) 收藏 举报
分类:

经典题了

枚举初始状态的磁头位置,求出哪些位置可以随意改动,然后大力容斥

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

typedef long long ll;

const int N=1010;

int n,tot,cg[40];

ll p[40],ans;

inline int count(ll S){
  int ret=0;
  for(int i=0;i<n;i++) if(S>>i&1) ret++;
  return ret;
}

void dfs(int x,ll S,int t){
  if(x>tot){
    if(t){
      if(t&1) ans+=1LL<<count(S);
      else ans-=1LL<<count(S);
    }
    return ;
  }
  if(!S) return ;
  dfs(x+1,S,t);
  dfs(x+1,S&p[x],t+1);
}

class MapGuessing{
public:
  ll countPatterns(string goal, vector<string> C){
    string code;
    for(int i=0;i<C.size();i++) code+=C[i];
    n=goal.size(); int m=code.size();
    for(int i=0;i<n;i++){
      int cur=i,f=0; ++tot; p[tot]=0;
      for(int j=0;j<n;j++) cg[j]=0;
      for(int j=0;j<m;j++){
    if(code[j]=='>') cur++;
    if(code[j]=='<') cur--;
    if(code[j]=='0') cg[cur]=1;
    if(code[j]=='1') cg[cur]=2;
    if(cur<0 || cur>=n){
      tot--; break; 
    }
    int flg=1;
    for(int k=0;k<n;k++)
      if(cg[k] && '0'+cg[k]-1!=goal[k]){
        flg=0; break;
      }
    if(flg){
      for(int k=0;k<n;k++)
        if(cg[k]) p[tot]|=1LL<<k; 
    }
      }
    }
    dfs(1,(1LL<<n)-1,0);
    return ans;
  }
}Main;

int main(){
  string a= "11100011010111111010100100110001101";
  vector<string> b= {"11111111111111111111",
 "1<><><><><><><><><>1",
 "1<>000>000><0<><0<>1",
 "1<0<><>0><0<00>00<>1",
 "1<>00<>000><0<0<0<>1",
 "1<><>0>0><0<0<><0<>1",
 "1<000<>0><0<0<><0<>1",
 "1<><><><><><><><><>1",
 "1<>000><000<>000><>1",
 "1<>0><><0<><>0><><>1",
 "1<>000><000<>000><>1",
 "1<><>0><><0<><>0><>1",
 "1<>000><000<>000><>1",
 "1<><><><><><><><><>1",
             "11111111111111111111"};
  cout<<Main.countPatterns(a,b);
  for(;;);
}
查看评论

srm555 div2

从金华回来,虽然创造了学校最好的排名,但是感觉下一场去成都仍然是有些没底,最近刷刷比赛玩玩…… A.简单题,枚举翻的行列,然后判断下最大的就行了。 class XorBoardDivTwo { ...
  • magicnumber
  • magicnumber
  • 2012年10月31日 20:48
  • 892

【组合数学】TopCoder SRM555 MuddyRoad2

非常精彩的一道组合数学题目,是作为division2的压轴题,包括了斐波那契数列、动态规划、组合数求解等多项知识。 题目在http://community.topcoder.com/stat?c=p...
  • lwfcgz
  • lwfcgz
  • 2012年11月04日 20:24
  • 613

【动态规划】 TopCoder SRM 555 CuttingBitString

大致意思就是把一个01串切分成一系列是5的幂次方的子串,题意叙述简洁,是一道很好的动态规划题目。 We are in a distant future. After the do...
  • lwfcgz
  • lwfcgz
  • 2012年10月15日 22:35
  • 1364

SRM 555

呜呜呜。。。。最近感觉头脑迟钝啊 255:给你一个01序列,问你最少能将其分成几段,使得每一段都不含前导0且都是5的幂次 一开始我是建了个最短路跑,后来发现两个循环其实就可以搞定了。类似于dp,从...
  • haha593572013
  • haha593572013
  • 2014年01月18日 23:45
  • 1019

Topcoder SRM554 Hard : TheBrickTower(矩阵快速幂)

传送门 John and Brus are building towers using toy bricks. They have an unlimited supply of bricks of...
  • qq_35649707
  • qq_35649707
  • 2017年11月16日 18:03
  • 94

Topcoder SRM 628 DIV 2

被自己蠢哭了。。。。 250-point problem 国际象棋棋盘上给出两个坐标,问象从一个走到另一个最少要几步。 黑格象只能走黑格,白格象只能走白格,只要判断两个坐标的颜色是否相同就能判断...
  • u012965890
  • u012965890
  • 2014年07月23日 19:36
  • 1449

Topcoder SRM551 Div 1 1000:SweetFruits(矩阵树+容斥)

题解: 考虑枚举哪几个水果是甜的。 发现如果枚举的数量一样,那么对答案的贡献也一样。那么可以根据枚举数量来一起处理。 枚举完数量kkk之后,甜与半甜的不连边,然后跑矩阵树,得到小等于kkk的甜...
  • qq_35649707
  • qq_35649707
  • 2018年02月27日 22:05
  • 47

容斥的原理及广义应用

容斥原理想起容斥原理,大家都不陌生。 相信很多地方都会举这样类似一个最简单的例子让大家理解容斥: 现在赛场上有n个人,都参加过WC、CTSC和APIO。 拿过至少一个比赛的金牌的有多少人? 我...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017年07月07日 16:30
  • 831

[容斥] Topcoder SRM555DIV1. MapGuessing

经典题了 枚举初始状态的磁头位置,求出哪些位置可以随意改动,然后大力容斥 #include &lt;cstdio&gt; #include &lt;iostream&a...
  • Coldef
  • Coldef
  • 2018年03月08日 07:53
  • 42

TopCoder SRM 667 Div1 Problem 250 - OrderOfOperations (状压dp)

RT
  • u014247806
  • u014247806
  • 2015年09月15日 12:37
  • 413
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 5256
    排名: 6493
    文章分类
    最新评论