题目大意:初始点未定,有m个操作,可以将点向左或者向右移动d个单位长度,问存不存在一个初始点符合要求。
题解:开n长度的bitset,每一次移动使用bitset的左移和右移,并将结果使用或运算处理,然后在并上初始点,最后若存在1,则有可行点。
代码如下:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bitset <20005> a,b;
int main()
{
int n;
cin>>n;
int flag1=1;
while(n--){
int t,m;
cin>>t>>m;
//int a,b;
int flag=0;
a.reset();
b.reset();
for(int i=0;i<=t;i++){
a.set(i),b.set(i);
}
for(int i=0;i<m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
a=((a>>(r-l))|(a<<(r-l)))&b;
}
for(int i=0;i<=t;i++)
{
//cout<<a[i]<<endl;
if(a[i]==1)
flag=1;
}
if(flag==0)
flag1=0;
//cout << "Hello world!" << endl;
}
if(flag1==1)
cout<<"possible"<<endl;
else
cout<<"impossible"<<endl;
return 0;
}