zoukankan      html  css  js  c++  java
  • zoj2706

      1 /*
      2 题意:给n个数,m个操作,每次把区间[l,r]的数用它们的平均值替代,
      3 如果平均值不是整数,且当前n个数的和小于原先的和就向上round,不然就向下round;
      4 
      5 分析:简单线段区间更新;
      6 
      7 trick:关于正数和负数的整除问题,正数整除是自动向下取整的,但负数是向上取整的
      8 即13/3=4.3 ->4  但-13/3=-4.3 ->-4
      9 
     10 */
     11 #include<cstdio>
     12 #include<cstring>
     13 #include<cstdlib>
     14 #include<iostream>
     15 #include<algorithm>
     16 #include<cmath>
     17 #define lson l,m,rt<<1
     18 #define rson m+1,r,rt<<1|1
     19 using namespace std;
     20 typedef long long LL;
     21 const int N=30000+10;
     22 LL col[N<<2],sum[N<<2],a[N];
     23 void pushup(int rt){
     24     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
     25 }
     26 void pushdown(int l,int m,int r,int rt){
     27     if (col[rt]){
     28         col[rt<<1]=col[rt<<1|1]=col[rt];
     29         sum[rt<<1]=(LL)(m-l+1)*col[rt];
     30         sum[rt<<1|1]=(LL)(r-m)*col[rt];
     31         col[rt]=0;
     32     }
     33 }
     34 void build(int l,int r,int rt){
     35      col[rt]=sum[rt]=0;
     36      if (l==r){
     37         sum[rt]=a[l];
     38         return;
     39      }
     40      int m=(l+r)>>1;
     41      build(lson);build(rson);
     42      pushup(rt);
     43 }
     44 void update(int L,int R,int v,int l,int r,int rt){//将[L,R]更新为v;
     45     if (L<=l && r<=R){
     46         sum[rt]=(LL)(r-l+1)*v;
     47         col[rt]=v;
     48         return;
     49     }
     50     int m=(l+r)>>1;
     51     pushdown(l,m,r,rt);
     52     if (L<=m) update(L,R,v,lson);
     53     if (m< R) update(L,R,v,rson);
     54     pushup(rt);
     55 }
     56 LL query(int L,int R,int l,int r,int rt){//询问[L,R]里的SUM
     57     if (L<=l && r<=R){
     58         return sum[rt];
     59     }
     60     int m=(l+r)>>1;
     61     pushdown(l,m,r,rt);
     62     LL ret=0;
     63     if (L<=m) ret+=query(L,R,lson);
     64     if (m< R) ret+=query(L,R,rson);
     65     return ret;
     66 }
     67 void Q(int l,int r,int rt){
     68     if (l==r){
     69         a[l]=sum[rt];
     70         return;
     71     }
     72     int m=(l+r)>>1;
     73     pushdown(l,m,r,rt);
     74     Q(lson);Q(rson);
     75 }
     76 int n,m;
     77 int main(){
     78     while (~scanf("%d%d",&n,&m)){
     79         LL S=0;
     80         for (int i=0;i<n;i++){
     81             cin>>a[i];
     82             S+=a[i];
     83         }
     84         build(0,n-1,1);
     85         for (int i=0;i<m;i++){
     86             int x,y;scanf("%d%d",&x,&y);
     87             x--,y--;
     88             LL S1=query(x,y,0,n-1,1);
     89            // cout<<"** "<<S1<<endl;
     90             if (S1%(y-x+1)!=0){
     91                 //对于正负数更新不同的值
     92                 int flag1=0,flag2=0;
     93                 if (S1>=0)flag1=1;
     94                 if (S1<0) flag2=-1;
     95               
     96                 if (sum[1]<=S) update(x,y,S1/(y-x+1)+flag1,0,n-1,1);
     97                 else update(x,y,S1/(y-x+1)+flag2,0,n-1,1);
     98             }else update(x,y,S1/(y-x+1),0,n-1,1);
     99         }
    100         Q(0,n-1,1);
    101         for (int i=0;i<n-1;i++) cout<<a[i]<<" ";
    102         cout<<a[n-1]<<endl;
    103         cout<<endl;
    104     }
    105 
    106     return 0;
    107 }
  • 相关阅读:
    2013-05-25 14:04 zend studio10正式版如何汉化?
    网页前端优化之滚动延时加载图片
    appium框架之bootstrap
    软件测试面试题(一)
    Java中的经典算法之冒泡排序(Bubble Sort)
    Git知识总览(一) 从 git clone 和 git status 谈起
    Webdriver获取多个元素
    idea注册码到期,破解idea
    安装appium桌面版和命令行版
    Python+Appium学习篇之WebView处理
  • 原文地址:https://www.cnblogs.com/Rlemon/p/3091615.html
Copyright © 2011-2022 走看看