Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define SZ(X) ((int)(X).size())
- #define ALL(X) (X).begin(), (X).end()
- #define REP(I, N) for (int I = 0; I < (N); ++I)
- #define REPP(I, A, B) for (int I = (A); I < (B); ++I)
- #define RI(X) scanf("%d", &(X))
- #define RII(X, Y) scanf("%d%d", &(X), &(Y))
- #define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
- #define DRI(X) int (X); scanf("%d", &X)
- #define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
- #define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
- #define RS(X) scanf("%s", (X))
- #define CASET int ___T, case_n = 1; scanf("%d ", &___T); while (___T-- > 0)
- #define MP make_pair
- #define PB push_back
- #define MS0(X) memset((X), 0, sizeof((X)))
- #define MS1(X) memset((X), -1, sizeof((X)))
- #define LEN(X) strD(X)
- #define PII pair<int,int>
- #define VI vector<int>
- #define VPII vector<pair<int,int> >
- #define PLL pair<long long,long long>
- #define VPLL vector<pair<long long,long long> >
- #define F first
- #define S second
- typedef long long LL;
- using namespace std;
- const LL INF = 2e18;
- const int SIZE = 1e7+10;
- int N,M;
- LL E,x[100010];
- int d[40],ban[SIZE],D,tt;
- struct Union_Find{
- int d[200],num[200];
- void init(int n){
- REP(i,n)d[i]=i,num[i]=1;
- }
- int find(int x){
- return (x!=d[x])?(d[x]=find(d[x])):x;
- }
- bool uu(int x,int y){
- x=find(x);
- y=find(y);
- if(x==y)return 0;
- if(num[x]>num[y])swap(x,y);
- num[y]+=num[x];
- d[x]=y;
- return 1;
- }
- }U;
- int bfs[SIZE];
- bool valid(int ed){
- int rr=0;
- REP(i,D){
- bfs[rr++]=i;
- ban[i]=tt;
- }
- REP(i,rr){
- int x=bfs[i];
- REP(j,N){
- if(x+d[j]>ed)return 1;
- if(ban[x+d[j]]!=tt){
- ban[x+d[j]]=tt;
- bfs[rr++]=x+d[j];
- }
- if(x>=d[j]&&ban[x-d[j]]!=tt){
- ban[x-d[j]]=tt;
- bfs[rr++]=x-d[j];
- }
- }
- }
- return 0;
- }
- int main(){
- CASET{
- RII(N,M);
- scanf("%I64d",&E);
- REP(i,N)RI(d[i]);
- sort(d,d+N);
- int gg=d[0];
- REPP(i,1,N)gg=__gcd(gg,d[i]);
- REP(i,N)d[i]/=gg;
- REP(i,M){
- scanf("%I64d",&x[i]);
- if(x[i]%gg){
- i--;M--;
- }
- else x[i]/=gg;
- }
- if(E%gg){
- puts("evading is impossible");
- continue;
- }
- E/=gg;
- if(!M){
- puts("evadable");
- continue;
- }
- U.init(100);
- REPP(i,d[0],100){
- REP(j,N){
- if(i>=d[j])U.uu(i,i-d[j]);
- }
- if(U.num[U.find(i)]==i+1){
- D=i+1;
- break;
- }
- }
- D=max(D,d[N-1]+1);
- sort(x,x+M);
- bool fail=0;
- for(int i=0,j;i<M;){
- LL low=x[i]-D;
- tt++;
- for(j=i;j+1<M&&x[j]+D>=x[j+1];j++);
- for(;i<=j;i++)ban[x[i]-low]=tt;
- if(!valid(x[j]-low)){
- fail=1;
- break;
- }
- }
- puts(fail?"evading is impossible":"evadable");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment