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]);
}