Price List Strike BackThere are sumi.
However, due to Byteasar's poor math, he may calculate it wrong.
Please write a program to help Byteasar judge whether each number is sure to be calculated wrong.InputThe first line of the input contains an integer i-th character should be '1'. Otherwise, it should be '0'.Sample Input
2 3 3 3 3 3 2 4 3 3 3 5 3 3 3 3 1 2 3 1 3 5 4 5 1 2 4 2 1 8 9 2 1 1 5 1 3 4 4 1 5 1 5 3 5 1 3 5 1Sample Output
011 1101
【题意】
在Byteland一共有n家商店,编号依次为1到n。每家商店只会卖一种物品,其中第ii家商店的物品单价为 。
Byteasar每天都会进行一次购物,第ii天他会选择一个区间[记录在账本上。
Byteasar的数学不好,他可能会把花的钱记错。
请写一个程序,帮助Byteasar判断每条记录是否一定是错的。
【分析】
前面是偏序问题,后面问能否拼出某个价格,且价格《=100,可以用动态规划解决。
官方题解:
考虑对序列进行分治,设当前分治区间为[l,r],取mid=(l+r)/2,那么所有在[l,mid)的询问和(mid,r]的询问可以递归分治求解,故只需考虑必然经过mid的询问。
设f[i][j]表示考虑了[i,mid],目前选出的物品和为j时,所选商店到家的距离的最大值最小是多少;g[i][j]表示考虑了(mid,i],目前选出的物品和为j时,所选商店到家的距离的最大值最小是多少,f和g都能在O(100(r-l+1))的复杂度内求出。那么对于一个询问l,r,s,cl,r,s,c,只需要求出),然后和c比较一下大小就好了。
时间复杂度)。
表示没有想出dis的解决方法,那个dp里面记录最小距离真是太机智。。【是我太蠢。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define Maxn 20010 9 #define Maxm 100010 10 #define Maxd 110 11 #define INF 0x7fffffff 12 13 int v[Maxn],d[Maxn]; 14 15 struct node 16 { 17 int l,r,c,sum; 18 }t[Maxm]; 19 20 int a[Maxm],a1[Maxm],a2[Maxm]; 21 int f[Maxn][Maxd]; 22 bool ans[Maxm]; 23 24 int mymin(int x,int y) {return x<y?x:y;} 25 int mymax(int x,int y) {return x>y?x:y;} 26 27 void get_f(int l,int r,int mid) 28 { 29 for(int i=l;i<=r;i++) 30 for(int j=0;j<=100;j++) 31 f[i][j]=INF; 32 for(int i=l;i<=r;i++) f[i][0]=0; 33 int i; 34 for(i=mid;i>=l;i--) 35 for(int j=100;j>=0;j--) 36 { 37 f[i][j]=mymin(f[i][j],f[i+1][j]); 38 if(j>=v[i]) f[i][j]=mymin(f[i][j],mymax(f[i+1][j-v[i]],d[i])); 39 } 40 f[mid+1][v[mid+1]]=d[mid+1]; 41 for(int i=mid+2;i<=r;i++) 42 for(int j=100;j>=0;j--) 43 { 44 f[i][j]=mymin(f[i][j],f[i-1][j]); 45 if(j>=v[i]) f[i][j]=mymin(f[i][j],mymax(f[i-1][j-v[i]],d[i])); 46 } 47 // for(int i=mid-1;i>=l;i--) 48 // for(int j=0;j<=100;j++) f[i][j]=mymin(f[i][j],f[i+1][j]); 49 // for(int i=mid+2;i<=r;i++) 50 // for(int j=0;j<=100;j++) f[i][j]=mymin(f[i][j],f[i-1][j]); 51 } 52 53 void ffind(int l,int r,int x,int y) 54 { 55 if(x>y) return; 56 if(l==r) 57 { 58 for(int i=x;i<=y;i++) 59 if(v[l]==t[a[i]].sum&&d[l]<=t[a[i]].c) ans[a[i]]=1; 60 else ans[a[i]]=0; 61 return; 62 } 63 int mid=(l+r)>>1; 64 get_f(l,r,mid); 65 a1[0]=a2[0]=0; 66 for(int i=x;i<=y;i++) 67 { 68 if(t[a[i]].l<=mid&&t[a[i]].r>mid) 69 { 70 ans[a[i]]=0; 71 for(int j=0;j<=t[a[i]].sum;j++) 72 { 73 if(mymax(f[t[a[i]].l][j],f[t[a[i]].r][t[a[i]].sum-j])<=t[a[i]].c) {ans[a[i]]=1;break;} 74 } 75 } 76 else if(t[a[i]].r<=mid) 77 { 78 a1[++a1[0]]=a[i]; 79 } 80 else a2[++a2[0]]=a[i]; 81 } 82 int nw=a1[0],ww=a2[0]; 83 for(int i=1;i<=a1[0];i++) a[x+i-1]=a1[i]; 84 for(int i=1;i<=a2[0];i++) a[y-i+1]=a2[i]; 85 ffind(l,mid,x,x+nw-1); 86 ffind(mid+1,r,y-ww+1,y); 87 } 88 89 int main() 90 { 91 int T; 92 scanf("%d",&T); 93 while(T--) 94 { 95 int n,m; 96 scanf("%d%d",&n,&m); 97 for(int i=1;i<=n;i++) scanf("%d",&v[i]); 98 for(int i=1;i<=n;i++) scanf("%d",&d[i]); 99 for(int i=1;i<=m;i++) scanf("%d%d%d%d",&t[i].l,&t[i].r,&t[i].c,&t[i].sum); 100 for(int i=1;i<=m;i++) a[i]=i; 101 ffind(1,n,1,m); 102 for(int i=1;i<=m;i++) 103 { 104 if(ans[i]) printf("0"); 105 else printf("1"); 106 } 107 printf("\n"); 108 } 109 return 0; 110 }