HDU 4665

来源:互联网 发布:ubuntu与linux的区别 编辑:程序博客网 时间:2024/04/30 03:14

HDU 4665

题意:给出一段数字,要求平均分成两组,相对位置不变,两组位置相同的数字要相等,求任意解。

虽然N有2000,但是相同的数字不超过4个,又因为所有数字都要用上,所以情况其实不算很多,DFS可以很好的解决,但是还是没能当场做出来,可惜。

#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <vector>#include <string>#include <map>#include <set>#include <sstream>#include <iostream>#include <algorithm>#include<cstdlib>#include<queue>using namespace std;#define N 2005#define L(x) x<<1#define R(x) x<<1|1#define M(x,y) (x + y)>>1#define MOD 1000000007#define MODD 1000000006#define inf 0x7fffffff#define llinf 0x7fffffffffffffff#define LL __int64int s[N];int ans[N];int visit[N];int next_[N + N];int flag;int t,n;void addpoint(int x,int th){    next_[th] = visit[x];    visit[x] = th;}void out(){    for(int i = 1;i <= n;i++)        printf("%d",ans[i]);    printf("\n");}void dfs(int l,int r,int num){/*    cout<<endl<<l<<' '<<r<<' '<<num<<endl;;    for(int i = 1;i <= n;i++)        cout<<ans[i]<<' ';    cout<<endl;*/    if(num == n)    {        flag = 1;        out();        return ;    }    if(flag || r <= 0)        return ;    if(ans[l] != -1)    {        dfs(l - 1,r,num);        return ;    }    int mark[4] = {-1,-1,-1,-1};    for(int i = l,j = 0;i != -1;i = next_[i],j++)        mark[j] = i;    if(r >= mark[1] && flag == 0)    {        ans[l] = 1;        ans[mark[1]] = 0;        dfs(l - 1,mark[1] - 1,num + 2);        ans[l] = -1;        ans[mark[1]] = -1;    }//    cout<<"     show    "<<mark[2]<<' '<<flag<<' '<<r<<endl;    if(mark[2] != -1 && flag == 0 && r >= mark[2])    {        ans[l] = 1;        ans[mark[2]] = 0;        dfs(l - 1,mark[2] - 1,num + 2);        ans[l] = -1;        ans[mark[2]] = -1;    }    return ;}int main(){    int i,j,k;    scanf("%d",&t);    while(t--)    {        memset(visit,-1,sizeof(visit));        memset(ans,-1,sizeof(ans));        scanf("%d",&n);        for(i = 1;i <= n;i++)        {            scanf("%d",&s[i]);            addpoint(s[i],i);        }        flag = 0;        dfs(n,n - 1,0);    }    return 0;}


原创粉丝点击