zoukankan      html  css  js  c++  java
  • hdu4902 Nice boat 线段树

    题意:给你一个数列,给你两个操作,

    1)数列中L-R每个值都赋值为  X

    2)数列中L-R每个大与 X 的数都变为  gcd(a[i],X)   (L <= i <= R)

    解题思路:这个题目按理来说时间复杂度是不严谨的,本来想把gcd 从大到小存到  vector 里面,没想到直接更新就行了。

    不过从这场比赛发现自己细节方面太糟糕了。还是需要改进

    解题代码:

      1 // File Name: 1006.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年07月31日 星期四 12时46分19秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 
     25 using namespace std;
     26 #define maxn 100005 
     27 struct node{
     28     int l , r ; 
     29     int is1;
     30     int limits;
     31 }tree[maxn << 2];
     32 int a[maxn];
     33 int L(int x)
     34 {
     35     return 2*x; 
     36 }
     37 int gcd(int a, int b)
     38 {
     39     return b == 0 ?a:gcd(b,a%b);
     40 }
     41 int R(int x)
     42 {
     43     return 2 * x + 1; 
     44 }
     45 void pushup(int c)
     46 {
     47     tree[c].limits = max(tree[L(c)].limits,tree[R(c)].limits);
     48 }
     49 void pushdown(int c)
     50 {
     51     if(tree[c].is1)
     52     {
     53         tree[L(c)].is1 = 1; 
     54         tree[R(c)].is1 = 1;
     55         tree[c].is1 = 0;
     56         tree[L(c)].limits = tree[R(c)].limits = tree[c].limits;
     57     }
     58 }
     59 void build(int c , int l ,int r)
     60 {
     61     tree[c].l = l ; 
     62     tree[c].r = r;
     63     tree[c].is1 = 0 ; 
     64     if(l == r)
     65     {
     66         tree[c].limits = a[l];
     67         return ;
     68     }
     69     int m = (l+r)/2;
     70     build(L(c),l,m);
     71     build(R(c),m+1,r);
     72     pushup(c);
     73 }
     74 void update1(int c, int l , int r,int x)
     75 {
     76     if(l <= tree[c].l && r >= tree[c].r)
     77     {
     78         tree[c].is1 = 1;
     79         tree[c].limits = x; 
     80         return ;
     81     }
     82     int m = (tree[c].l+ tree[c].r)/2;
     83     pushdown(c);
     84     if(l <= m)
     85         update1(L(c),l,r,x);
     86     if( r > m )
     87         update1(R(c),l,r,x);
     88     pushup(c);
     89 }
     90 void update2(int c, int l , int r,int x)
     91 {
     92     if(tree[c].limits < x)
     93     {
     94         return ; 
     95     }
     96     if(tree[c].is1 && l <= tree[c].l && r >= tree[c].r)
     97     {
     98         tree[c].limits = gcd(tree[c].limits,x);
     99         return ;
    100     }
    101     if(tree[c].l == tree[c].r)
    102     {
    103         tree[c].is1 = 0 ; 
    104         tree[c].limits = gcd(x,tree[c].limits);
    105         return; 
    106     }
    107     int m = (tree[c].l+ tree[c].r)/2;
    108     pushdown(c);
    109     if(l <= m)
    110         update2(L(c),l,r,x);
    111     if( r > m )
    112         update2(R(c),l,r,x);
    113     pushup(c);
    114 }
    115 void put(int l , int r , int x)
    116 {
    117 //    printf("****%d %d
    ",l,r);
    118     for(int i =l ;i <= r;i ++ )
    119         a[i] = x;
    120     return; 
    121 }
    122 void get(int c )
    123 {
    124     if(tree[c].is1) 
    125     {
    126         put(tree[c].l,tree[c].r,tree[c].limits);
    127         return; 
    128     }
    129     if(tree[c].l == tree[c].r)
    130     {
    131         a[tree[c].l] = tree[c].limits;
    132         return; 
    133     }
    134     pushdown(c);
    135     get(L(c));
    136     get(R(c));
    137 }
    138 int main(){
    139     int t;
    140     //freopen("input.txt","r",stdin);
    141     //freopen("output.txt","w",stdout);
    142     scanf("%d",&t);
    143     while(t--)
    144     {
    145         //memset(tree,0,sizeof(tree));
    146         int n ,m;
    147         scanf("%d",&n);
    148         for(int i = 1;i <= n;i ++)
    149         {        
    150             scanf("%d",&a[i]);
    151          //   printf("%d ",a[i]);
    152         }
    153         //printf("
    ");
    154         build(1,1,n);
    155         scanf("%d",&m);
    156         int ta,tb,tc,td;
    157         for(int i = 1;i <= m;i ++)
    158         {
    159             scanf("%d %d %d %d",&ta,&tb,&tc,&td);
    160             if(ta == 1)
    161             {
    162                 update1(1,tb,tc,td);
    163             }else{
    164                 update2(1,tb,tc,td);
    165             }
    166         }
    167         get(1);
    168         for(int i =1;i <= n;i ++)
    169             printf("%d ",a[i]);
    170         printf("
    ");
    171         //printf("%d
    ",t);
    172     }
    173     return 0;
    174 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    this.$route和this.$router的区别
    IE不支持 Promise 解决办法
    滚动定位的多种方法
    css设置禁止文字被选中
    input标签内容改变的触发事件
    webpack-dev-server配置指南webpack3.0
    Object.keys方法之详解
    mac安装webpack失败
    vue2使用animate css
    http
  • 原文地址:https://www.cnblogs.com/zyue/p/3885079.html
Copyright © 2011-2022 走看看