p1468 Party Lamps

就是模拟。同一个开关按2下相当于没按,那么,如果一共按0下,就是没按,按1下就是4个开关的1个,按2下可能相当于实际按了0下或按2下,按3下实际按了1下或3下,之后如果是奇数,相当于按1或3下,偶数相当于按0,2,4下。再看一下是否符合。数据太小根本不会超时。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-8;
typedef long long lon;
const lon SZ=30,INF=0x7FFFFFFF;

int getdgt(int x)
{
    int res=0;
    for(;x;)
    {
        if(x&1)++res;
        x/=2;
    }
    return res;
}

void func(int x,bitset<1010> &y)
{
    if(x&1)y.flip();
    if(x&2)
    {
        for(int i=1;i<=1000;i+=2)y[i]=!y[i];
    }
    if(x&4)
    {
        for(int i=2;i<=1000;i+=2)y[i]=!y[i];
    }
    if(x&8)
    {
        for(int i=1;i<=1000;i+=3)y[i]=!y[i];
    }
}

bool chk(bitset<1010> bt,vector<int> &x,int sta)
{
    for(int i=0;i<x.size();++i)
    {
        if(bt[x[i]]!=sta)return 0;
    }
    return 1;
}

void work(int n,set<int> time,vector<int> lg,vector<int> dk)
{
    bool ok=0;
    vector<string> vct; 
    for(int i=0;i<(1<<4);++i)
    {
        if(time.find(getdgt(i))!=time.end())
        {
            bitset<1010> bt;
            bt.set();
            func(i,bt);
            if(chk(bt,lg,1)&&chk(bt,dk,0))
            {
                ok=1;
                string tmp="";
                for(int j=1;j<=n;++j)
                {
                    tmp+=bt[j]+'0';
                }
                vct.push_back(tmp);
            }
        }
    }
    sort(vct.begin(),vct.end());
    if(ok==0)cout<<"IMPOSSIBLE"<<endl;
    else
    {
        for(int i=0;i<vct.size();++i)
        {
            cout<<vct[i]<<endl;
        }
    }
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //for(lon time=1;time<=casenum;++time)
    {
        int n,cnt;
        cin>>n>>cnt;
        vector<int> lg,dk;
        for(;;)
        {
            int tmp;
            cin>>tmp;
            if(tmp==-1)break;
            else lg.push_back(tmp);
        }
        for(;;)
        {
            int tmp;
            cin>>tmp;
            if(tmp==-1)break;
            else dk.push_back(tmp);
        }
        //sort(lg.begin(),lg.end());
        //sort(dk.begin(),dk.end());
        set<int> st;
        if(cnt==0)
        {
            st.insert(0);
            work(n,st,lg,dk);
        }
        else if(cnt==1)
        {
            st.insert(1);
            work(n,st,lg,dk);
        }
        else if(cnt==2)
        {
            st.insert(0);
            st.insert(2);
            work(n,st,lg,dk);
        }
        else if(cnt&1)
        {
            st.insert(1);
            st.insert(3);
            work(n,st,lg,dk);
        }
        else
        {
            st.insert(0);
            st.insert(2);
            st.insert(4);
            work(n,st,lg,dk);
        }
    }
    return 0;
}

 

posted @ 2018-10-21 09:41  degvx  阅读(162)  评论(0)    收藏  举报