선분 수 분할 치료

70959 단어 데이터 구조
글 목록
  • 구호
  • bzoj 4025: 이분 도
  • loj 534. "LibreOJ Round \ # 6" 화단
  • bzoj 4644. 고전 바보 문제
  • 구호
    내 가 모 르 는 알고리즘 이 많 더 라 고.아마도 일부 조건 을 주 었 을 것 이다. 이런 조건 들 은 효력 이 발생 하기 시작 하 는 시간 과 효력 을 잃 는 시간 이 있 고, 그 다음 에 특정한 시간 내 에 조건 제한 하에 서 의 답안 을 묻는다.방법 은 시간 대 에 선분 나 무 를 만 드 는 것 이다. 조건 을 시작 시간 과 끝 시간 구간 에 따라 조회 하 는 방식 으로 선분 나 무 를 삽입 한 다음 에 전체 선분 나 무 를 옮 겨 다 니 며 답 을 얻 는 것 이다. 나 는 나의 아버지 로부터 그것 을 물 려 받 은 다음 에 나의 조건 을 더 해서 거 슬러 올 라 갈 때 나의 조건 을 취소 하 는 것 이다.
    이분 도
    ..............................................................................................각 점 에서 아버지의 변 권 은 1 / 0 으로 아버지 와 동 색 여 부 를 나타 낸다.그래서 선분 수 를 끼 워 서 나 누 면 돼 요.
    //Achen
    #include
    #define For(i,a,b) for(register int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
    #define Formylove return 0
    const int N=200007;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int n,m,T;
    
    template<typename T> void read(T &x) {
    	char ch=getchar(); T f=1; x=0;
    	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    	if(ch=='-') f=-1,ch=getchar();
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    #define pr pair
    #define MP make_pair
    #define se second
    #define fi first
    vector<pr>vc[N<<2];
    vector<int>cx[N<<2];
    
    #define lc (x<<1)
    #define rc ((x<<1)|1)
    #define mid ((l+r)>>1)
    void add(int x,int l,int r,int ql,int qr,int u,int v) {
    	if(l>=ql&&r<=qr) {
    		vc[x].push_back(MP(u,v));
    		return ;
    	}
    	if(ql<=mid) add(lc,l,mid,ql,qr,u,v);
    	if(qr>mid) add(rc,mid+1,r,ql,qr,u,v);
    }
    
    int fa[N],fg[N];
    pr find(int x) {
    	if(x==fa[x]) return MP(x,0);
    	pr t=find(fa[x]);
    	return MP(t.fi,t.se+fg[x]);
    }
    
    int no[N];
    void qry(int x,int l,int r) {
    	int up=vc[x].size(),fl=1;
    	For(i,0,up-1) {
    		pr e=vc[x][i];
    		int u=e.fi,v=e.se;
    		pr t1=find(u),t2=find(v);
    		if(t1.fi==t2.fi) {
    			if(t1.se%2==t2.se%2) { fl=0; break; }
    			else continue;
    		}
    		else {
    			fa[t1.fi]=t2.fi;
    			fg[t1.fi]=(t1.se%2==t2.se%2);
    			cx[x].push_back(t1.fi);
    		}
    	}
    	if(!fl) For(i,l,r) no[i]=1; 	
    	if(l!=r&&fl) { qry(lc,l,mid); qry(rc,mid+1,r); }
    	up=cx[x].size();
    	Rep(i,up-1,0) fa[cx[x][i]]=cx[x][i];
    }
    
    int main() {
        //freopen("1.in","r",stdin);
        //freopen("1.out","w",stdout);
    	read(n); read(m); read(T);
    	For(i,1,n) fa[i]=i,fg[i]=0;
    	For(i,1,m) {
    		int u,v,s,t;
    		read(u); read(v);
    		read(s); read(t);
    		if(s+1<=t) add(1,1,T,s+1,t,u,v);
    	}
    	qry(1,1,T);
    	For(i,1,T) if(!no[i]) puts("Yes"); else puts("No");
    	Formylove;
    }
    

    LibreOJ Round \ # 6 꽃 뭉치
    .....................................................................................새로 추 가 된 수정 사항 은 현재 문의 뒤에 있 습 니 다. 우 리 는 선분 트 리 에서 걸 어가 면서 읽 습 니 다.수정 을 읽 을 때 까지 질문 을 읽 을 때 까지 계속 고 쳐 라. 질문 을 읽 을 때 까지 라인 트 리 에서 걷 고, 질문 하 는 곳 으로 가서 대답 한 후에 계속 읽 어 라.더욱 오묘 한 것 은 이 문 제 를 선분 수 로 나 누 어 이렇게 하면 1500 2 l o g 15000 ^ 2log 150002 log 의 (불만) 인 데 거 위 는 지나 갈 수 있 습 니까?
    //Achen
    #include
    #define For(i,a,b) for(register int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
    #define Formylove return 0
    const int N=15007;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int T,V,oo,nowti,lastans;
    
    template<typename T> void read(T &x) {
    	char ch=getchar(); T f=1; x=0;
    	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    	if(ch=='-') f=-1,ch=getchar();
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    #define pr pair
    #define MP make_pair
    #define se second
    #define fi first
    vector<pr>vc[N<<2];
    int f[20][N];
    
    #define lc (x<<1)
    #define rc ((x<<1)|1)
    #define mid ((l+r)>>1)
    void add(int x,int l,int r,int ql,int qr,int v,int w) {
    	if(l>=ql&&r<=qr) {
    		vc[x].push_back(MP(v,w));
    		return ;
    	}
    	if(ql<=mid) add(lc,l,mid,ql,qr,v,w);
    	if(qr>mid) add(rc,mid+1,r,ql,qr,v,w);
    }
    
    int op,vv,ww,tt;
    void get_read() {
    	while(nowti<T) {
    		nowti++;
    		read(op); read(vv); vv-=oo*lastans;
    		if(op==1) { 
    			read(ww); read(tt); 
    			ww-=oo*lastans; tt-=oo*lastans;
    			if(tt>=nowti) add(1,1,T,nowti,tt,vv,ww);
    		}
    		else break;
    	}
    }
    
    void qry(int x,int l,int r,int dep) {
    	For(i,0,V) f[dep][i]=f[dep-1][i];
    	int up=vc[x].size();
    	For(i,0,up-1) {
    		pr t=vc[x][i];
    		int v=t.fi,w=t.se;
    		Rep(i,V,v) f[dep][i]=max(f[dep][i],f[dep][i-v]+w);
    	}
    	if(l!=r) {
    		if(nowti>=1&&nowti<=mid) qry(lc,l,mid,dep+1);
    		if(nowti>mid&&nowti<=r) qry(rc,mid+1,r,dep+1);
    	}
    	else if(op==2&&l==nowti) {
    		int t1,t2;
    		if(f[dep][vv]>=0) t1=1,t2=f[dep][vv];
    		else t1=t2=0;
    		printf("%d %d
    "
    ,t1,t2); lastans=(t1^t2); get_read(); } } int main() { //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); read(T); read(V); read(oo); get_read(); memset(f,128,sizeof(f)); f[0][0]=0; qry(1,1,T,1); Formylove; }

    바보
    ...............................................................................멍청 하 다. 다시 한 번 자세히 보 니 숫자 L < 1000.점 권 을 수정 하려 면 한 수 를 삭제 하고 다른 수 를 넣 어야 하기 때문에 선형 기 는 자기 가 한 수 를 삭제 하지 않 고 선분 수 분 치 를 고려 해 야 한다.각 점 은 한 구간 에서 같은 값 을 유지 하고 선분 트 리 에 조건 을 추가 합 니 다. 이 구간 에 이 값 을 추가 합 니 다.그래서 현재 의 조건 은 모두 가입 이 고 선분 수 분 치 는 매번 아버지의 선형 기 를 계승 하면 된다.bitset 로 최적화 해 주세요.
    //Achen
    #include
    #define For(i,a,b) for(register int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
    #define Formylove return 0
    const int N=1007;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int ID,n,m,prt[N],UP;
    
    template<typename T> void read(T &x) {
    	char ch=getchar(); T f=1; x=0;
    	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    	if(ch=='-') f=-1,ch=getchar();
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    #define BT bitset
    vector<BT>vc[N<<2];
    BT prv[N],w,ans;
    char s[N];
    void getw() {
    	scanf("%s",s); w.reset();
    	int len=strlen(s);
    	UP=max(UP,len-1);
    	Rep(i,len-1,0) 
    		if(s[i]=='1') w.set(len-i-1);
    }
    
    void print(BT A) {
    	int st=UP;
    	while(st&&!A.test(st)) st--;
    	while(st>=0) {
    		if(A.test(st)) putchar('1');
    		else putchar('0'); st--;
    	} puts("");
    }
    
    #define lc (x<<1)
    #define rc ((x<<1)|1)
    #define mid ((l+r)>>1)
    void add(int x,int l,int r,int ql,int qr,int v) {
    	if(ql>qr) return ;
    	if(l>=ql&&r<=qr) {
    		vc[x].push_back(prv[v]);
    		return ;
    	}
    	if(ql<=mid) add(lc,l,mid,ql,qr,v);
    	if(qr>mid) add(rc,mid+1,r,ql,qr,v);
    }
    
    BT b[12][N];
    void qry(int x,int l,int r,int dep) {
    	int up=vc[x].size();
    	For(i,0,UP) b[dep][i]=b[dep-1][i];
    	For(i,0,up-1) {
    		BT v=vc[x][i]; 
    		//printf("%d %d ",l,r); print(v);
    		Rep(j,UP,0) if(v.test(j)) {
    			if(b[dep][j].test(j)) v^=b[dep][j];
    			else { b[dep][j]=v; break; }
    		}
    	}
    	if(l==r) {
    		ans.reset();
    		Rep(i,UP,0) if(!ans.test(i)) ans^=b[dep][i];
    		print(ans); 
    		return;
    	}
    	qry(lc,l,mid,dep+1); qry(rc,mid+1,r,dep+1); 
    }
    
    int main() {
        freopen("4644.in","r",stdin);
        freopen("4644.out","w",stdout);
    	read(ID);
    	read(n); read(m);
    	For(i,1,n) prt[i]=1;
    	For(i,1,m) {
    		int u,v;
    		read(u); read(v); getw(); //print(w);
    		add(1,1,m,prt[u],i-1,u); prv[u]^=w; prt[u]=i;
    		add(1,1,m,prt[v],i-1,v); prv[v]^=w; prt[v]=i;
    	}
    	For(i,1,n) add(1,1,m,prt[i],m,i);
    	qry(1,1,m,1);
    	Formylove;
    }
    

    좋은 웹페이지 즐겨찾기