Topcoder SRM 653 Div1 250

2015-07-20 17:10:05 · 作者: · 浏览: 4

Problem

N 个人坐成一排,属于同一个公司的人都坐在一起(挨在一起),但不知道谁属于哪个公司。现在问其中的某些人 他属于哪个公司,他的回答是 Ai Ai=0 表示此人未被询问,否则表示他的回答。题目保证一定存在一种分组方案使得属于同一公司的人都坐在一起。现问方案是否唯一?

Limits

TimeLimit(ms):2000

MemoryLimit(MB):256

N,Ai∈[1,100]

Solution

dp[i] 表示从 i 位置开始往后分组的情况,dp[i]=0表示无法分组,dp[i]=1表示可以分组且唯一,dp[i]=2表示可以分组且不唯一。显然, i: N?1?>0 j:i+1?>N?1 ,此时分 A[i]=0 A[i]≠0 来dp。具体怎么dp太麻烦,不讲了。

Complexity

TimeComplexity:O(N2)

MemoryComplexity:O(N)

My Code

//Hello. I'm Peter.
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         using namespace std; #define gsize(a) (int)a.size() #define clr(a) memset(a,0,sizeof(a)) #define rep(i, a, b) for (int i = a; i < b; i++) #define dep(i, a, b) for (int i = a; i > b; i--) #define repin(i, a, b) for (int i = a; i <= b; i++) #define depin(i, a, b) for (int i = a; i >= b; i--) #define N 101 int dp[N]; class CountryGroupHard{ public: string solve(vector 
        
          a){ int len=gsize(a); clr(dp); depin(i,len-1,0){ if(!a[i]){ int p=-1; rep(j,i+1,len){ if(j==i+1) dp[i]=dp[j]; else if(dp[j]) dp[i]=2; if(a[j]) p=j; if(a[j]) break; } if(p==-1&&i==len-1) dp[i]=1; else if(p==-1) dp[i]=2; else if(a[p]>=p-i+1){ if(i+a[p]>len) continue; bool ok=true; rep(k,i,i+a[p]){ if(a[k]&&a[k]!=a[p]) ok=false; } if(!ok) continue; if(i+a[p]==len) dp[i]=1; else if(i+a[p]
         
          0 if(i+a[i]>len) continue; bool ok=true; rep(k,i,i+a[i]){ if(a[k]&&a[k]!=a[i]) ok=false; } if(!ok) continue; if(i+a[i]==len) dp[i]=1; else if(i+a[i]