计算机明天要交作业了.自己设计一个C语言程序,不少于80句程序语句~额,有谁会吗,不要忽视我π_πT_T~
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 00:03:40
计算机明天要交作业了.自己设计一个C语言程序,不少于80句程序语句~额,有谁会吗,不要忽视我π_πT_T~
给你个简单段树的题把:
题目是:
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.
这让很多学生很反感.
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩.
Input
本题目包含多组测试,请处理到文件结束.
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.
学生ID编号分别从1编到N.
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩.
接下来有M行.每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B.
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少.
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B.
Output
对于每一次询问操作,在一行里面输出最高成绩.
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
Sample Output
5
6
5
9
代码是:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define N 200005
using namespace std;
struct mem{
\x05int l, r, num;
}a[N*4];
int fen[N];
void build(int left,int right,int root)
{
\x05a[root].l=left;
\x05a[root].r=right;
\x05if(left==right)
\x05{
\x05\x05a[root].num=fen[left];
\x05\x05return;
\x05}
\x05int mid=(left+right)/2;
\x05build(left,mid,root*2);
\x05build(mid+1,right,root*2+1);
\x05a[root].num=max(a[root*2].num,a[root*2+1].num);
\x05return;
}
void update(int p,int q,int root)
{
\x05if(a[root].l==a[root].r&&a[root].l==p)
\x05{
\x05\x05a[root].num=q;
\x05\x05return;
\x05}
\x05if(p<=a[root*2].r)
\x05{
\x05\x05update(p,q,root*2);
\x05}
\x05else
\x05{
\x05\x05update(p,q,root*2+1);
\x05}
\x05a[root].num=max(a[root*2].num,a[root*2+1].num);
\x05return;
}
int query(int left,int right,int root)
{
\x05if(a[root].l==left&&a[root].r==right)
\x05{
\x05\x05return a[root].num;
\x05}
\x05if(right<=a[root*2].r)
\x05{
\x05\x05return query(left,right,root*2);
\x05}
\x05else if(left>=a[root*2+1].l)
\x05{
\x05\x05return query(left,right,root*2+1);
\x05}
\x05else{
\x05\x05int mid=(a[root].l+a[root].r)/2;
\x05\x05return max(query(left,mid,root*2),query(mid+1,right,root*2+1));
\x05}
}
main()
{
\x05int i, j, n, m, x, y;
\x05char c[2];
\x05while(scanf("%d%d",&n,&m)!=EOF)
\x05{
\x05\x05for(i=1;i<=n;i++)
\x05\x05scanf("%d",&fen[i]);
\x05\x05getchar();
\x05\x05build(1,n,1);
\x05\x05while(m--)
\x05\x05{
\x05\x05\x05\x05scanf("%s%d%d",&c,&x,&y);
\x05\x05\x05\x05getchar();
\x05\x05 if(strcmp(c,"U")==0)
\x05\x05 {
\x05\x05\x05 update(x,y,1);
\x05\x05 }
\x05\x05 if(strcmp(c,"Q")==0)
\x05\x05 {
\x05\x05\x05printf("%d\n",query(x,y,1));
\x05\x05}
\x05\x05}
\x05
\x05}
}
题目来源 HDU1754
题目是:
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.
这让很多学生很反感.
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩.
Input
本题目包含多组测试,请处理到文件结束.
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.
学生ID编号分别从1编到N.
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩.
接下来有M行.每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B.
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少.
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B.
Output
对于每一次询问操作,在一行里面输出最高成绩.
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
Sample Output
5
6
5
9
代码是:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define N 200005
using namespace std;
struct mem{
\x05int l, r, num;
}a[N*4];
int fen[N];
void build(int left,int right,int root)
{
\x05a[root].l=left;
\x05a[root].r=right;
\x05if(left==right)
\x05{
\x05\x05a[root].num=fen[left];
\x05\x05return;
\x05}
\x05int mid=(left+right)/2;
\x05build(left,mid,root*2);
\x05build(mid+1,right,root*2+1);
\x05a[root].num=max(a[root*2].num,a[root*2+1].num);
\x05return;
}
void update(int p,int q,int root)
{
\x05if(a[root].l==a[root].r&&a[root].l==p)
\x05{
\x05\x05a[root].num=q;
\x05\x05return;
\x05}
\x05if(p<=a[root*2].r)
\x05{
\x05\x05update(p,q,root*2);
\x05}
\x05else
\x05{
\x05\x05update(p,q,root*2+1);
\x05}
\x05a[root].num=max(a[root*2].num,a[root*2+1].num);
\x05return;
}
int query(int left,int right,int root)
{
\x05if(a[root].l==left&&a[root].r==right)
\x05{
\x05\x05return a[root].num;
\x05}
\x05if(right<=a[root*2].r)
\x05{
\x05\x05return query(left,right,root*2);
\x05}
\x05else if(left>=a[root*2+1].l)
\x05{
\x05\x05return query(left,right,root*2+1);
\x05}
\x05else{
\x05\x05int mid=(a[root].l+a[root].r)/2;
\x05\x05return max(query(left,mid,root*2),query(mid+1,right,root*2+1));
\x05}
}
main()
{
\x05int i, j, n, m, x, y;
\x05char c[2];
\x05while(scanf("%d%d",&n,&m)!=EOF)
\x05{
\x05\x05for(i=1;i<=n;i++)
\x05\x05scanf("%d",&fen[i]);
\x05\x05getchar();
\x05\x05build(1,n,1);
\x05\x05while(m--)
\x05\x05{
\x05\x05\x05\x05scanf("%s%d%d",&c,&x,&y);
\x05\x05\x05\x05getchar();
\x05\x05 if(strcmp(c,"U")==0)
\x05\x05 {
\x05\x05\x05 update(x,y,1);
\x05\x05 }
\x05\x05 if(strcmp(c,"Q")==0)
\x05\x05 {
\x05\x05\x05printf("%d\n",query(x,y,1));
\x05\x05}
\x05\x05}
\x05
\x05}
}
题目来源 HDU1754