【树状数组】 POJ 1990 MooFest
2014-06-19 19:59
337 查看
对v进行排序,再对x进行树状数组就行了,比较简单,不难。。。贴上本渣的代码。
#include <iostream> #include <sstream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <climits> #define maxn 20005 #define eps 1e-7 #define mod 1000000007 #define INF 99999999 #define lowbit(x) (x&(-x)) typedef long long LL; using namespace std; LL tree[maxn], s[maxn], cnt[maxn]; LL n; struct node { LL v, x; }tmp[maxn]; int cmp(node a, node b) { return a.v<b.v; } void add_cnt(LL x) { for(int i=x;i<maxn;i+=lowbit(i)) cnt[i]+=1; } void add_tree(LL x) { for(int i=x;i<maxn;i+=lowbit(i)) tree[i]+=x; } int sum_tree(LL x) { LL ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i]; return ans; } int sum_cnt(LL x) { LL ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=cnt[i]; return ans; } LL _abs(LL x) { if(x<0) return -x; else return x; } int main(void) { int i; LL ans; while(scanf("%lld",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%lld%lld",&tmp[i].v,&tmp[i].x); sort(tmp+1, tmp+n+1, cmp); for(i=1;i<=n;i++) s[i]=s[i-1]+tmp[i].x; memset(tree, 0, sizeof tree); memset(cnt, 0, sizeof cnt); ans=0; for(i=1;i<=n;i++){ ans+=_abs(sum_cnt(tmp[i].x)*tmp[i].x-sum_tree(tmp[i].x))*tmp[i].v; ans+=_abs((i-sum_cnt(tmp[i].x)-1)*tmp[i].x-(s[i-1]-sum_tree(tmp[i].x)))*tmp[i].v; add_cnt(tmp[i].x); add_tree(tmp[i].x); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- [树状数组] poj 1990 MooFest
- poj 1990 MooFest (树状数组)
- poj1990 MooFest && hdu3015 Disharmony Trees (树状数组)
- [POJ 1990] MooFest (树状数组)
- POJ 1990 MooFest 【树状数组】
- POJ 1990 MooFest(树状数组)
- POJ 1990 MooFest 树状数组
- POJ 1990 MooFest(树状数组)
- POJ 1990-MooFest(树状数组)
- POJ 1990 MooFest(树状数组)
- POJ 1990 MooFest (树状数组)
- POJ 1990 MooFest(树状数组)
- poj 1990 MooFest (树状数组)
- 树状数组 公式推导 poj 1990 MooFest
- POJ 1990 MooFest(树状数组)
- POJ 1990 MooFest (树状数组)
- poj 1990 MooFest (树状数组)
- POJ 1990 MooFest(想法题&树状数组)
- poj-1990-MooFest(树状数组)
- POJ 1990 MooFest(树状数组)