版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 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);
}