分块0pts求调
  • 板块P2184 贪婪大陆
  • 楼主wmrqwqal & su
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/28 15:16
  • 上次更新2023/10/28 15:19:21
查看原帖
分块0pts求调
820056
wmrqwqal & su楼主2023/10/28 15:16
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100010],b[100010],l[100010],r[100010],tag[100010],maxn[100010],sq,x,y,z;
void upt(long long id)
{
	long long ma=0;
	for(int i=l[id];i<=r[id];i++)
		ma=max(ma,a[i]+tag[b[i]]);
	maxn[id]=ma;
}
void add(long long x,long long y)
{
	if(b[x]==b[y])
	{
		for(int i=x;i<=y;i++)
			a[i]++;
		upt(b[x]);
		return ;
	}
	for(int i=x;i<=r[b[x]];i++)
		a[i]++;
	upt(b[x]);
	for(int i=l[b[y]];i<=y;i++)
		a[i]++;
	upt(b[y]);
	for(int i=b[x]+1;i<=b[y]-1;i++)
		tag[i]++,maxn[i]++;
}
void query(long long x,long long y)
{
	long long ma=0;
	if(b[x]==b[y])
	{
		for(int i=x;i<=y;i++)
			ma=max(ma,a[i]+tag[b[i]]);
		cout<<ma<<endl;
		return ;
	}
	for(int i=x;i<=r[b[x]];i++)
		ma=max(ma,a[i]+tag[b[i]]);
	for(int i=l[b[y]];i<=y;i++)
		ma=max(ma,a[i]+tag[b[i]]);
	for(int i=b[x]+1;i<=b[y]-1;i++)
		ma=max(ma,maxn[i]);
	cout<<ma<<endl;
}
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n>>m;
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		l[i]=r[i-1]+1;
		r[i]=min(sq*i,n);
		for(int j=l[i];j<=r[i];j++)
			b[j]=i;
	}
	while(m--)
	{
		cin>>x>>y>>z;
		if(x==1)
			add(y,z);
		else
			query(y,z);
	}
	QwQ;
}

2023/10/28 15:16
加载中...