[tyvj 1451] 网站计划 {传参线段树}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/88076065

题目

http://www.joyoi.cn/problem/tyvj-1451


解题思路

线段树模板题目。

注意取模时,每一个单项式都要取模。
还有要加上快速读入。


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define rr register 
using namespace std; 
const int N=200010; 
struct node{
	int x,y,z,u; 
}a[N<<2];
int n,m,v[N],ans,made; 
int read(){
	int p=0; char c=getchar(); 
	while (!isdigit(c)) c=getchar(); 
	while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar(); 
	return p; 
}
void maketree(int x,int y,int k){
	a[k].x=x,a[k].y=y; 
	if (x==y) {a[k].z=v[x]; a[k].u=x; return; }
	int mid=(x+y)/2; 
	maketree(x,mid,k*2),maketree(mid+1,y,k*2+1); 
	if (a[k*2].z>a[k*2+1].z) a[k].z=a[k*2].z,a[k].u=a[k*2].u; 
	else a[k].z=a[k*2+1].z,a[k].u=a[k*2+1].u; 
}
void found(int x,int y,int k,int g){
	if (x==y) {a[k].z=0;return;}
	int mid=(x+y)/2; 
	if (g<=mid) found(x,mid,k*2,g); else found(mid+1,y,k*2+1,g); 
	if (a[k*2].z>a[k*2+1].z) a[k].z=a[k*2].z,a[k].u=a[k*2].u; 
	else a[k].z=a[k*2+1].z,a[k].u=a[k*2+1].u; 
}
int ask(int x,int y,int k,int xx,int yy){
	if (x==xx&&y==yy){made=a[k].u; return a[k].z;}
	int mid=(x+y)/2; 
	if (yy<=mid) return ask(x,mid,k*2,xx,yy); else 
	if (xx>mid) return ask(mid+1,y,k*2+1,xx,yy); else
	{
		int q=ask(x,mid,k*2,xx,mid);
		int qq=made;  
		int w=ask(mid+1,y,k*2+1,mid+1,yy);
		int ww=made; 
		if (q>w){
			made=qq; 
			return q;
		} else {
			made=ww; 
			return w; 
		}
	}
}
int main()
{
	n=read(),m=read(); 
	for (rr int i=1;i<=n;i++) 
	  v[i]=read(); 
	maketree(1,n,1); 
	int x,y; 
	for (rr int i=1;i<=m;i++){
	 x=read(),y=read(); 
	 ans=(ans+ask(1,n,1,x,y)%2011*(x+y)%2011)%2011; 
	 found(1,n,1,made); 
	}
	printf("%d",ans); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/88076065