zoukankan      html  css  js  c++  java
  • Edu7

    Edu7

    C:记录区间最值位置的线段树

    给出[l,r],v,要求写出[l,r]中不等于v的数的位置,用线段树记录min和max的位置,判断一下.

    int n,m,k,a[N];
    struct node {
    	int l,r,tmin,tmax;
    	int maxi,mini;
    } tr[4*N];
    
    void pushup(int u) {
    	tr[u].tmin = min(tr[u<<1].tmin,tr[u<<1|1].tmin);
    	if(tr[u].tmin == tr[u<<1].tmin) {
    		tr[u].mini = tr[u<<1].mini;
    	} else {
    		tr[u].mini = tr[u<<1|1].mini;
    	}
    
    	tr[u].tmax = max(tr[u<<1].tmax,tr[u<<1|1].tmax);
    	if(tr[u].tmax == tr[u<<1].tmax) {
    		tr[u].maxi = tr[u<<1].maxi;
    	} else tr[u].maxi = tr[u<<1|1].maxi;
    }
    
    void build(int u,int l,int r) {
    	tr[u].l = l,tr[u].r = r;
    	if(l == r) {
    		tr[u].tmax = a[l];
    		tr[u].tmin = a[l];
    		tr[u].maxi = l;
    		tr[u].mini = l;
    		return ;
    	}
    	int mid = (l + r) >> 1;
    	build(u<<1,l,mid);
    	build(u<<1|1,mid+1,r);
    	pushup(u);
    }
    
    int qmin(int u,int l,int r) {
    	if(tr[u].r < l || tr[u].l > r)return INF;
    	if(tr[u].l >= l && tr[u].r <= r)return tr[u].mini;
    	int mid = (tr[u].l + tr[u].r) >> 1;
    	int x = -1,y=-1;
    	if(l <= mid) {
    		x = qmin(u<<1,l,r);
    	}
    	if(r > mid) {
    		y = qmin(u<<1|1,l,r);
    	}
    	if(x != -1 && y != -1){
    		if(a[x] > a[y])return y;
    		else return x;
    	}
    	else return max(x,y);
    }
    
    int qmax(int u,int l,int r) {
    	if(tr[u].r < l || tr[u].l > r)return -1;
    	if(tr[u].l >= l && tr[u].r <= r)return tr[u].maxi;
    	int mid = (tr[u].l + tr[u].r) >> 1;
    	int x=-1,y=-1;
    	if(l <= mid) {
    		x = qmax(u<<1,l,r);
    	}
    	if(r > mid) {
    		y = qmax(u<<1|1,l,r);
    	}
    	if(x != -1 && y != -1) {
    		if(a[x] > a[y])return x;
    		else return y;
    	} else return max(x,y);
    }
    void work() {
    	scanf("%d%d",&n,&m);
    	for(int i=1; i<=n; i++) {
    		scanf("%d",&a[i]);
    	}
    	build(1,1,n);
    	while(m--) {
    		int l,r,v;
    		scanf("%d%d%d",&l,&r,&v);
    		int aa = qmax(1,l,r);
    		int bb = qmin(1,l,r);
    //		cout << "maxi : " << aa << " " << "mini:" << bb << endl; 
    		if(a[aa] == v && a[bb] == v)printf("-1
    ");
    		else if(a[aa] != v)printf("%d
    ",aa);
    		else printf("%d
    ",bb);
    	}
    }
    

    D:数学构造题

    可以发现对于两个数字i,相差n-i时答案为0,那么将奇数放在[1,n],[2,n-1]....位置,再把偶数放在[n+2,2n],[n+3,2n-1]...位置,剩余的n如果没放过,找个空位放进去.

    void work() {
    	scanf("%d",&n);
    	int p=1;
    	for(int i=1,j=n; i<j; i++,j--) {
    		a[i] = a[j] = p;p += 2;
    	}
    	p = 2;
    	for(int i=n+2,j=2*n; i<j; i++,j--) {
    		a[i] = a[j] = p;p += 2;
    	}
    	for(int i=1; i<=2*n; i++) {
    		if(a[i] == 0) a[i] = n;
    	}
    	for(int i=1; i<=2*n; i++) printf("%d ",a[i]);
    }
    
    
  • 相关阅读:
    final-第十章
    路由器基本配置-命令行配置模式
    路由器基本配置-对话配置模式
    配置静态路由
    默认路由
    像素值的读写
    矩阵的基本元素表达
    创建Mat对象
    Mat类
    数学基础-3D空间的位置表示
  • 原文地址:https://www.cnblogs.com/LaiYiC/p/14963637.html
Copyright © 2011-2022 走看看