您的位置:首页 > 其它

【HDOJ】3473 Minimum Sum

2016-02-14 17:16 253 查看
划分树解。
主席树解MLE。

/* 3473 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000")

#define sti                set<int>
#define stpii            set<pair<int, int> >
#define mpii            map<int,int>
#define vi                vector<int>
#define pii                pair<int,int>
#define vpii            vector<pair<int,int> >
#define rep(i, a, n)     for (int i=a;i<n;++i)
#define per(i, a, n)     for (int i=n-1;i>=a;--i)
#define clr                clear
#define pb                 push_back
#define mp                 make_pair
#define fir                first
#define sec                second
#define all(x)             (x).begin(),(x).end()
#define SZ(x)             ((int)(x).size())
#define lson            l, mid, rt<<1
#define rson            mid+1, r, rt<<1|1
#define LL                __int64

const int maxn = 1e5+5;
int order[maxn];
int val[18][maxn];
int toLeft[18][maxn];
LL sum[18][maxn];
int n;
LL ans;

void Build(int l, int r, int dep) {
if (l == r) {
toLeft[dep][l] = toLeft[dep][l-1] + 1;
sum[dep][l] = sum[dep][l-1] + val[dep][l];
return ;
}

int mid = (l + r) >> 1;
int same = mid - l + 1;
rep(i, l, r+1) {
if (val[dep][i] < order[mid])
--same;
}

int lpos = l, rpos = mid + 1;
rep(i, l, r+1) {
if (val[dep][i] < order[mid]) {
val[dep+1][lpos++] = val[dep][i];
} else if (val[dep][i]==order[mid] && same>0) {
val[dep+1][lpos++] = val[dep][i];
--same;
} else {
val[dep+1][rpos++] = val[dep][i];
}

sum[dep][i] = sum[dep][i-1] + val[dep][i];
toLeft[dep][i] = toLeft[dep][l-1] + lpos - l;
}

Build(l, mid, dep+1);
Build(mid+1, r, dep+1);
}

int Query(int l, int r, int k, int L, int R, int dep) {
if (l == r)
return val[dep][l];

int mid = (L + R) >> 1;
int tmp = toLeft[dep][r] - toLeft[dep][l-1];

if (tmp >= k) {
int s = mid+1+l-L-(toLeft[dep][l-1] - toLeft[dep][L-1]);
int e = mid+r-L+1 - (toLeft[dep][r] - toLeft[dep][L-1]);

ans += sum[dep+1][e] - sum[dep+1][s-1];

int ll = L + toLeft[dep][l-1] - toLeft[dep][L-1];
int rr = ll + tmp - 1;

return Query(ll, rr, k, L, mid, dep+1);
} else {
int s = L + toLeft[dep][l-1] - toLeft[dep][L-1];
int e = s + tmp - 1;

ans -= sum[dep+1][e] - sum[dep+1][s-1];

k -= tmp;
int rr = r + toLeft[dep][R] - toLeft[dep][r];
int ll = rr - (r-l+1 - tmp) + 1;

return Query(ll, rr, k, mid+1, R, dep+1);
}
}

void solve() {
int q;

sort(order+1, order+1+n);
Build(1, n, 0);

int l, r, kth;
int tmp;

scanf("%d", &q);
while (q--) {
scanf("%d %d", &l, &r);
++l;
++r;
kth = ((l + r) >> 1) - l + 1;
ans = 0;
tmp = Query(l, r, kth, 1, n, 0);
if (((r-l+1) & 1) == 0)
ans -= tmp;
printf("%I64d\n", ans);
}
}

int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif

int t;

scanf("%d", &t);
rep(tt, 1, t+1) {
scanf("%d", &n);
rep(i, 1, n+1) {
scanf("%d", &val[0][i]);
order[i] = val[0][i];
}
printf("Case #%d:\n", tt);
solve();
putchar('\n');
}

#ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif

return 0;
}


数据发生器。

from copy import deepcopy
from random import randint, shuffle
import shutil
import string

def GenDataIn():
with open("data.in", "w") as fout:
t = 10
bound = 10**5
fout.write("%d\n" % (t))
for tt in xrange(t):
n = bound
q = randint(10, 20)
fout.write("%d\n" % (n))
L = []
for i in xrange(n):
x = randint(1, bound)
L.append(x)
fout.write(" ".join(map(str, L)) + "\n")
fout.write("%d\n" % (q))
for i in xrange(q):
l = randint(0, n-1)
r = randint(l, n-1)
fout.write("%d %d\n" % (l, r))

def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName)

if __name__ == "__main__":
GenDataIn()
MovDataIn()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: