社区讨论

珂朵莉树T了一个点,身败名裂

P2894[USACO08FEB] Hotel G参与者 9已保存回复 41

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
41 条
当前快照
1 份
快照标识符
@mi6yjn61
此快照首次捕获于
2025/11/20 12:55
4 个月前
此快照最后确认于
2025/11/20 17:38
4 个月前
查看原帖
rt,感觉珂朵莉树可做,于是就15min打了个珂朵莉树,一直T一个点(非常数问题),冒昧求dalao优化程序QAQ,欢迎各位dalao提供意见
CPP
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;++i)
#define IT set<node>::iterator 
using namespace std;

int n,m,c,r,t,x,y,z,sq;

inline char nc(){ 
    static char buf[100000],*p1=buf,*p2=buf; 
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; 
}
inline int read(){
    re char ch=nc();
    re int sum=0; 
    while(!(ch>='0'&&ch<='9'))ch=nc(); 
    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); 
    return sum; 
} 

inline void out(re int a){
    if(a>=10)out(a/10);
    putchar(a%10+'0');
}

struct node{
	int l,r;
	mutable int v;
	node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
	bool operator <(const node &o)const{
		return l<o.l;
	}
};
set<node> s;

inline IT split(int pos){
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos)
	  return it;
	--it;
	int L=it->l;
	int R=it->r;
	int V=it->v;
	s.erase(it);
	s.insert(node(L,pos-1,V));
	return s.insert(node(pos,R,V)).first;
}

inline void assign_val(re int l,re int r,re int k){
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,k));
}

inline int query(re int l,re int r){
	int res=0,anss=0;
	IT itr=split(r+1),itl=split(l),it;
	for(;itl!=itr;++itl){
		if(!itl->v){
			if(!res){
				res=itl->l;
			}
			anss+=itl->r-itl->l+1;
			if(anss>=sq){
				int cc=itl->r-(anss-sq);
				assign_val(res,cc,1);
			    return res;
			}
		}
		else{
			anss=0;
			res=0;
		}
	}
	return 0;
}

int main(){
	int ansss=0;
	n=read(),m=read();
	s.insert(node(1,n,0));
	FOR(i,1,m){
		t=read();
		if(t==1){
			sq=read();
			out(query(1,n));
			puts("");
			ansss++;
		}
		else{
			x=read(),y=read();
			assign_val(x,x+y-1,0);
		}
	}
}

回复

41 条回复,欢迎继续交流。

正在加载回复...