玄学错误求助
查看原帖
玄学错误求助
547618
fighterkong楼主2022/3/9 20:55
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,k=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*k;
}
const int MAXN=1e5+20;
struct node
{
	int l,r,val,index,p,ti;
}e[MAXN],e1[MAXN];
int cnt,cnt1,cnt2,tt,buck[MAXN<<1],disperse[MAXN<<1],cntt[MAXN<<1],a[MAXN],ans[MAXN];
inline bool cmp(node s,node s1)
{
	if(s.l/tt==s1.l/tt)
	{
		if(s.r/tt==s1.r/tt) return s.ti<s1.ti;
		else return s.r<s1.r;
	}
	else return s.l<s1.l;
}
inline void del(int x)
{
	--cntt[buck[a[x]]];
	--buck[a[x]];
	++cntt[buck[a[x]]];
}
inline void add(int x)
{
	--cntt[buck[a[x]]];
	++buck[a[x]];
	++cntt[buck[a[x]]];
}
inline void update(int x,int ti)
{
	if(e[x].l<=e1[ti].index&&e1[ti].index<=e[x].r)
	{
		del(a[e1[ti].index]);
		add(e1[ti].val);
	}
	swap(e1[ti].val,a[e1[ti].index]);
}
int main()
{
	int n=read(),m=read();
	tt=pow(n,0.666);
	for(int i=1;i<=n;++i)disperse[++cnt2]=a[i]=read();
	for(int i=1;i<=m;++i)
	{
		int t=read(),t1=read(),t2=read();
		if(t==1)
		{
			e[++cnt].l=t1,e[cnt].r=t2;
			e[cnt].p=cnt;e[cnt].ti=cnt1;
		}
		else e1[++cnt1].index=t1,e1[cnt1].val=t2,disperse[++cnt2]=t2;
	}
	sort(disperse+1,disperse+cnt2+1);
	int tot=unique(disperse+1,disperse+cnt2+1)-disperse-1;
	for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
	for(int i=1;i<=cnt1;++i)e1[i].val=lower_bound(disperse+1,disperse+tot+1,e1[i].val)-disperse;
	sort(e+1,e+cnt+1,cmp);
	int curl=1,curr=0,curt=0;
	for(int i=1;i<=cnt;++i)
	{
		int L=e[i].l,R=e[i].r,T=e[i].ti;
		while(R>curr)add(++curr);
		while(L<curl)add(--curl);
		while(R<curr)del(curr--);
		while(L>curl)del(curl++);
		while(T>curt)update(i,++curt);
		while(T<curt)update(i,curt--);
		for(ans[e[i].p]=1;cntt[ans[e[i].p]];++ans[e[i].p]);
	}
	for(int i=1;i<=cnt;++i)printf("%d\n",ans[i]);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,k=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*k;
}
const int MAXN=1e5+20;
struct node
{
	int l,r,val,index,p,ti;
}e[MAXN],e1[MAXN];
int cnt,cnt1,cnt2,tt,buck[MAXN<<1],disperse[MAXN<<1],cntt[MAXN<<1],a[MAXN],ans[MAXN];
inline bool cmp(node s,node s1)
{
	if(s.l/tt==s1.l/tt)
	{
		if(s.r/tt==s1.r/tt) return s.ti<s1.ti;
		else return s.r<s1.r;
	}
	else return s.l<s1.l;
}
inline void del(int x)
{
	--cntt[buck[x]];
	--buck[x];
	++cntt[buck[x]];
}
inline void add(int x)
{
	--cntt[buck[x]];
	++buck[x];
	++cntt[buck[x]];
}
inline void update(int x,int ti)
{
	if(e[x].l<=e1[ti].index&&e1[ti].index<=e[x].r)
	{
		del(a[e1[ti].index]);
		add(e1[ti].val);
	}
	swap(e1[ti].val,a[e1[ti].index]);
}
int main()
{
	int n=read(),m=read();
	tt=pow(n,0.666);
	for(int i=1;i<=n;++i)disperse[++cnt2]=a[i]=read();
	for(int i=1;i<=m;++i)
	{
		int t=read(),t1=read(),t2=read();
		if(t==1)
		{
			e[++cnt].l=t1,e[cnt].r=t2;
			e[cnt].p=cnt;e[cnt].ti=cnt1;
		}
		else e1[++cnt1].index=t1,e1[cnt1].val=t2,disperse[++cnt2]=t2;
	}
	sort(disperse+1,disperse+cnt2+1);
	int tot=unique(disperse+1,disperse+cnt2+1)-disperse-1;
	for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
	for(int i=1;i<=cnt1;++i)e1[i].val=lower_bound(disperse+1,disperse+tot+1,e1[i].val)-disperse;
	sort(e+1,e+cnt+1,cmp);
	int curl=1,curr=0,curt=0;
	for(int i=1;i<=cnt;++i)
	{
		int L=e[i].l,R=e[i].r,T=e[i].ti;
		while(R>curr)add(a[++curr]);
		while(L<curl)add(a[--curl]);
		while(R<curr)del(a[curr--]);
		while(L>curl)del(a[curl++]);
		while(T>curt)update(i,++curt);
		while(T<curt)update(i,curt--);
		for(ans[e[i].p]=1;cntt[ans[e[i].p]];++ans[e[i].p]);
	}
	for(int i=1;i<=cnt;++i)printf("%d\n",ans[i]);
	return 0;
}

第一份代码a数组写函数里就WA,第二份代码写外面就A了,感觉没啥区别啊

2022/3/9 20:55
加载中...