ODT 过样例但是全 WA 求调
查看原帖
ODT 过样例但是全 WA 求调
826774
Little_Fox_Fairy楼主2024/7/11 21:10
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#define int long long
#define endl puts("")
#define ed putchar(' ')
using namespace std;
const int mod=1e9+7;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}
struct node
{
	int l,r;
	mutable int val;
	node (int l,int r=-1,int val=0) : l (l),r (r),val (val) {}
	bool operator <(const node &x) const {return l<x.l;}
};
set<node> s;
struct Chtholly_Tree
{
	inline auto split(int pos)
	{
		auto it=s.lower_bound(node(pos));
		if (it!=s.end() and it->l==pos) return it;
		it--;
		if (it->r<pos) return s.end();
		int l=it->l,r=it->r,val=it->val;
		s.erase(it);
		s.insert(node(l,pos-1,val));
		return s.insert(node(pos,r,val)).first;
	}
	inline void assign(int l,int r,int val)
	{
		auto itr=split(r+1),itl=split(l);
		s.erase(itl,itr);
		s.insert(node(l,r,val));
		return ;
	}
	inline int query(int l,int r)
	{
		auto itr=split(r+1),itl=split(l);
		int ans=0;
		while(itl!=itr)
		{
			ans=(ans+((itl->r)-(itl->l)+1)*(itl->val))%mod;
			itl++;
		}
		return ans;
	}
	inline void add(int l,int r,int val)
	{
		val%=mod;
		auto itr=split(r+1),itl=split(l);
		while (itl!=itr) itl->val+=(itl->r-itl->l+1)*val,itl->val%=mod,itl++;
		return ;
	}
	inline void copy(int l1,int r1,int l2,int r2)
	{
		int w=l2-l1;
		vector<node> e;
		auto itr1=split(r1+1),itl1=split(l1);
		for (auto it=itl1;it!=itr1;it++) e.push_back({it->l+w,it->r+w,it->val});
		auto itr2=split(r2+1),itl2=split(l2);
		s.erase(itl2,itr2);
		for (auto v : e) s.insert(node(v.l,v.r,v.val));
		return ;
	}
	inline void reverse(int l,int r)
	{
		auto itr=split(r+1),itl=split(l);
		auto a=itl,b=itr;
		vector<node> e;
		while (itl!=itr) e.push_back({l+r-(itl->r),l+r-(itl->l),itl->val}),itl++;
		s.erase(a,b);
		for (auto v : e) s.insert(node(v.l,v.r,v.val));
		return ;
	}
	inline void range_swap(int l1,int r1,int l2,int r2)
	{
		if (l1>l2) swap(l1,l2),swap(r1,r2);
		int w=l2-l1;
		vector<node> e1,e2;
		auto itr1=split(r1+1),itl1=split(l1);
		for (auto it=itl1;it!=itr1;it++) e1.push_back({it->l+w,it->r+w,it->val});
		s.erase(itl1,itr1);
		auto itr2=split(r2+1),itl2=split(l2);
		for (auto it=itl2;it!=itr2;it++) e2.push_back({it->l-w,it->r-w,it->val});
		s.erase(itl2,itr2);
		for (auto v : e1) s.insert(node(v.l,v.r,v.val));
		for (auto v : e2) s.insert(node(v.l,v.r,v.val));
		return ;
	}
}tr;

int n,m;
signed main()
{
	read(&n),read(&m);
	for (register int i=1;i<=n;i++)
	{
		int x;
		read(&x),x%=mod;
		s.insert(node(i,i,x));
	}
	s.insert({n+1,n+1,114514});
	while (m--)
	{
		int op,l1,r1,l2,r2,val;
		read(&op),read(&l1),read(&r1);
		if (op==1) write(tr.query(l1,r1)),endl;
		if (op==2) read(&val),val%=mod,tr.assign(l1,r1,val);
		if (op==3) read(&val),val%=mod,tr.add(l1,r1,val);
		if (op==4) read(&l2),read(&r2),tr.copy(l1,r1,l2,r2);
		if (op==5) read(&l2),read(&r2),tr.range_swap(l1,r1,l2,r2);
		if (op==6) tr.reverse(l1,r1);
	}
	auto itr=tr.split(n+1),itl=tr.split(1);
	while (itl!=itr)
	{
		for (register int i=1;i<=(itl->r-itl->l+1);i++)
			write((itl->val)%mod),ed;
		itl++;
	}
	return 0;
}

看了一下,感觉可能是取模取挂了,但是不知道挂在哪儿了。

2024/7/11 21:10
加载中...