codeforces data structures解题记录

1200~1499

1519C

void problem_solver() {
	int n; cin>>n;
	vector<vector<int>>g(n+1);
	vector<int>p(n);
	for(int i=0;i<n;i++) cin>>p[i];
	for(int i=0;i<n;i++){
		int w; cin>>w;
		g[p[i]].push_back(w);
	}
	vector<int>ans(n+1);
	for(int i=1;i<=n;i++){
		sort(g[i].begin(),g[i].end());
		int siz=g[i].size();
		vector<int>pre(siz+1);
		for(int j=0;j<siz;j++) pre[j+1]=pre[j]+g[i][j];
		for(int j=1;j<=siz;j++){
			ans[j]+=pre[siz]-pre[siz%j];
		}
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n]; 
}

1515C

void problem_solver() {
	int n,m,x; cin>>n>>m>>x;
	vector<int>ans(n);
	set<pii>s;
	for(int i=0;i<m;i++) s.insert({0,i});
	for(int i=0;i<n;i++){
		int h; cin>>h;
		auto[H,id]=*s.begin();
		s.erase(s.begin());
		s.insert({H+h,id});
		ans[i]=id+1;
	} 
	cout<<"YES"<<'\n';
	for(auto i:ans) cout<<i<<" "; cout<<'\n';
}

1500~1799

1000C

void problem_solver() {
	int n; cin>>n;
	vector<int>l(n),r(n),lsh;
	for(int i=0;i<n;i++) cin>>l[i]>>r[i],r[i]++,lsh.push_back(l[i]),lsh.push_back(r[i]);
	sort(lsh.begin(),lsh.end());
	lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
	auto id=[&](int x){
		return lower_bound(lsh.begin(),lsh.end(),x)-lsh.begin()+1;	
	};
	int siz=lsh.size();
	vector<int>ans(n+1),d(siz+2);
	for(int i=0;i<n;i++){
		int L=id(l[i]),R=id(r[i]);
		d[L]++,d[R]--;
	}
	lsh.push_back(lsh[siz-1]+1);
	for(int i=1,now=0;i<=siz;i++){
		now+=d[i];
		ans[now]+=lsh[i]-lsh[i-1];
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n];
}

1416A

void problem_solver() {
	int n; cin>>n;
	vector<int>mx(n+1,-1),ls(n+1,-1);
	for(int i=0;i<n;i++){
		int x; cin>>x;
		mx[x]=max(mx[x],i-ls[x]);
		ls[x]=i;
	}
	for(int i=1;i<=n;i++) mx[i]=max(mx[i],n-ls[i]);
	vector<int>ans(n+2,INF);
	for(int i=1;i<=n;i++) if(mx[i]!=-1) ans[mx[i]]=min(ans[mx[i]],i);
	int res=INF;
	for(int i=1;i<=n;i++){
		res=min(res,ans[i]);
		if(res==INF) cout<<-1<<" "; 
		else cout<<res<<" ";
	}
	cout<<'\n';
}

1579E2

struct BIT{
	int n;
	vector<int>a;
	BIT(int n):n(n),a(n+1){}
	void add(int x,int val){
		for(int i=x;i<=n;i+=lowbit(i)) a[i]+=val;
	}
	int sum(int x){
		int ans=0;
		for(int i=x;i>0;i-=lowbit(i)) ans+=a[i];
		return ans;
	}
	int rangeSum(int l,int r){
		return sum(r)-sum(l-1);
	}
};
void problem_solver() {
	int n; cin>>n; 
	vector<int>a(n),lsh;
	for(int i=0;i<n;i++) cin>>a[i],lsh.push_back(a[i]);
	sort(lsh.begin(),lsh.end());
	lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
	int siz=lsh.size();
	BIT bit(siz);
	int ans=0;
	for(int i=0;i<n;i++){
		int p=lower_bound(lsh.begin(),lsh.end(),a[i])-lsh.begin()+1;
		int l=bit.rangeSum(1,p-1),r=bit.rangeSum(p+1,siz);
		ans+=min(l,r); 
		bit.add(p,1);
	}
	cout<<ans<<'\n';
}

