zoukankan      html  css  js  c++  java
  • BZOJ4571:[SCOI2016]美味

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4571

    直接从高位到低位贪心。我们可以一位一位确定还没与(b)异或起来的(ans),最后再与(b)异或。假设前面的高位确定完之后,根据当前位贪心需要什么,可以在一段区间内找到我们需要的数字。如果存在,那么这一位就是贪心的结果,否则就是另一种。在一段区间内找值域在某一段区间的数字,正好可以用主席树搞定。

    时间复杂度:(O(nlognlogv))

    空间复杂度:(O(nlogv))

    代码如下:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int maxn=2e5+5;
    
    int n,m;
    int rt[maxn];
    
    int read() {
    	int x=0,f=1;char ch=getchar();
    	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    	for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    	return x*f;
    }
    
    struct tree_node {
    	int cnt,ls,rs;
    };
    
    struct chairman_tree {
    	int tot;
    	tree_node tree[maxn*18];
    
    	void ins(int lst,int &now,int l,int r,int pos) {
    		now=++tot;tree[now]=tree[lst];
    		tree[now].cnt++;
    		if(l==r)return;
    		int mid=(l+r)>>1;
    		if(pos<=mid)ins(tree[lst].ls,tree[now].ls,l,mid,pos);
    		else ins(tree[lst].rs,tree[now].rs,mid+1,r,pos);
    	}
    
    	int query(int x,int y,int l,int r,int L,int R) {
    		if(L<=l&&r<=R)return tree[y].cnt-tree[x].cnt;
    		int mid=(l+r)>>1,res=0;
    		if(L<=mid)res+=query(tree[x].ls,tree[y].ls,l,mid,L,R);
    		if(R>mid)res+=query(tree[x].rs,tree[y].rs,mid+1,r,L,R);
    		return res;
    	}
    }T;
    
    int main() {
    	n=read(),m=read();
    	for(int i=1;i<=n;i++) {
    		int x=read();
    		T.ins(rt[i-1],rt[i],0,1e5,x);
    	}
    	for(int i=1;i<=m;i++) {
    		int b=read(),x=read(),l=read(),r=read(),ans=0;
    		for(int j=17;~j;j--) {
    			int L,R,bit;
    			if(b&(1<<j))L=ans,R=ans+(1<<j)-1,bit=0;
    			else L=ans+(1<<j),R=ans+(1<<(j+1))-1,bit=1;
    			L=max(L-x,0);R=min(100000,R-x);
    			bool bo=T.query(rt[l-1],rt[r],0,1e5,L,R);
    			if(!bo)bit^=1;ans|=bit<<j;
    		}ans^=b;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/AKMer/p/9974602.html
Copyright © 2011-2022 走看看