终于过了,比赛的时候一直在TLE,然后赛后好不容易不TLE了,就开始wa。。。。
题意:典型的线段树操作吧。。。。如果给的操作指示是0 就交换a b 两个格子所在位置的DV,如果是1,就查询a b区间内是否都是a b区间内的值。是的话,YES,否则,NO。
其实比赛的时候觉得线段树肯定会TLE,所以都没想着改他。。。
要注意一点,就是在query的时候,是要保存寻找到的最大值的最大值,最小值的最小值,如果只是判断是否相等,就会错,因为不一定在原来的位置,只要在区间内就好。
然后代码有点拖沓。
#include <stdio.h> #include <iostream> using namespace std; #define maxn 100010 #define inf 0x3f3f3f3f struct node { int low,hig; int quan; }tree[maxn*3]; int top,que[maxn],loc[maxn]; int n,m; int maxx,minn; int min(int x,int y) { if(x>y) return y; else return x; } int max(int x,int y) { if(x>y) return x; else return y; } void creat(int l,int r,int rt) { tree[rt].low=l; tree[rt].hig=r; if(l==r) {loc[top++]=rt;return;} int mid=(l+r)/2; creat(l,mid,rt<<1); creat(mid+1,r,rt<<1|1); } /*void update(int ll,int rr,int l,int r,int rt) { if(ll==l||rr==r) { // printf("l=%d ll=%d tree.low=%d r=%d rr=%d tree.hig=%d\n",l,ll,tree[rt].low,r,rr,tree[rt].hig); // printf("tree.low=%d ll=%d l=%d\n",tree[rt].low,ll,l);printf("tree.hig=%d rr=%d d=%d\n",tree[rt].hig,rr,r); tree[rt].low=max(que[ll],tree[rt].low); tree[rt].hig=min(que[rr],tree[rt].hig); return; } int mid=(l+r)/2; if(rr<=mid) update(ll,rr,l,mid,rt<<1); else if(ll>mid) update(ll,rr,mid+1,r,rt<<1|1); else {update(ll,mid,l,mid,rt<<1);update(mid+1,rr,mid+1,r,rt<<1|1);} tree[rt].low=min(tree[rt<<1].low,tree[rt<<1|1].low); tree[rt].hig=max(tree[rt<<1].hig,tree[rt<<1|1].hig); } void update(int x,int y,int l,int r,int rt) { }*/ void query(int ll,int rr,int l,int r,int rt) { if(ll==l&&rr==r) { maxx=max(maxx,tree[rt].hig); minn=min(minn,tree[rt].low); return; } int mid=(l+r)/2,tmp,ans; if(rr<=mid) query(ll,rr,l,mid,rt<<1); else if(ll>mid) query(ll,rr,mid+1,r,rt<<1|1); else {query(ll,mid,l,mid,rt<<1);query(mid+1,rr,mid+1,r,rt<<1|1);} // return tmp&&ans; } template<class T> inline char read(T &n){ T x = 0, tmp = 1; char c = getchar(); while((c < '0' | c > '9') && c != '-' && c != EOF) c = getchar(); if(c == '-') c = getchar(), tmp = -1; while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar(); n = x*tmp; return c; } template <class T> inline void write(T n) { if(n < 0) { putchar('-'); n = -n; } int len = 0,data[20]; while(n) { data[len++] = n%10; n /= 10; } if(!len) data[len++] = 0; while(len--) putchar(data[len]+48); } void init() { int i; for(i=0;i<n;i++) que[i]=i; } void find(int x,int y) { int xx=loc[x],yy=loc[y]; tree[xx].low=que[x]; tree[xx].hig=que[x]; tree[yy].low=que[y]; tree[yy].hig=que[y]; xx/=2; while(xx>0) { tree[xx].low=min(tree[xx<<1].low,tree[xx<<1|1].low); tree[xx].hig=max(tree[xx<<1].hig,tree[xx<<1|1].hig); xx/=2; } yy/=2; while(yy>0) { tree[yy].low=min(tree[yy<<1].low,tree[yy<<1|1].low); tree[yy].hig=max(tree[yy<<1].hig,tree[yy<<1|1].hig); yy/=2; } } int main() { int t; read(t); while(t--) { read(n);read(m); top=0; init(); creat(0,n-1,1); int a,b,c; while(m--) { read(a);read(b);read(c); if(a==0) { int tmp=que[c]; que[c]=que[b]; que[b]=tmp; find(b,c); // find(c); // update(b,c,0,n-1,1); } if(a==1) { // put(0,n-1,1); maxx=-1;minn=inf; query(b,c,0,n-1,1); if(maxx==c&&minn==b) puts("YES"); else puts("NO"); } } } return 0; }