• Codeforces Round #174 (Div. 1)A


    题不怎么难,按线段树的解法 就是延迟标记,更新 因为找错找了N久 记一篇吧

    向下更新时把+=写成了= 还做在了2W组的数据上 那个错找得真费劲。。

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<queue>
     8 using namespace std;
     9 #define N 200012
    10 int n;
    11 #define LL long long
    12 LL s[N<<2],lz[N<<2];
    13 void down(int w,int m)
    14 {
    15     if(lz[w])
    16     {
    17         s[w<<1]+=lz[w]*(m-m/2);
    18         s[w<<1|1]+=lz[w]*(m/2);
    19         lz[w<<1] += lz[w];
    20         lz[w<<1|1]+=lz[w];
    21         lz[w] = 0;
    22     }
    23 }
    24 void up(int w)
    25 {
    26     s[w] = s[w<<1]+s[w<<1|1];
    27 }
    28 void update(int a,int b,int d,int l,int r,int w)
    29 {
    30     if(a<=l&&b>=r)
    31     {
    32         s[w]+=(r-l+1)*d;
    33         lz[w]+=d;
    34         return ;
    35     }
    36     int m = (l+r)>>1;
    37     down(w,r-l+1);
    38     if(a<=m)
    39     update(a,b,d,l,m,w<<1);
    40     if(b>m)
    41     update(a,b,d,m+1,r,w<<1|1);
    42     up(w);
    43 }
    44 void set(int p,int d,int l,int r,int w)
    45 {
    46     if(l==r)
    47     {
    48         s[w] = d;
    49         return ;
    50     }
    51     int  m = (l+r)>>1;
    52     down(w,r-l+1);
    53     if(p>m)
    54     set(p,d,m+1,r,w<<1|1);
    55     else
    56     set(p,d,l,m,w<<1);
    57     up(w);
    58 }
    59 int main()
    60 {
    61 
    62     int i,t,x,y,g=1;
    63     cin>>n;
    64     LL sum=0;
    65     for(i = 1; i <= n ; i++)
    66     {
    67         cin>>t;
    68         if(t==1)
    69         {
    70             cin>>x>>y;
    71             update(1,min(g,x),y,1,N-5,1);
    72             sum = s[1];
    73             printf("%.6f
    ",double(sum)/g);
    74         }
    75         else if(t==2)
    76         {
    77             cin>>x;
    78             set(g+1,x,1,N-5,1);
    79             sum = s[1];
    80             g++;
    81             printf("%.6f
    ",double(sum)/g);
    82         }
    83         else
    84         {
    85             if(g>1)
    86             {
    87                 set(g,0,1,N-5,1);
    88                 g--;
    89                 sum = s[1];
    90             }
    91             printf("%.6f
    ",double(sum)/g);
    92         }
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    如何选择一家公司?
    教你一招最屌的阅读开源项目的姿势
    我是如何管理我的团队的?
    我面试到底问什么?
    如何正确使用开源项目?
    如何选择开源项目?
    html表格中的tr td th用法
    如何用 Java 实现 Web 应用中的定时任务?
    java定时任务实现的几种方式
    Java 定时任务 & 任务调度
  • 原文地址:https://www.cnblogs.com/shangyu/p/3515595.html
Copyright © 2020-2023  润新知