1800~2099

557C

void problem_solver() {
	int n; cin>>n; 
	vector<int>l(n),d(n);
	vector<int>cnt(201);
	vector<vector<int>>g(100001);
	for(int&i:l) cin>>i; for(int&i:d) cin>>i;
	vector<int>suf(100002);
	for(int i=0;i<n;i++) suf[l[i]]+=d[i],g[l[i]].push_back(d[i]);
	for(int i=100000;i>=1;i--) suf[i]+=suf[i+1];
	int ans=INF;
	for(int i=1,tot=0;i<=100000;i++){
		int num=g[i].size(),res=suf[i+1];;
		tot+=num;
		int del;
		if(tot/2+1<=num) del=0;
		else del=tot-num*2+1;
		for(int j=1,add=0;j<=200;j++){
			if(add+cnt[j]<=del){
				add+=cnt[j],res+=cnt[j]*j;
			}
			else{
				res+=(del-add)*j;
				break;
			}
		}
		ans=min(ans,res);
		for(auto w:g[i]) cnt[w]++;
	}
	cout<<ans<<'\n';
}

577B

void problem_solver() {
	int n,m; cin>>n>>m;
	if(n>=m) cout<<"YES"<<'\n';
	else{
		vector<int>a(n);
		for(int i=0;i<n;i++) cin>>a[i],a[i]%=m;
		vector<int>dp(m);
		dp[0]=1;
		for(int i=0;i<n;i++){
			vector ndp=dp;
			for(int j=0;j<m;j++){
				if(!dp[j]) continue;
				ndp[(j+a[i])%m]++;
			}
			dp=ndp;
		}
		if(dp[0]>1) cout<<"YES"<<'\n';
		else cout<<"NO"<<'\n';
	}
}

749D

void problem_solver() {
	int n; cin>>n;
	vector<pii>a(n);
	for(int i=0;i<n;i++) a[i].se=i;
	vector<int>del(n),l(n);
	vector<vector<int>>g(n);
	for(int i=0;i<n;i++){
		int id,w; cin>>id>>w; id--;
		a[id].fi=w;
		g[id].push_back(w);
	}
	sort(a.begin(),a.end());
	int q; cin>>q;
	while(q--){
		int k; cin>>k;
		for(int i=0;i<k;i++) cin>>l[i],l[i]--,del[l[i]]=1;
		int p1=-1,p2=-1;
		for(int i=n-1;i>=0;i--){
			if(del[a[i].se]) continue;
			if(!a[i].fi) break;
			if(p1==-1) p1=a[i].se;
			else if(p2==-1) p2=a[i].se;
			else break;
		}
		if(p1==-1) cout<<"0 0"<<'\n';
		else if(p2==-1) cout<<p1+1<<" "<<*g[p1].begin()<<'\n';
		else cout<<p1+1<<" "<<*lower_bound(g[p1].begin(),g[p1].end(),g[p2].back())<<'\n';
		for(int i=0;i<k;i++) del[l[i]]=0;
	}
}

2100~2399

1370C

void problem_solver() {
	int n; cin>>n;
	string s,t; cin>>s>>t;
	if(count(s.begin(),s.end(),'0')!=count(t.begin(),t.end(),'0')) return void(cout<<-1<<'\n'); 
	int ans=0;
	for(int i=0,now=0,ma=0,mi=0;i<n;i++){
		if(s[i]!=t[i]){
			if(s[i]=='0') now++;
			else now--;
		}
		ma=max(ma,now),mi=min(mi,now);
		ans=max(ans,ma-mi);
	}
	cout<<ans<<'\n';
}

343D (2100)

