zoukankan      html  css  js  c++  java
  • codeforces 169 div2 C

    http://codeforces.com/problemset/problem/276/C

    比赛的时候用的线段树。裸的吧。还wa了3次。。

     1 //lazy_tag
     2 //区间求和操作
     3 #include <iostream>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <cmath>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 #define lson l,m,rt<<1
    11 #define rson m+1,r,rt<<1|1
    12 #define MAXN 200010
    13 int add[MAXN<<2];
    14 long long  a[MAXN];
    15 long long ans[MAXN];
    16 void PushDown(int rt,int m)//m是父亲区间长度
    17 {
    18     if(add[rt])
    19     {
    20         add[rt<<1]+=add[rt];
    21         add[rt<<1|1]+=add[rt];
    22         add[rt]=0;
    23     }
    24 }
    25 
    26 //update
    27 void update(int L,int R,int c,int l,int r,int rt)
    28 {
    29     if (L<= l && r<=R)    //节点区间[l,r]被目标区间[L,R]包含
    30     {
    31         add[rt]+=c;
    32         if(L==R && c==0)
    33         {
    34             ans[L]+=add[rt];
    35             add[rt]=0;
    36         }
    37         return ;
    38     }
    39     PushDown(rt,r-l+1);
    40     int m = (l+r)>>1;
    41     if(L<=m)
    42         update(L,R,c,lson);
    43     if(m<R)
    44         update(L,R,c,rson);
    45 }
    46 
    47 int main()
    48 {
    49     int N,Q;
    50     while(scanf("%d%d",&N,&Q)!=EOF)
    51     {
    52         memset(ans,0,sizeof(ans));
    53         memset(add,0,sizeof(add));
    54         for(int i=0;i<N;i++)
    55             scanf("%d",&a[i]);
    56         sort(a,a+N);
    57         while(Q--)
    58         {
    59             int l,r;
    60             scanf("%d%d",&l,&r);
    61             update(l,r,1,1,N,1);
    62         }
    63         for(int i=1;i<=N;i++)
    64             update(i,i,0,1,N,1);
    65         sort(ans+1,ans+N+1);
    66         long long sum=0;
    67         for(int i=0;i<N;i++)
    68             sum+=ans[i+1]*a[i];
    69         printf("%I64d\n",sum);
    70     }
    71     return 0;
    72 }

    不过看了别人的程序,觉得下面这种解法值得学习。ac了。以前好像看见过类似的问题,总是不知道怎么解决。作个保留。

     1 // File Name: cc.cpp
     2 // Author: Missa
     3 // Created Time: 2013/2/25 星期一 23:13:05
     4 
     5 #include<iostream>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<algorithm>
     9 #include<cmath>
    10 #include<queue>
    11 #include<stack>
    12 #include<string>
    13 #include<vector>
    14 #include<cstdlib>
    15 #include<map>
    16 #include<set>
    17 using namespace std;
    18 #define CL(x,v) memset(x,v,sizeof(x));
    19 #define R(i,st,en) for(int i=st;i<en;i++)
    20 #define ll long long
    21 const int maxn = 2e5+5;
    22 ll a[maxn],ans[maxn],w[maxn];
    23 int n,m;
    24 
    25 int main()
    26 {
    27     while(~scanf("%d%d",&n,&m))
    28     {
    29         CL(a,0);CL(ans,0);CL(w,0);
    30         R(i,1,n+1)
    31             scanf("%I64d",&a[i]);
    32         R(i,0,m)
    33         {
    34             int l,r;
    35             scanf("%d%d",&l,&r);
    36             w[l]++;
    37             w[r+1]--;
    38         }
    39         int tmp=0;
    40         R(i,1,n+1)
    41         {
    42             tmp+=w[i];
    43             ans[i]=tmp;
    44         }
    45         sort(ans+1,ans+n+1);
    46         sort(a+1,a+n+1);
    47         ll sum=0;
    48         R(i,1,n+1)
    49             sum+=a[i]*ans[i];
    50         printf("%I64d\n",sum);
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    剑指offer-栈的压入、弹出序列
    剑指offer-包含min函数的栈
    图-Dijkster最短路径
    剑指offer-顺时针打印矩阵
    二叉树的镜像
    剑指offer-树的子结构
  • 原文地址:https://www.cnblogs.com/Missa/p/2932862.html
Copyright © 2011-2022 走看看