模拟

#include<bits/stdc++.h> //对拍数据 
using namespace std;
int f()
{
	int x=rand()%2;
	if(x==0) return 1;
	else return -1;
}
int main()
{
	freopen("C:/Users/hzy/Desktop/11.txt","w",stdout);
	srand(time(0));
	int t;
	scanf("%d",&t);
	printf("%d\n",t);
	while(t--)
	{
		int n,m;
		n=rand()%100+1;
		printf("%d ",n);
		for(int i=0;i<n;i++) printf("%d ",rand()%1024);cout<<endl;
		m=rand()%100+1;
		printf("%d ",m);
		for(int i=0;i<m;i++) printf("%d ",f()*rand()%1024);cout<<endl;
	}
	return 0;
}
#include<bits/stdc++.h>//二分模拟
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int n,m;
int a[maxn],b[maxn],s[maxn],d[maxn];
int dis[maxn];
int fabs(int x){return x>0?x:-x;}
struct Node
{
    int len,s;
}c[maxn];
bool cmp(Node p,Node q)
{
    if(p.s==q.s) {return p.len<q.len;}
    return p.s<q.s;
}
int main()
{
    //freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        s[0]=0;
        for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}//预处理
        scanf("%d",&m);
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        int num=0;
        for(int i=1;i<=n;i++)
          for(int j=i;j<=n;j++)
            c[num].s=s[j]^s[i-1],c[num++].len=j-i+1;//预处理
        sort(c,c+num,cmp);
        for(int i=0;i<num;i++) d[i]=c[i].s;//临时对应数组
        int s=1;
        dis[0]=1;
        for(int i=1;i<num;i++)   //预处理出(距离最右侧与之相等值的距离+1)
        {
            if(d[i-1]==d[i]) s++;
            else s=1;
            dis[i]=s;
        }
          for(int i=num-1;i>=0;)   //预处理出(距离最右侧与之相等值的距离+1)
            for(int j=dis[i],k=1;j>=1;j--,i--,k++)
              dis[i]=k;
        for(int i=1;i<=m;i++)
        {
            int pos=lower_bound(d,d+num,b[i])-d;//无大于b[i]的值返回最后坐标+1
            int _pos=pos+dis[pos]-1;//暴力找被tl了
            if(pos!=num)            
            {
               if(pos==0)
               {
                   printf("%d\n",c[_pos].len);
                   continue;
               }
               if(fabs(d[pos-1]-b[i])<fabs(d[pos]-b[i])) printf("%d\n",c[pos-1].len);
               else if(fabs(d[pos-1]-b[i])==fabs(d[pos]-b[i])) 
                    printf("%d\n",max(c[pos-1].len,c[_pos].len));
               else printf("%d\n",c[_pos].len);
            }
            else
            {
                printf("%d\n",c[pos-1].len);
            }
        }
        printf("\n");
    }
    return 0;
}
#include<bits/stdc++.h>//桶标记
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int a[maxn],b[maxn],s[maxn],d[maxn];
int fabs(int x){return x>0?x:-x;}
int main()
{
    //freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){ scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        memset(d,-1,sizeof(d));
        for(int i=0;i<n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                int tmp=s[j]^s[i]; //ai<1024且为非负数,没注意非负,外加对应数值存储负数结果被tle
                if(d[tmp]==-1) d[tmp]=j-i;//初始化
                else d[tmp]=max(d[tmp],j-i);//更新最大
            }
        }
        for(int i=1;i<=m;i++)
        {
                if(b[i]<0) b[i]=0;              //ai不非负,题目可以改进一下
                for(int j=b[i],k=b[i];;j--,k++) //找最近和绝对值差最大的答案
                {
                    if(j<0) j=0;
                    if(k>1024) k=1024;          //最大值1024 
                    if(d[j]!=-1&&d[k]==-1) {printf("%d\n",d[j]);break;}
                    else if(d[j]==-1&&d[k]!=-1) {printf("%d\n",d[k]);break;}
                    else if(d[j]!=-1&&d[k]!=-1) {printf("%d\n",max(d[j],d[k]));break;}
                }
        }
        printf("\n");
    }
    return 0;
}
#include<bits/stdc++.h>//拼人品的暴力
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int a[maxn],b[maxn],s[maxn],d[maxn];
int fabs(int x){return x>0?x:-x;}
int main()
{
    //freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        s[0]=0;
        for(int i=1;i<=n;i++){ scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
       for(int k=1;k<=m;k++)
       {
           int anslen,anss=INF;
          for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)
            {
                int tmp=fabs((s[j]^s[i-1])-b[k]);
                if(tmp<anss)
                {
                    anss=tmp;
                    anslen=j-i+1;
                }
                else if(tmp==anss&&(j-i+1)>anslen)
                {
                    anslen=j-i+1;
                }
            }
          printf("%d\n",anslen);
       }
        printf("\n");
    }
    return 0;
}
#include<bits/stdc++.h>//再练习下二分
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int n,m;
int a[maxn],b[maxn],s[maxn],d[maxn],f[maxn];
int dis[maxn];
int fabs(int x){return x>0?x:-x;}
struct Node
{
    int len,s;
}c[maxn];
bool cmp(Node p,Node q)
{
    if(p.s==q.s) {return p.len<q.len;}
    return p.s<q.s;
}
int O[maxn];
int X[maxn];
int low(int l,int r,int x)
{
    int pos=-1;
    while(l<=r)
    {
       int mid=(l+r)/2;
       if(d[mid]<=x) {l=mid+1;pos=mid;}
       else r=mid-1;
    }
    return pos;
}
int high(int l,int r,int x)  
{
    int tmpl=l,tmpr=r;
    int pos=-1;
    while(l<=r)
    {
       int mid=(l+r)/2;
       if(d[mid]>=x) {r=mid-1;pos=mid;}
       else l=mid+1;
    }
    if(pos==-1) return -1;
    return low(tmpl,tmpr,d[pos]); //返回大于x并距其最近的值的最右边的坐标(没办法再次二分)
}
void solve()    //暴力答案对拍用
{
       int anslen,anss;
       for(int k=1;k<=m;k++)
       {
           anss=1e9;
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                int tmp=fabs((s[j]^s[i-1])-b[k]);
                if(tmp<anss)
                {
                    anss=tmp;
                    anslen=j-i+1;
                }
                else if(tmp==anss)
                {
                    anslen=max(anslen,j-i+1);
                }
            }
        }
        X[k]=anslen;
       }
}
int main()
{
   // freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        s[0]=0;
        for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}//预处理
        scanf("%d",&m);
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        int num=0;
        for(int i=1;i<=n;i++)
          for(int j=i;j<=n;j++)
            c[num].s=s[j]^s[i-1],c[num++].len=j-i+1;//预处理
        sort(c,c+num,cmp);
        for(int i=0;i<num;i++) d[i]=c[i].s;
        for(int i=1;i<=m;i++)
        {                               //lower_bound(),upper_bound()不适合 -_-!    
            int l=low(0,num-1,b[i]),r=high(0,num-1,b[i]); 
            if(l==-1)     //l:代表第一个小于等于b[i]的(相等值下取右侧)
            {
                O[i]=c[r].len;printf("%d\n",c[r].len);  
            }
            else if(r==-1)//r:代表第一个大于等于b[i]的(相等值下取右侧)
            {
                O[i]=c[l].len;printf("%d\n",c[l].len);
            }
            else
            {
                O[i]=max(c[l].len,c[r].len);
                if(fabs(d[l]-b[i])>fabs(d[r]-b[i]))
                {
                    O[i]=c[r].len;
                    printf("%d\n",c[r].len);
                }
                else if(fabs(d[l]-b[i])==fabs(d[r]-b[i]))
                {
                    O[i]=max(c[l].len,c[r].len);
                    printf("%d\n",max(c[l].len,c[r].len));
                }
                else
                {
                    O[i]=c[l].len;
                    printf("%d\n",c[l].len);
                }
            }
        }
//        solve();                        //对拍测试用
//        for(int i=1;i<=m;i++)
//        {
//            if(O[i]!=X[i]) {printf("t=%d\n",t);break;}
//        }
        printf("\n");
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值