【求调】刚刚Div.3 C RE #Subtask1四个点,95Pts
  • 板块学术版
  • 楼主Sincerin
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/22 17:34
  • 上次更新2024/9/22 19:42:18
查看原帖
【求调】刚刚Div.3 C RE #Subtask1四个点,95Pts
749325
Sincerin楼主2024/9/22 17:34

维护询问编号模 kk 的余数棵线段树,但是 q=1q=1 时炸了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std; 
#define ri register int
#define rd(n) n=read()
inline int read(void)
{
	register int res=0,f=0;
	register char c=getchar();
	while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
	return f?-res:res;
}
inline void fprint(int n)
{
	if(n<0){putchar('-');n=-n;}
	if(n>9) fprint(n/10);
	putchar(n%10+'0');
}
inline void print(int n)
{
	fprint(n);
	putchar(' ');
}
const int N=200005;
int n,m,k,q,x,y,z,ans,res,mp[505][505],p[200005];
bool a[200005];
char s[505],c[505][505],op[5];
const int K=21;
int v[N],cnt;
#define lson(p) p<<1
#define rson(p) p<<1|1 
struct SegmentTree{
	struct Tree{
		int l,r,dat,tag;
		#define l(p) t[p].l
		#define r(p) t[p].r
		#define dat(p) t[p].dat
		#define tag(p) t[p].tag
	}t[N<<2];
	inline int len(int p){return r(p)-l(p)+1;}
	inline void pushup(int p){dat(p)=dat(lson(p))+dat(rson(p));}
	void build(int p,int l,int r)
	{
		l(p)=l; r(p)=r; tag(p)=0;
		if(l==r)
		{
			dat(p)=v[l];
			return;
		}
		ri mid=(l+r)>>1;
		build(lson(p),l,mid);
		build(rson(p),mid+1,r);
		pushup(p);
	}
	inline void spread(int p)
	{
		if(l(p)==r(p)) return;
		if(tag(p))
		{
			tag(lson(p))^=1; tag(rson(p))^=1;
			dat(lson(p))=len(lson(p))-dat(lson(p));
			dat(rson(p))=len(rson(p))-dat(rson(p));
			tag(p)=0;
		}
	}
	void change(int p,int l,int r)
	{
		spread(p);
		if(l<=l(p)&&r(p)<=r)
		{
			dat(p)=len(p)-dat(p);
			tag(p)^=1;
			return;
		}
		ri mid=(l(p)+r(p))>>1;
		if(l<=mid) change(lson(p),l,r);
		if(r>mid) change(rson(p),l,r);
		pushup(p);
	}
	int query(int p,int l,int r)
	{
		spread(p);
		if(l<=l(p)&&r(p)<=r) return dat(p);
		int ans=0;
		ri mid=(l(p)+r(p))>>1;
		if(l<=mid) ans+=query(lson(p),l,r);
		if(r>mid) ans+=query(rson(p),l,r);
		return ans;
	}
}T[K];
pair<int,int>w[200005];
signed main(void)
{
	x=1; y=1;
	rd(n); rd(m); rd(q); rd(k);
	for(ri i=1;i<=n;++i)
	{
		scanf("%s",s+1);
		for(ri j=1;j<=m;++j) mp[i][j]=(s[j]=='X');
	}
	for(ri i=1;i<=q;++i)
	{
		scanf("%s",op);
		if(op[0]=='U') 
		{
			a[i]=0;
			p[i]=1;
		}
		if(op[0]=='D') 
		{
			a[i]=1;
			p[i]=1;
		}
		if(op[0]=='L') 
		{
			a[i]=0;
			p[i]=2;
		}
		if(op[0]=='R') 
		{
			a[i]=1;
			p[i]=2;
		}
		rd(w[i].first);
		rd(w[i].second);
	}
	for(ri i=0;i<k;++i)
	{
		cnt=0;
		for(ri j=1;j<=q;++j) 
		{
			if(j%k==i)
				v[++cnt]=a[j];
		} 
		T[i].build(1,1,cnt);
		//cout<<"ss\n"<<i<<' '<<cnt<<"ss\n";
	}
	for(ri i=1;i<=q;++i)
	{
		ri ts=(int)(i/k)+(bool)(i%k);
		//cout<<"ss\n "<<ts<<" ss\n";
		ri tt=T[i%k].query(1,ts,ts);
		if(p[i]==1)
		{
			if(tt==0) x=max(1,x-w[i].first); 
			else x=min(n,x+w[i].first); 
		}
		else
		{
			if(tt==0) y=max(1,y-w[i].first); 
			else y=min(m,y+w[i].first); 
		}
		if(mp[x][y]==1&&w[i].second>0) T[i%k].change(1,ts+1,ts+w[i].second); 
	}
	print(x); print(y);
	return 0;
}













2024/9/22 17:34
加载中...