HDU1754 <线段树创建,查找,更新>

the reason of failure:1、又一次被cin的速度坑了!!!注意大数据要用scanf的输入方法啊。

learning:1、线段树是用来干嘛的,是可以找区间最大最小值或者和之类的值的。

thinking:每次这个线段的max1取max(max1,weight)。也就是判断改变的这个值,是否大于这个线段的max1,如果大就更改。

代码:

#include<iostream>
#include <string.h>
#include <stdio.h>
#define MAXN 200001
using namespace std;
struct ttt{
    int left,right,max1;
};
ttt tree[MAXN*3];
int sum,node[MAXN];;
void init(int x,int y,int num){    //构造线段树
    tree[num].left=x;
    tree[num].right=y;
    if(x==y){
        tree[num].max1=node[x];
      // cout << num<< "\t"<<tree[num].weight <<endl;
    }else{
        init(x,(x+y)/2,num+num);
        init((x+y)/2+1,y,num+num+1);    //1、记得给其上一个线段的结点赋值。
        tree[num].max1=max(tree[num+num].max1,tree[num+num+1].max1);
    }
}
void bian(int x,int num,int weight){     //像二分一样找在左还是在右,因为是一个点,所以只能在一个地方
    tree[x].max1=max(tree[x].max1,weight);
    if(tree[x].left==num&&tree[x].right==num){
        tree[x].max1=weight;
    }else if((tree[x].left+tree[x].right)/2>=num){
        bian(x+x,num,weight);
    }else if((tree[x].right+tree[x].left)/2<num){
        bian(x+x+1,num,weight);
    }
}
void find1(int num,int x,int y){ //在区间内,或者只找左,只找右,或者全找。
    if(tree[num].left>=x&&tree[num].right<=y){
        sum=max(sum,tree[num].max1);
    }else if(x>(tree[num].left+tree[num].right)/2){
        find1(num+num+1,x,y);
    }else if(y<=(tree[num].left+tree[num].right)/2){
        find1(num+num,x,y);
    }else{
        find1(num+num,x,y);
        find1(num+num+1,x,y);
    }
}
int main(){  //再一次,大数据的输入,scanf远远快于cin
    freopen("in.txt","r",stdin);
    memset(tree,0,sizeof(tree));
    int n,m,i,j,k,l,t1,t2,t3,f1,f2;
    char st1;
    while(scanf("%d%d",&n,&m)!=EOF){
    for(i=1;i<=n;i++)
        scanf("%d",&node[i]);
    init(1,n,1);
    while(m--){
            cin >> st1;
        scanf("%d%d",&t1,&t2);
    //    getchar();
    if(st1=='U'){//因为这里scanf的%c是错误的需要%s,具体原因现在没搞清楚
            bian(1,t1,t2);
    }else{
            sum=0;
    find1(1,t1,t2);
    printf("%d\n",sum);
    }
    }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在CUDA编程中,kernel<<<>>>是用来启动并行计算的语法。在<<<>>>中,必须指定一个表达式作为参数,该表达式指定了并行计算的线程块(block)和线程(thread)的数量。这个表达式的格式可以是一个常数,也可以是一个变量或者一个计算表达式。 例如,如果想要启动一个有16个线程块和256个线程的并行计算,可以使用以下形式的表达式: kernel<<<16, 256>>>(); 其中,16表示线程块的数量,256表示每个线程块中的线程数量。 另外,如果希望在编译时指定默认的线程块和线程数量,可以使用宏定义或者模板的方式来实现。通过设置默认值,并在调用kernel时不指定表达式,就可以使用默认的线程块和线程数量。同时,也可以添加依赖关系来根据不同的条件设置不同的默认值。 总结起来,当使用kernel<<<>>>时,必须提供一个表达式来指定线程块和线程的数量。这个表达式可以是一个常数、变量或者计算表达式。另外,也可以通过设置默认值和添加依赖关系来实现更灵活的使用方式。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [玩转CUDA——提示应输入表达式](https://blog.csdn.net/gaohang_hdu/article/details/81119627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Kconfig语法](https://download.csdn.net/download/pengfei24/4328218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值