奇怪的WA
查看原帖
奇怪的WA
631713
Amano_Hina楼主2022/3/14 00:12

rt:上面的是我的代码,下面是老师的代码,蒟蒻实在看不出有什么区别

MY:

#include <bits/stdc++.h>
#define MAX 1000005
using namespace std;
long long int gcd(int a,int b)
{
	 return b ? gcd(b,a%b) : a;
}
int a[MAX*4];
struct a
{
	int l,r,kind;
	bool ye;
} tree[MAX*4];
void build(int n,int l,int r)
{
	int mid=(l+r)/2;
	tree[n].l=l;tree[n].r=r;
	if(l==r)
	{
		tree[n].ye=true;
		tree[n].kind=a[l];
		return;
	}else{
		build(n*2,l,mid);
		build(n*2+1,mid+1,r);
		tree[r].kind=tree[r*2].kind+tree[r*2+1].kind;
	}
}
void add(int x,int k,int now)
{
	int mid=(tree[now].l+tree[now].r)/2;
	if(tree[now].l==tree[now].r)
	{
		tree[x].kind+=k;
		return;
	}else{
		if(x>mid) add(x,k,now*2+1);else
		 add(x,k,now*2);
		tree[now].kind=tree[now*2].kind+tree[now*2+1].kind;
	}
}
long long int find(int l,int r,int n)
{
	int mid=(tree[n].l+tree[n].r)/2;
	if(tree[n].l==l&&tree[n].r==r)
	{
		return tree[n].kind;
	}
	if( l > mid ) return find( l , r , n * 2 + 1 ); 
	else if( mid >= r ) return find( l , r , n * 2 ); 
	return find( l , mid , n * 2 ) + find( mid + 1 , r , n * 2 + 1 ); 
}
int main()
{
	int n;
	cin>>n;
	int x;
	cin>>x;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=x;i++)
	{
		int a;
		cin>>a;
		if(a==1)
		{
			int x,k;
			cin>>x>>k;
			add(x,k,1);
		}else{
			int x,y;
			cin>>x>>y;
			cout<<find(x,y,1)<<endl;
		}
	}
	return 0;
}

TEACHER:

#include <iostream>
#include <stdio.h>
#define MAXN 500010

using namespace std;

int a[ MAXN ];

struct Node
{
	int sum , l , r;
} segtree[ MAXN * 4 ];

void build( int x , int l , int r ) 
{
	segtree[x].l = l , segtree[x].r = r; 
	if( l == r ) segtree[x].sum = a[l]; 
	else
	{
		int mid = ( l + r ) / 2;
		build( x * 2 , l , mid );
		build( x * 2 + 1 , mid + 1 , r );
		segtree[x].sum = segtree[x * 2].sum + segtree[x * 2 + 1].sum;
	}
}

void update( int x , int y , int cur )
{
	if( segtree[ cur ].l == segtree[ cur ].r )
	{
		segtree[ cur ].sum += y;
		return;
	}
	else
	{
		int mid = ( segtree[ cur ].l + segtree[ cur ].r ) / 2; 
		if( x > mid ) update( x , y , cur * 2 + 1 );
		else update( x , y , cur * 2 ); 
		segtree[ cur ].sum = segtree[ cur * 2 ].sum + segtree[ cur * 2 + 1 ].sum;  
	}
}

int find( int l , int r , int cur )
{
	if( l == segtree[ cur ].l && r == segtree[ cur ].r ) return segtree[ cur ].sum;
	int mid = ( segtree[ cur ].l + segtree[ cur ].r ) / 2;
	if( l > mid ) return find( l , r , cur * 2 + 1 );
	else if( mid >= r ) return find( l , r , cur * 2 ); 
	return find( l , mid , cur * 2 ) + find( mid + 1 , r , cur * 2 + 1 );
}

int main()
{
	int n , m;
	cin >> n >> m;
	for( int i = 1 ; i <= n ; i++ ) cin >> a[i];
	build( 1 , 1 , n );
	for( int i = 1 ; i <= m ; i++ )
	{
		int opt , a , b;
		cin >> opt >> a >> b;
		if( opt == 1 ) update( a , b , 1 );
		else cout << find( a , b , 1 ) << endl;
	}
	return 0;
}
2022/3/14 00:12
加载中...