struct SGT{
	#define mid ((l+r)>>1)
	#define ls(x) (x<<1)
	#define rs(x) (x<<1|1)
	int n;
	vector<int>w,tag;
	SGT(int n):n(n),w(n*4),tag(n*4,-1){}
	void pushdown(int u){
		if(tag[u]!=-1){
			tag[ls(u)]=tag[rs(u)]=tag[u];
			w[ls(u)]=w[rs(u)]=tag[u];
			tag[u]=-1;
		}
	}
	void update(int u,int l,int r,int ql,int qr,int val){
		if(ql<=l&&r<=qr){
			tag[u]=val,w[u]=val;
			return;
		}
		pushdown(u);
		if(ql<=mid) update(ls(u),l,mid,ql,qr,val);
		if(qr>mid) update(rs(u),mid+1,r,ql,qr,val);
	}
	int query(int u,int l,int r,int p){
		if(l==r) return w[u];
		pushdown(u);
		if(p<=mid) return query(ls(u),l,mid,p);
		else  return query(rs(u),mid+1,r,p);
	}
	void update(int l,int r,int val){update(1,1,n,l,r,val);}
	int query(int p){return query(1,1,n,p);}
};
void problem_solver() 
{	
	int n; cin>>n;
	SGT sgt(n);
	vector<vector<int>>e(n+1);
	for(int i=1;i<n;i++){
		int u,v; cin>>u>>v;
		e[u].push_back(v),e[v].push_back(u);
	}
	vector<int>dep,son,sz,f,top,dfn;
	int tim=0;
	dep=son=sz=f=top=dfn=vector<int>(n+1);
	function<void(int,int)>dfs1=[&](int u,int fa){
		sz[u]=1,f[u]=fa,dep[u]=dep[fa]+1;
		for(auto v:e[u]){
			if(v==fa) continue;
			dfs1(v,u);
			sz[u]+=sz[v];
			if(sz[son[u]]<sz[v]) son[u]=v;
		}
	};
	function<void(int,int)>dfs2=[&](int u,int topf){
		dfn[u]=++tim,top[u]=topf;
		if(son[u]) dfs2(son[u],topf);
		for(auto v:e[u]){
			if(v==f[u]||v==son[u]) continue;
			dfs2(v,v);
		}
	};
	function<void(int)>add=[&](int x){
		while(x!=0){
			sgt.update(dfn[top[x]],dfn[x],0);
			x=f[top[x]];
		}
	};
	dfs1(1,0); dfs2(1,1);
	int q; cin>>q;
	while(q--){
		int op,u; cin>>op>>u;
		if(op==1) sgt.update(dfn[u],dfn[u]+sz[u]-1,1);
		if(op==2) add(u);
		if(op==3) cout<<sgt.query(dfn[u])<<'\n';
	}
}

620E

struct SGT{
	#define mid ((l+r)>>1)
	#define ls (u<<1)
	#define rs (u<<1|1)
	int n;
	vector<int>w,sum;
	SGT(int n):n(n),w(4*n),sum(n*4){}
	void pushdown(int u){
		if(w[u]) w[ls]=w[rs]=sum[ls]=sum[rs]=w[u],w[u]=0;
	}
	void pushup(int u){
		sum[u]=sum[ls]|sum[rs];
	}
	void update(int u,int l,int r,int ql,int qr,int val){
		if(ql<=l&&r<=qr){
			w[u]=sum[u]=val;
			return;
		}
		pushdown(u);
		if(ql<=mid) update(ls,l,mid,ql,qr,val);
		if(qr>mid) update(rs,mid+1,r,ql,qr,val);
		pushup(u);
	}
	int query(int u,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return sum[u];
		pushdown(u);
		int ans=0;
		if(ql<=mid) ans|=query(ls,l,mid,ql,qr);
		if(qr>mid) ans|=query(rs,mid+1,r,ql,qr);
		return ans;
	}	
	void update(int l,int r,int val){update(1,1,n,l,r,val);}
	int query(int l,int r){return query(1,1,n,l,r);}
};
void problem_solver() 
{
	int n,q; cin>>n>>q;
	vector<vector<int>>g(n+1);
	vector<int>a(n+1);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<n;i++){
		int u,v; cin>>u>>v;
		g[u].push_back(v),g[v].push_back(u);
	}
	vector<int>dfn(n+1),sz(n+1,1); int tim=0;
	function<void(int)>dfs=[&](int u){
		dfn[u]=++tim;
		for(auto v:g[u]){
			if(dfn[v]) continue;
			dfs(v);
			sz[u]+=sz[v];
		}
	};
	dfs(1);
	SGT sgt(n);
	for(int i=1;i<=n;i++) sgt.update(dfn[i],dfn[i],(1ll<<a[i]));
	while(q--){
		int op,u,x; cin>>op>>u;
		if(op==1) cin>>x,sgt.update(dfn[u],dfn[u]+sz[u]-1,(1ll<<x));
		else{
			int ans=sgt.query(dfn[u],dfn[u]+sz[u]-1);
			int cnt=0;
			while(ans) ans-=lowbit(ans),cnt++;
			cout<<cnt<<'\n';
		}
	}
}

