爆零专场

总分 60+15+0=75 rank5
T1想主席树套树状数组,死活调不出来,后来发现内存炸了
交的30暴力+30静态主席树
T2暴力O(n4)加减枝 15
T3 真心不会
目前只改了T1
正解:因为异或了opt,所以反解答案。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 200005
using namespace std;

int prime[100005],tot,id[1000005];
bool vis[1000005];
void init(){
    for(int i=2;i<=1000000;i++){
        if(!vis[i]){prime[++tot]=i;id[i]=tot;}
        for(int j=1;j<=tot&&i*prime[j]<=1000000;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)break;
        }
    }
}

int n,m,k,a[200005],b[200005];
bool bo;
int main(){
    init();
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int opt,l,r,ans=0,lo,ll,lr;
    while(m--){
        scanf("%d%d%d",&opt,&l,&r);
        if(bo){
            if(id[opt^1])ans=opt^1;
            else ans=opt^2;
            printf("%d\n",ans);
            bo=0;
        }
        opt^=ans; l^=ans; r^=ans;
        if(opt==1){bo=1;lo=opt;ll=l;lr=r;}
        if(opt==2){a[l]=r;}
    }
    if(bo){
        int len=lr-ll+1,num=0;
        for(int i=1;i<=len;i++)b[i]=a[ll+i-1];
        sort(b+1,b+len+1);
        for(int i=1;i<=len;i++){
            if(id[b[i]])num++;
            if(num==k){ans=b[i];break;}
        }
        printf("%d\n",ans);
    }
    return 0;
}

还要多学啊!!!

posted @ 2017-10-01 21:48  Ren_Ivan  阅读(166)  评论(0编辑  收藏  举报