萌新求助qwq
查看原帖
萌新求助qwq
224229
Caicz楼主2020/9/15 22:07

操作3出了问题,调了一天/kk

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=100005;
const int inf=0x3f3f3f3f;
int n,m,a[maxn],mx,co[maxn];
int ct[205];

inline int read(void)
{
	int num,sign=1;char c;
	while(!isdigit(c=getchar()))if(c=='-')sign=0;num=c-'0';
	while(isdigit(c=getchar()))num=(num<<1)+(num<<3)+c-'0';
	return sign?num:-num;
}

struct anstree
{
	int tr[maxn];
	int mxx[maxn<<2];
	inline void modifysum(int x,int d){for(;x<=n;x+=x&-x)tr[x]+=d;}
	inline int querysum(int x){int res=0;for(;x;x-=x&-x)res+=tr[x];return res;}
	void modifymx(int k,int l,int r,int x,int val)
	{
		if(l==r)return mxx[k]=val,void();
		int mid=(l+r)>>1;
		if(mid>=x)modifymx(k<<1,l,mid,x,val);
		else modifymx(k<<1|1,mid+1,r,x,val);
		mxx[k]=max(mxx[k<<1],mxx[k<<1|1]);
	}
	int querymx(int k,int l,int r,int x,int y)
	{
		if(l>=x&&r<=y)return mxx[k];
		int mid=(l+r)>>1;
		if(mid>=x&&mid>=y)return querymx(k<<1,l,mid,x,y);
		else if(mid<y&&mid<x)return querymx(k<<1|1,mid+1,r,x,y);
		return max(querymx(k<<1,l,mid,x,y),querymx(k<<1|1,mid+1,r,x,y));
	}
}ccz;
struct node
{
	int l,r;
	int val;
	node(int L,int R=-1,int V=0):l(L),r(R),val(V){}
	friend bool operator<(node a,node b){return a.l<b.l;}
};
struct colortree
{
	set<node>s;
	typedef set<node>::iterator IT;
	inline IT split(int x)
	{
		IT it=s.lower_bound(node(x));
		if(it!=s.end()&&it->l==x)return it;
		--it;
		int l=it->l,r=it->r;
		int val=it->val;
		s.erase(it);
		s.insert(node(l,x-1,val));
		return s.insert(node(x,r,val)).first;
	}
	inline void assign(int l,int r,int val)
	{
		IT itr=split(r+1),itl=split(l);
		s.erase(itl,itr);
		s.insert(node(l,r,val));
	}
	inline void querycolor(int l,int r)
	{
		if(r-l+1<mx){printf("-1\n");return;}
		IT itr=split(r+1),itl=split(l);
		IT ll=itl,rr=itl;
		--rr;
		memset(ct,0,sizeof ct);ct[0]=inf;
		int now=0,ans=inf;
		while(rr!=itr)
		{
			while(rr!=itr&&now<mx)
			{
				++rr;
				if(rr==s.end())break;
				if(!ct[rr->val])++now;
				++ct[rr->val];
			}
			if(now<mx)break;
			ans=min(ans,ccz.querysum(rr->l)-ccz.querysum(ll->r-1));
			now-=!(--ct[ll->val]),++ll;
		}
		if(ans==inf)printf("-1\n");
		else printf("%d\n",ans);
	}
	inline void querynum(int l,int r)
	{
		IT itr=split(r+1),itl=split(l);
		memset(ct,0,sizeof ct);	
		IT ll=itl;
		++ct[itl->val];
		int sum=a[itl->r],ans=-1;
		while(itl!=itr)
		{
			ans=max(ans,ccz.querymx(1,1,n,itl->l,itl->r));
			while(ct[itl->val]>=2)--ct[ll->val],sum-=a[ll->r],++ll;
			ans=max(ans,sum);
			if(itl->l!=itl->r){while(ll!=itl)--ct[ll->val],++ll;sum=a[itl->r];}
			++itl,sum+=a[itl->l],++ct[itl->val];
		}
		printf("%d\n",ans);
	}
}chthollyccz;

signed main(void)
{
	n=read(),m=read(),mx=read();
	for(register int i=1;i<=n;++i)ccz.modifysum(i,a[i]=read()),ccz.modifymx(1,1,n,i,a[i]);
	for(register int i=1;i<=n;++i)co[i]=read();
	for(register int j=1,i=1;i<=n;i=j+1,j=i)
	{
		while(co[j]==co[j+1])++j;
		chthollyccz.s.insert(node(i,j,co[j]));
	}
	chthollyccz.s.insert(node(0,0,-1));
	for(register int l,r,opt,i=1;i<=m;++i)
	{
		opt=read(),l=read(),r=read();
		if(opt==1)
			ccz.modifysum(l,r-a[l]),ccz.modifymx(1,1,n,l,r),a[l]=r;
		else if(opt==2)
			chthollyccz.assign(l,r,read());
		else if(opt==3)
			chthollyccz.querycolor(l,r);
		else
			chthollyccz.querynum(l,r);
	}
}

一直是 80pts

2020/9/15 22:07
加载中...