438D

struct SGT{
	#define mid ((l+r)>>1)
	#define ls(x) (x<<1)
	#define rs(x) (x<<1|1)
	int n;
	vector<int>w,mx;
	SGT(int n):n(n),w(n*4),mx(n*4){}
	void pushup(int u){
		w[u]=w[ls(u)]+w[rs(u)];
		mx[u]=max(mx[ls(u)],mx[rs(u)]);
	}
	void build(int u,int l,int r){
		if(l==r){
			cin>>w[u]; mx[u]=w[u];
			return;
		}
		build(ls(u),l,mid),build(rs(u),mid+1,r);
		pushup(u);
	}
	void update(int u,int l,int r,int p,int val){
		if(l==r){
			w[u]=mx[u]=val;
			return;
		}
		if(p<=mid) update(ls(u),l,mid,p,val);
		else update(rs(u),mid+1,r,p,val);
		pushup(u);
	}
	void updateMod(int u,int l,int r,int ql,int qr,int c){
		if(mx[u]<c) return;
		if(l==r){
			w[u]%=c,mx[u]%=c;
			return;
		}
		if(ql<=mid) updateMod(ls(u),l,mid,ql,qr,c);
		if(qr>mid) updateMod(rs(u),mid+1,r,ql,qr,c);
		pushup(u);
	}
	int query(int u,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return w[u];
		int ans=0;
		if(ql<=mid) ans+=query(ls(u),l,mid,ql,qr);
		if(qr>mid) ans+=query(rs(u),mid+1,r,ql,qr);
		return ans;
	}
	void build(){build(1,1,n);}
	void updateMod(int l,int r,int c){updateMod(1,1,n,l,r,c);}
	void update(int p,int x){update(1,1,n,p,x);}
	int query(int l,int r){return query(1,1,n,l,r);}
};
void problem_solver() 
{
	int n,m; cin>>n>>m;
	SGT sgt(n);
	sgt.build();
	while(m--){
		int op,x,y,z; cin>>op>>x>>y;
		if(op==1) cout<<sgt.query(x,y)<<'\n';
		if(op==2) cin>>z,sgt.updateMod(x,y,z);
		if(op==3) sgt.update(x,y);
	}
}

915E

struct SGT{
	#define mid ((l+r)>>1)
	int n,use=0,root=0;
	vector<int>w,tag,ls,rs;
	SGT(int n):n(n),w(N),tag(N,-1),ls(N),rs(N){}
	void pushup(int u){
		w[u]=w[ls[u]]+w[rs[u]];
	}
	void pushdown(int u,int l,int r){
		if(tag[u]!=-1){
			if(!ls[u]) ls[u]=++use;
			if(!rs[u]) rs[u]=++use;
			tag[ls[u]]=tag[rs[u]]=tag[u];
			w[ls[u]]=tag[u]*(mid-l+1),w[rs[u]]=(r-mid)*tag[u];
			tag[u]=-1;
		}
	}
	void update(int &u,int l,int r,int ql,int qr,int val){
		if(!u) u=++use;
		if(ql<=l&&r<=qr){
			tag[u]=val,w[u]=(r-l+1)*val;
			return;
		}
		pushdown(u,l,r);
		if(ql<=mid) update(ls[u],l,mid,ql,qr,val);
		if(qr>mid) update(rs[u],mid+1,r,ql,qr,val);
		pushup(u);
	}
	void update(int l,int r,int val){update(root,1,n,l,r,val);}
};
void problem_solver() 
{
	int n; cin>>n;
	SGT sgt(n);
	int q; cin>>q;
	while(q--){
		int l,r,op; cin>>l>>r>>op;
		if(op==1) sgt.update(l,r,1);
		else sgt.update(l,r,0);
		cout<<n-sgt.w[1]<<'\n';
	}
}

