一串见鬼的代码
  • 板块学术版
  • 楼主君玘
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/10/14 20:51
  • 上次更新2023/11/5 10:46:00
查看原帖
一串见鬼的代码
209944
君玘楼主2020/10/14 20:51
#include<bits/stdc++.h>
#define gc ch=getchar()
#define pt puts("")
#define pc putchar(32)
using namespace std;
template <class T>void read(T &s){
	s=0;T f=1;char gc;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;gc;}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';gc;}
	s*=f;	
}
template <class T>void put(T s){
	if(s<0) putchar('-'),s=-s;
	if(s>9) put(s/10);
	putchar(s%10+'0');
}
struct segtree{
	long long num,add,mul;
}t[400005];
int n,m;
long long a[100005],M;
inline void build(int l,int r,int p){
	t[p].add=0,t[p].mul=1;
	if(l==r){t[p].num=a[l]%M;return;}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
inline void pushdown(int l,int r,int p){
	int mid=(l+r)/2;
	t[p*2].num=(t[p*2].num*t[p].mul+(mid-l+1)*t[p].add)%M;
	t[p*2+1].num=(t[p*2+1].num*t[p].mul+(r-mid)*t[p].add)%M;
	
	t[p*2].mul=(t[p*2].mul*t[p].mul)%M;
	t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%M;
	
	t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%M;
	t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%M;
	t[p].mul=1,t[p].add=0;
}
inline void update1(int l,int r,int x,int y,long long k,int p){
	if(x<=l&&r<=y){
		t[p].num=(t[p].num*k)%M;
		t[p].mul=(t[p].mul*k)%M;
		t[p].add=(t[p].add*k)%M;
		return;
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(x<=mid) update1(l,mid,x,y,k,p*2);
	if(y>mid) update1(mid+1,r,x,y,k,p*2+1);
	t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
inline void update2(int l,int r,int x,int y,long long k,int p){
	if(x<=l&&r<=y){
		t[p].num=(t[p].num+(r-l+1)*k)%M;
		t[p].add=(t[p].add+k)%M;
		return;
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(x<=mid) update2(l,mid,x,y,k,p*2);
	if(y>mid) update2(mid+1,r,x,y,k,p*2+1);
	t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
long long ask(int l,int r,int x,int y,int p){
	if(x<=l&&r<=y) return t[p].num%M;
	pushdown(l,r,p);
	int mid=(l+r)/2;
	long long sum=0;
	if(x<=mid) sum+=ask(l,mid,x,y,p*2);
	if(y>mid) sum+=ask(mid+1,r,x,y,p*2+1);
	return sum%M;
}
int main(){
	read(n),read(m),read(M);
	for(int i=1;i<=n;++i) read(a[i]);
	build(1,n,1);
	
	/*
	printf("%d %d\n",t[8].num,t[9].num);
	printf("%d\n",t[8].num),printf("%d\n",t[9].num); 
	put(t[8].num),pc,put(t[9].num),pc,put(t[5].num),pc,put(t[6].num),pc,put(t[7].num),pt;
	就是这串毒瘤代码*/
	
	int op,x,y;
	long long k;
	for(int i=1;i<=m;++i){
		read(op),read(x),read(y);
		if(op==3) put(ask(1,n,x,y,1)),pt;
		else if(op==1) read(k),update1(1,n,x,y,k,1);
		else read(k),update2(1,n,x,y,k,1);
	}
}

那串毒瘤代码的输出是这样的:

10
1
5
15

而原本t[8]存的就是1,t[9]存的就是5,但是那个printf将两个一起输出却变成了1 0,分开输就是对的。搞不懂为什么。

2020/10/14 20:51
加载中...