hdu1166 hdu1394 hdu2795
来源:互联网 发布:java onvif协议 编辑:程序博客网 时间:2024/04/26 23:16
注意输入输出 线段树 单点更新
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string.h>#include <string>using namespace std;#define MAXN 60000int n, val[MAXN];struct Node{ int l, r, sum;}node[MAXN << 2];void build(int i, int l, int r){ node[i].l = l; node[i].r = r; if (l == r) { node[i].sum = val[l]; return ; } int mid = (l + r) >> 1; build(i * 2, l, mid); build(i * 2 + 1, mid + 1, r); node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}void update(int i, int x, int val){ int l = node[i].l; int r = node[i].r; if (l == x && r == x) { node[i].sum += val; return ; } int mid = (l + r) >> 1; if (x <= mid) { update(i * 2, x, val); } else { update(i * 2 + 1, x, val); } node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}int query(int i, int x, int y){ int l = node[i].l; int r = node[i].r; if (l == x && r == y) { return node[i].sum; } int mid = (l + r) >> 1; if (y <= mid) { return query(i * 2, x, y); } else if (x > mid) { return query(i * 2 + 1, x, y); } else { return query(i * 2, x, mid) + query(i * 2 + 1, mid + 1, y); }}char ch[20];void input(){ int t, cases = 0, x, y, v; cin >> t; while (t--) { cin >> n; for (int i = 1; i <= n; i++) { scanf("%d", &val[i]); } build(1, 1, n); cout << "Case " << ++cases << ":" << endl; while (true) { scanf("%s", ch); if (ch[0] == 'E') { break; } else if (ch[0] == 'A') { scanf("%d %d", &x, &v); update(1, x, v); } else if (ch[0] == 'S') { scanf("%d %d", &x, &v); update(1, x, -v); } else { scanf("%d %d", &x, &y); printf("%d\n", query(1, x, y)); } } }}int main(){ input(); return 0;}
hdu1394 求最小逆序
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string.h>#include <string>using namespace std;#define MAXN 6000int val[MAXN], n;struct Node{ int l, r, sum;}node[MAXN << 2];void build(int i, int l, int r){ node[i].l = l, node[i].r = r; if (l == r) { node[i].sum = 0; return ; } int mid = (l + r) >> 1; build(i * 2, l, mid); build(i * 2 + 1, mid + 1, r); node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}void update(int i, int x){ int l = node[i].l, r = node[i].r; if (l == x && r == x) { node[i].sum = 1; return ; } int mid = (l + r) >> 1; if (x <= mid) { update(i * 2, x); } else { update(i * 2 + 1, x); } node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}int query(int i, int x, int y){ int l = node[i].l, r = node[i].r; if (l == x && r == y) { return node[i].sum; } int mid = (l + r) >> 1; if (y <= mid) { return query(i * 2, x, y); } else if (x > mid) { return query(i * 2 + 1, x, y); } else { return query(i * 2, x, mid) + query(i * 2 + 1, mid + 1, y); }}void input(){ while (cin >> n) { build(1, 0, n - 1); int ans = 0; for (int i = 0; i < n; i++) { scanf("%d", &val[i]); update(1, val[i]); ans += i + 1 - query(1, 0, val[i]); } int res = ans; for (int i = 0; i < n - 1; i++) { ans = ans - val[i] - 1 + n - val[i]; res = min(res, ans); } cout << res << endl; }}int main(){ input(); return 0;}hdu2795
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string>#include <string.h>using namespace std;const int MAXN = 200000;int h, w, n;struct Node{ int l, r, sum;}node[MAXN << 2];void build(int i, int l, int r){ node[i].l = l, node[i].r = r; if (l == r) { node[i].sum = w; return ; } int mid = (l + r) >>1; build(i * 2, l, mid); build(i * 2 + 1, mid + 1, r); node[i].sum = max(node[i * 2].sum, node[i * 2 + 1].sum);}int update(int i, int val){ int l = node[i].l, r = node[i].r; if (l == r) { node[i].sum -= val; return l + 1; } int res = 0; if (node[i * 2].sum >= val) { res = update(i * 2, val); } else { res = update(i * 2 + 1, val); } node[i].sum = max(node[i * 2].sum, node[i * 2 + 1].sum); return res;}void input(){ int val; while (cin >> h >> w >> n) { build(1, 0, min(h, n) - 1); for (int i = 0; i < n; i++) { scanf("%d", &val); if (node[1].sum < val) { printf("-1\n"); } else { printf("%d\n", update(1, val)); } } }}int main(){ input(); return 0;}hdu1698 区间更新#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string.h>#include <string>using namespace std;const int MAXN = 100000 + 10;int n, m;struct Node{ int l, r, sum, lazy, val;}node[MAXN << 2];void build(int i, int l, int r){ node[i].l = l, node[i].r = r; node[i].val = 1; node[i].lazy = 0; if (l == r) { node[i].sum = 1; return ; } int mid = (l + r) >> 1; build(i * 2, l, mid); build(i * 2 + 1, mid + 1, r); node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}void update(int i, int x, int y, int val){ int l = node[i].l, r = node[i].r; if (l == x && y == r) { node[i].sum = (r - l + 1) * val; node[i].val = val; node[i].lazy = 1; return ; } int mid = (l + r) >> 1; if (node[i].lazy) { node[i].lazy = 0; node[i * 2].sum = (node[i * 2].r - node[i * 2].l + 1) * node[i].val; node[i * 2 + 1].sum = (node[i * 2 + 1].r - node[i * 2 + 1].l + 1) * node[i].val; node[i * 2].val = node[i * 2 + 1].val = node[i].val; node[i * 2].lazy = node[i * 2 + 1].lazy = 1; } if (y <= mid) { update(i * 2, x, y, val); } else if (x > mid) { update(i * 2 + 1, x, y, val); } else { update(i * 2, x, mid, val); update(i * 2 + 1, mid + 1, y, val); } node[i].sum = node[i * 2].sum + node[i * 2 + 1].sum;}void input(){ int t, x, y, val, cases = 0; scanf("%d", &t); while (t--) { scanf("%d", &n); scanf("%d", &m); build(1, 0, n - 1); for (int i = 0; i < m; i++) { scanf("%d %d %d", &x, &y, &val); update(1, x - 1, y - 1, val); } cout << "Case " << ++cases << ": The total value of the hook is " << node[1].sum << "." << endl; }}int main(){ input(); return 0;}
0 0
- hdu1166 hdu1394 hdu2795
- hdu2795
- hdu2795
- hdu2795
- hdu2795
- HDU2795
- hdu2795
- hdu2795
- hdu2795
- hdu2795
- HDU2795
- HDU2795
- HDU2795
- hdu2795
- HDU2795
- hdu1394
- hdu1394
- hdu1394
- Spring定时任务的几种实现
- Java+Android技巧
- linux下打开文档中文乱码的问题
- 代码优化重构(很经典)
- 图的数据结构
- hdu1166 hdu1394 hdu2795
- Java 8?还记得那年大明湖畔的Java 7吗?
- MapReduce源代码研究1
- OC -- ALAsset和ALAssetRepresentation相册详解
- Android 中 ScrollView滚动不到最底端的解决方法
- undefined reference to 'pthread_create'
- Linux环境变量
- 背景图铺满屏幕
- sqlite3 查询数据库表结构