2400~2699

1638E

struct BIT{
	const int n;
	vector<int>c1,c2;
	BIT(int n):n(n),c1(n+1),c2(n+1){}
	void add(int x,int val){
		for(int i=x;i<=n;i+=i&(-i)){
			c1[i]+=val,c2[i]+=(x-1)*val;
		} 
	}
	void rangeAdd(int l,int r,int val){
		add(l,val),add(r+1,-val);
	}
	int sum(int x){
		int ans=0;
		for(int i=x;i>0;i-=i&(-i)){
			ans+=x*c1[i]-c2[i];
		}
		return ans;
	}
	int rangeSum(int l,int r){
		return sum(r)-sum(l-1);
	}
};
struct ODT{
	const int n;
	map<int,int>mp,w;
	BIT bit;
	ODT(int n):n(n),bit(n){mp[0]=1;}
	void split(int x){
		auto it=prev(mp.upper_bound(x));
		mp[x]=it->second;
	}
	void assign(int l,int r,int val){
		split(l),split(r);
		auto it=mp.find(l);
		while(it->first!=r){
			it=mp.erase(it);
		}
		mp[l]=val;
	}
	void update(int l,int r,int c){
		split(l),split(r);
		auto it=mp.find(l);
		while(it->first!=r){
			bit.rangeAdd(it->first,next(it)->first-1,w[it->second]-w[c]);
			it=next(it);
		}
	}
	void add(int c,int val){
		w[c]+=val;
	}
	int query(int x){
		split(x);
		return bit.rangeSum(x,x)+w[mp[x]];
	}
};
void problem_solver() {
	int n,q; cin>>n>>q;
	ODT odt(n);
	while(q--){
		string op; int x,y,z; cin>>op>>x;
		if(op=="Color"){
			cin>>y>>z;
			odt.update(x,y+1,z);
			odt.assign(x,y+1,z);
		}
		if(op=="Add"){
			cin>>y;
			odt.add(x,y);
		}
		if(op=="Query"){
			cout<<odt.query(x)<<'\n';
		}
	}
}

2700~2999

1621F

void problem_solver() 
{
	int n,a,b,c; cin>>n>>a>>b>>c;
	string s; cin>>s;
	int cnt[2]={0,0};
	for(int i=1;i<n;i++){
		if(s[i]==s[i-1]) cnt[s[i]-'0']++;
	}
	vector<int>B;
	for(int i=0;i<n;){
		int j=i;
		while(j<n&&s[i]==s[j]) j++;
		if(s[i]=='0'&&j!=n&&i!=0) B.push_back(j-i);
		i=j; 
	}
	sort(B.begin(),B.end());
	int add=B.size();
	vector<int>nd1(add+1);
	for(int i=0;i<add;i++) nd1[i+1]=nd1[i]+B[i];
	int cnt0=count(s.begin(),s.end(),'0');
	int ans=0;
	for(int u2=0;u2<=cnt[1]+add;u2++){
		if(cnt0>=u2){//奇==偶
			int u3=max({0ll,u2-cnt[0],u2-cnt[1]});
			if(u2>=nd1[max(0ll,u2-cnt[1])])
				ans=max(ans,(u2-u3)*a+u2*b-u3*c);
		}
		if(cnt0>=u2+1){//奇-偶-奇
			int u3=max({0ll,u2-cnt[0]+1,u2-cnt[1]});
			if(u2>=nd1[max(0ll,u2-cnt[1])])
				ans=max(ans,(u2-u3+1)*a+u2*b-u3*c);
		}
		if(cnt>0&&cnt0>=u2-1){//偶-奇-偶
			int u3=max({0ll,u2-cnt[0]-1,u2-cnt[1]});
			if(u2>=nd1[max(0ll,u2-cnt[1])])
				ans=max(ans,(u2-u3-1)*a+u2*b-u3*c);
		}
	}
	cout<<ans<<'\n';
}

over 3000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值