poj-openjudge 1039:Keine's Problem 解题报告

题目

2013北大校赛总结

题意:

有一个记录表,记录学生进或者出教室。但是现在表上的名字看不清了,只知道某两条记录是有联系的,这两条记录属于同一个学生(下面称为特殊学生),前者为进后者为出,且其间没有其它记录属于这个学生,问原表有多少种可能。

解法:

可以维护一个lef和inside,分别表示教室外的所有学生数量和教室内不是特殊学生的人数。进来时方案*lef,如果是不是特殊学生则++inside。出去时++lef,如果不是特殊学生则方案*inside,并--inside。

Time:10ms
Memory:520kB
Length:1196 B

#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <algorithm>
#define EPS 1e-3
#define MAXN 100010
#define INF 1000000007
#define MOD 1000000007
using namespace std;
char str[MAXN];
bool vi[MAXN];
int main()
{
    //freopen("C:\\Documents and Settings\\k99\\My Documents\\input.txt","r",stdin);
    int n,m,k,t,lef;
    long long sum=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        scanf("%s",str);
        memset(vi,0,sizeof(vi));
        lef=0;
        for(int i=0;i<m;++i)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            vi[a-1]=1,vi[b-1]=1;
        }
        sum=1;
        for(int i=0;i<n;++i)
        {
            if(str[i]=='I')
            {
                sum=sum*k%MOD;
                if(!vi[i])
                    ++lef;
                --k;
            }
            else
            {
                if(!vi[i])
                {
                    sum=sum*lef%MOD;
                    --lef;
                }
                ++k;
            }
        }
        cout<<sum%MOD<<'\n';
    }
    return 0;
}


你可能感兴趣的:(poj-openjudge 1039:Keine's Problem 解题报告)