萌新求助
  • 板块CF833B The Bakery
  • 楼主Dzhao
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/23 17:12
  • 上次更新2023/11/6 19:35:25
查看原帖
萌新求助
108610
Dzhao楼主2020/8/23 17:12

不知道为为什么样例2过不了,和题解队拍了一下应该是modify函数错了,不知道哪错了,希望大佬帮忙看一下

#include<bits/stdc++.h>
using namespace std;
const int N=35005,M=55;
int n,m,dp[M][N],tr[N<<2],tag[N<<2],pre[N],pos[N];
void build(int p,int l,int r,int k)
{
	if(l==r)
	{
		tr[p]=dp[k][l-1];
//		printf("**%d %d\n",tr[p],dp[k][l-1]);
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid,k);
	build(p<<1|1,mid+1,r,k);
	tr[p]=max(tr[p*2],tr[p*2+1]);
//	printf("%d %d %d\n",tr[p*2],tr[p*2+1],tr[p]);
}
inline void push_down(int p)
{
	tr[p<<1]+=tag[p];
	tr[p<<1|1]+=tag[p];
	tag[p<<1]+=tag[p];
	tag[p<<1|1]+=tag[p];
	tag[p]=0;
}
void modify(int p,int l,int r,int x,int y,int z)
{
	if(l>=x && r<=y) 
	{
		tr[p]+=z;
		tag[p]+=z;
		return;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if(mid>=x) modify(p<<1,l,mid,x,y,z);
	if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
	tr[p]=max(tr[p*2],tr[p*2+1]);
//	printf("%d ",tr[p]);
}
int query(int p,int l,int r,int x,int y) 
{
	if(l>=x && r<=y) return tr[p];
	int mid=(l+r)>>1,res=0;
	push_down(p);
	if(mid>=x) res=max(res,query(p*2,l,mid,x,y));
	if(mid<y) res=max(res,query(p*2+1,mid+1,r,x,y));
//	printf("%d ",res);
	return res;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,x;i<=n;i++) 
	{
		scanf("%d",&x);
		pre[i]=pos[x]+1;
		pos[x]=i;
	}
//	for(int i=1;i<=n;i++) printf("%d ",pre[i]);puts("");
//	for(int i=1;i<=n;i++) printf("%d ",pos[i]);puts("");
	for(int i=1;i<=m;i++)
	{
		memset(tr,0,sizeof(tr));
		build(1,1,n,i-1);
		for(int j=1;j<=n;j++) 
		{
//			puts("IDIDI");
			modify(1,1,n,pre[j],j,1);
//			puts("");
			dp[i][j]=query(1,1,n,1,j);
//			printf("(i,j)=%d\n",dp[i][j]);
		}
	}
	printf("%d\n",dp[m][n]);
	return 0;
}

2020/8/23 17:12
加载中...