第二分块51分
查看原帖
第二分块51分
264463
添哥楼主2022/5/23 20:02

WA on #1~4 and #11~13

#include<bits/stdc++.h>
using namespace std;
int n,m,t,len;
int a[1000005],pos[1000005],uf[1000005];
int rt[100005],size[100005];
int q[500005][5],ans[500005];
int l[1255],r[1255],Max[1255],lazy[1255];
inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
		{
			w=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		s=(s<<3)+(s<<1)+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void print(int x)
{
	if(x==0)
	{
		return;
	}
	print(x/10);
	putchar((char)((x%10)+(int)'0'));
}
int uf_ask(int x)
{
	if(uf[x]==x)
	{
		return x;
	}
	else
	{
		uf[x]=uf_ask(uf[x]);
		return uf[x];
	}
}
int main()
{
    //cin>>n>>m;
    n=read(),m=read();
    for(int i=1;i<=n;++i)
    {
        //cin>>a[i];
        a[i]=read();
    }
    for(int i=1;i<=m;++i)
    {
    	q[i][1]=read();
    	q[i][2]=read();
    	q[i][3]=read();
    	q[i][4]=read();
	}
    len=800;
    t=n/len;
    if(n%len!=0)
    {
        t++;
    }
    for(int i=1;i<=t;++i)
    {
        l[i]=(i-1)*len+1;
        r[i]=i*len;
    }
    if(r[t]>n)
    {
        r[t]=n;
    }
    for(int i=1;i<=t;++i)
    {
    	Max[i]=-1;
//    	for(int j=0;j<=100001;++j)
//    	{
//    		size[j]=0;
//    		rt[j]=0;
//		}
		memset(rt,0,sizeof(rt));
		memset(size,0,sizeof(size));
    	for(int j=l[i];j<=r[i];++j)
    	{
    		Max[i]=max(Max[i],a[j]);
    		uf[j]=j;
    		size[a[j]]++;
    		if(rt[a[j]])
    		{
    			uf[j]=rt[a[j]];
			}
			else
			{
				rt[a[j]]=j;
			}
		}
    	for(int j=1;j<=m;++j)
    	{
    		if(q[j][2]>r[i]||q[j][3]<l[i])
    		{
    			continue;
			}
			if(q[j][4]>Max[i]+lazy[i])
			{
				continue;
			}
    		if(q[j][1]==1)
    		{
    			if(q[j][2]<=l[i]&&r[i]<=q[j][3])
    			{
    				if((Max[i]+lazy[i])/2<q[j][4])
    				{
    					for(int k=q[j][4]+1-lazy[i];k<=Max[i];++k)
    					{
    						if(rt[k]==0)
    						{
    							continue;
							}
    						if(rt[k-q[j][4]]==0)
    						{
    							rt[k-q[j][4]]=rt[k];
    							a[rt[k]]-=q[j][4];
    							rt[k]=0;
    							size[k-q[j][4]]=size[k];
    							size[k]=0;
							}
							else
							{
								uf[rt[k]]=rt[k-q[j][4]];
								rt[k]=0;
    							size[k-q[j][4]]+=size[k];
    							size[k]=0;
							}
						}
    					Max[i]=q[j][4]-lazy[i];
					}
					else
					{
						for(int k=1-lazy[i];k<=q[j][4]-lazy[i];++k)
						{
							if(rt[k]==0)
    						{
    							continue;
							}
							if(rt[k+q[j][4]]==0)
    						{
    							rt[k+q[j][4]]=rt[k];
    							a[rt[k]]=k+q[j][4];
    							rt[k]=0;
    							size[k+q[j][4]]+=size[k];
    							size[k]=0;
							}
							else
							{
								uf[rt[k]]=rt[k+q[j][4]];
								rt[k]=0;
    							size[k+q[j][4]]+=size[k];
    							size[k]=0;
							}
						}
    					lazy[i]-=q[j][4];
					}
				}
				else
				{
					for(int k=l[i];k<=r[i];++k)
					{
						int w=a[uf_ask(k)];
						a[k]=w+lazy[i];
			    		size[w]=0;
			    		rt[w]=0;
					}
					for(int k=max(l[i],q[j][2]);k<=min(r[i],q[j][3]);++k)
					{
						if(a[k]>q[j][4])
						{
							a[k]-=q[j][4];
						}
					}
					Max[i]=-1;
					lazy[i]=0;
			    	//memset(rt,0,sizeof(rt));
			    	//memset(size,0,sizeof(size));
			    	for(int k=l[i];k<=r[i];++k)
			    	{
			    		Max[i]=max(Max[i],a[k]);
			    		uf[k]=k;
			    		size[a[k]]++;
			    		if(rt[a[k]])
			    		{
			    			uf[k]=rt[a[k]];
						}
						else
						{
							rt[a[k]]=k;
						}
					}
				}
			}
			else
			{
				if(q[j][4]-lazy[i]>100001)
				{
					continue;
				}
				//cout<<i<<' '<<j<<' '<<ans[j]<<' ';
				if(q[j][2]<=l[i]&&r[i]<=q[j][3])
    			{
    				ans[j]+=size[q[j][4]-lazy[i]];
				}
				else
				{
					for(int k=max(l[i],q[j][2]);k<=min(r[i],q[j][3]);++k)
					{
						if(a[uf_ask(k)]+lazy[i]==q[j][4])
						{
							++ans[j];
						}
					}
				}
				//cout<<ans[j]<<endl;
			}
		}
	}
	for(int i=1;i<=m;++i)
	{
		if(q[i][1]==2)
		{
			if(!ans[i])
			{
				putchar('0');
			}
			else
			{
				print(ans[i]);
			}
			putchar('\n');
		} 
	}
}

调了一周多了/kk

2022/5/23 20:02
加载中...