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 }