SJTU OJ 1990 二哥听CD
来源:互联网 发布:网页调用excel数据 编辑:程序博客网 时间:2024/05/21 10:40
SJTU OJ 1990 二哥听CD
原题链接
这道题用暴力解法也可以过,因为好感度每次都只加减1, 一般不会有太多的移动。
但是不经过好的优化,还是会超时的。
记录好每个CD移动之后的位置就可以了。
#include <iostream>#include <cstdio>using namespace std;struct cd{ int index; int weight;};int n, m;cd arr[2000005];int movenode[2000005]={0};void swap_(int & a, int & b){ int c = a; a = b; b = c;}int main(){ scanf("%d%d", &n, &m); for (int i=1; i<=n; i++){ scanf("%d", &(arr[i].weight)); arr[i].index = i; } arr[0].weight = (1<<31); arr[n+1].weight = (1<<31)-1; int x, y; while (m--){ scanf("%d%d", &x, &y); if (y == 1){ int pos = (movenode[x] == 0 ? x : movenode[x]); arr[pos].weight++; while (arr[pos].weight > arr[pos+1].weight){ movenode[arr[pos].index] = pos+1; movenode[arr[pos+1].index] = pos; swap_(arr[pos].weight, arr[pos+1].weight); swap_(arr[pos].index, arr[pos+1].index); pos++; } } else { int pos = (movenode[x] == 0 ? x : movenode[x]); arr[pos].weight--; while (arr[pos].weight <= arr[pos-1].weight){ movenode[arr[pos].index] = pos-1; movenode[arr[pos-1].index] = pos; swap_(arr[pos].weight, arr[pos-1].weight); swap_(arr[pos].index, arr[pos-1].index); pos--; } } printf("%d\n", arr[1].index); } return 0;}
更新:
用线段树维护最小值位置,代码如下:
#include <iostream>#include <cstdio>using namespace std;int n, m;int arr[2000005];int day[2000005];int segTree[4000010];inline void build(int node, int begin_, int end_){ if (begin_ == end_) segTree[node] = begin_; /* 只有一个元素,节点记录该单元素 */ else { /* 递归构造左右子树 */ build(2*node, begin_, (begin_+end_)/2); build(2*node+1, (begin_+end_)/2+1, end_); /* 回溯时得到当前node节点的线段信息 */ if (arr[segTree[2 * node]] < arr[segTree[2 * node + 1]]) segTree[node] = segTree[2 * node]; else segTree[node] = segTree[2 * node + 1]; }}inline void Updata(int node, int begin_, int end_, int ind)/*单节点更新*/{ if( begin_ == end_) return; int m = (begin_ + end_) >> 1; if(ind <= m) Updata(node * 2,begin_, m, ind); else Updata(node * 2 + 1, m + 1, end_, ind); /*回溯更新父节点*/ if (arr[segTree[node * 2]] < arr[segTree[node * 2 + 1]]) segTree[node] = segTree[node * 2]; else if (arr[segTree[node * 2]] > arr[segTree[node * 2 + 1]]) segTree[node] = segTree[node * 2+1]; else { if (day[segTree[node * 2]] > day[segTree[node * 2 + 1]]) segTree[node] = segTree[node * 2]; else segTree[node] = segTree[node * 2+1]; }}int main(){ scanf("%d%d", &n, &m); for (int i=1; i<=n; i++){ scanf("%d", &arr[i]); day[i] = i; } int nowday = n+1; build(1, 1, n); int x, y; for (int i=0; i<m; i++){ scanf("%d%d", &x, &y); day[x] = nowday++; arr[x] += y; Updata(1, 1, n, x); printf("%d\n", segTree[1]); } return 0;}
如果有更好的做法,敬请指教。
阅读全文
0 0
- SJTU OJ 1990 二哥听CD
- sjtu oj 1002.二哥种花生
- sjtu oj 1003.二哥养细菌
- sjtu oj 1008.二哥买期货
- sjtu oj 1036. 二哥去取钱
- SJTU OJ 1056 二哥吃糖
- SJTU OJ 1069 二哥的硬币
- sjtu 1003 二哥养细菌
- SJTU 3001. 二哥的幸运
- sjtu 1008 二哥买期货
- sjtu online judge 1034 二哥的金链
- SJTU OJ.1204
- SJTU OJ.1204_new
- 【数据结构】SJTU OJ 1237
- 【数据结构】SJTU OJ 1233
- 【数据结构】SJTU OJ 1234
- SJTU OJ 3008 Maze
- 二哥OJ(一)
- (8)使用p命名空间简化setter注入
- 算法导论2-1.3:n个数的一个序列A中查找v
- 自学Python之Python基础:(六)可迭代对象与反迭代技巧
- wxWidgets教程(17)——wxSqlite3用法
- PHP基础之字符串(5)
- SJTU OJ 1990 二哥听CD
- java数据库操作--改写成工具类
- 排序算法复杂性
- 学习英语的第三个阶段-大量阅读
- 如何把Word的默认页面颜色由白色改为绿色
- NetSuite ERP的优势是什么?
- 进制
- 有机会会读的书
- 算法导论2-1.4:给出两个长度为n的二进制数(当前存放在数组中),求和后放入长度为n+1的数组中