【HDOJ】3473 Minimum Sum
2016-02-14 17:16
253 查看
划分树解。
主席树解MLE。
数据发生器。
主席树解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()
相关文章推荐
- Linux GCC常用命令
- android笔记(1)
- 8VC Venture Cup 2016 - Elimination Round B. Cards (隐式图DFS)
- 关于meta便签详解
- 老杨聊架构:每个架构师都应该研究下康威定律
- Ajax 完整教程 (转)
- 策略模式(算法模式)
- CSS基础研究(五)-CSS颜色研究
- struts2拦截器配置详解
- 【Xamarin挖墙脚系列:典型的业务程序的结构搭建】
- android中checkbox文字和复选框的间距设置问题
- web前端面试题
- win7系统IE浏览器网页受到恶意软件破坏导致无法显示图片视频或无法打开网页的解决方法
- HomeKit 开发指南(中文版)
- p277 第十章 数组和指针
- 【JS学习笔记】内置对象
- JVM 内存基础概念之 Java 堆
- 8VC Venture Cup 2016 - Elimination Round A. Robot Sequence
- 【HDU 2203】亲和串
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点