先给线段树模板的另一题敌兵布阵
题意:老师查询一段区间的学生的成绩最高分,但有时候也会改卷出错,所以需要更改某个人的成绩,所以需要改。
分析:用线段树(线段树另一个模板题)
直接给代码:
//#include<iostream>
//#include<algorithm>
#include<stdio.h>
#define inf 200010
//using namespace std;
int node[inf<<2];
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
void buildtree(int i,int l,int r)
{
if(l==r)
{
scanf("%d",&node[i]);
//cin>>node[i];
return;
}
int m=(l+r)/2;
buildtree(i<<1,l,m);
buildtree(i<<1|1,m+1,r);
node[i]=max(node[i*2],node[i*2+1]);
}
int query(int i,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
return node[i];
}
int ans=0;
int m=(l+r)/2;
if(x<=m) ans=max(query(i<<1,l,m,x,y),ans);
if(y>m) ans=max(query(i<<1|1,m+1,r,x,y),ans);
return ans;
}
void updata(int i,int l,int r,int x,int y)
{
if(l==r)
{
node[i]=y;
return;
}
int m=(l+r)/2;
if(x<=m) updata(i<<1,l,m,x,y);
else updata(i<<1|1,m+1,r,x,y);
node[i]=max(node[i*2],node[i*2+1]);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)) //cin>>n>>m
{
buildtree(1,1,n);
char s;
while(m--)
{
getchar();//问题的所在....没这个还超时....,用c++也超时
//cin>>s;
scanf("%c",&s);
int a,b;
scanf("%d%d",&a,&b);
//printf("%c\n",s);
//cin>>a>>b;
if(s=='Q')
{
printf("%d\n",query(1,1,n,a,b));
//cout<<query(1,1,n,a,b)<<endl;
}
else if(s=='U')
{
updata(1,1,n,a,b);
}
}
}
return 0;
}
给一份c++写的。
加了一个缩小输入输出时间的东西(这东西复杂度给你们看一下):
ios::sync_with_stdio(false);
cin.tie(0);
代码如下:
#include<iostream>
#include<cstdio>//包含getchar()
#include<algorithm>
using namespace std;
int tree[200000*4+1];
void buildtree(int i,int l,int r)
{
if(l==r)
{
cin>>tree[i];
return;
}
int mid=(l+r)/2;
buildtree(i<<1,l,mid);
buildtree(i<<1|1,mid+1,r);
tree[i]=max(tree[i*2],tree[i*2+1]);
}
int query(int i,int l,int r,int a,int b)
{
if(a<=l&&b>n=r)
{
return tree[i];
}
int mid=(l+r)/2;
int ans=0;
if(a<=mid) ans=max(query(i<<1,l,mid,a,b),ans);
if(b>mid) ans=max(query(i<<1|1,mid+1,r,a,b),ans);
return ans;
}
void updata(int i,int l,int r,int a,int b)
{
if(l==r)
{
tree[i]=b;
return;
}
int mid=(l+r)/2;
if(a<=mid) updata(i<<1,l,mid,a,b);
else updata(i<<1|1,mid+1,r,a,b);
tree[i]=max(tree[i*2],tree[i*2+1]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
while(cin>>n>>m)
{
buildtree(1,1,n);
while(m--)
{
char c;
int a,b;
cin>>c;
cin>>a>>b;
if(c=='Q')
{
cout<<query(1,1,n,a,b)<<endl;
}
else if(c=='U')
{
updata(1,1,n,a,b);
}
}
}
return 0;
}
时间比较
第一个在这分块(区间)模板;