当前位置: 首页 > 编程日记 > 正文

bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节。。

 

点分治:时空复杂度$O(n\log^2n)$,常数巨大

主要就是3个堆的初始状态

C堆:每个节点一个,为子树中的点到它父亲的距离的堆。

B堆:每个节点一个,存所有儿子的堆的堆顶。特别地,如果该节点关灯,那么将加入一个0;如果没有元素,堆顶应返回负数。

A堆:全局一个,存所有B堆的最大值和最小值之和。特别地,如果B堆不足两个,返回负数。

这样,我们一开始需要关闭所有的等,即对所有点调用一次turn_off。由于堆顶返回的是负数,删除时找不到的话直接忽略即可,如果返回的是0,则有可能误删有用的信息。

 

代码:

  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 const int N = 100000 + 10, logn = 17;
  6 
  7 struct RMQ {
  8     int n, f[logn + 1][N * 2], Log[N * 2];
  9     void init(int n) {
 10         Log[0] = -1;
 11         for(int i = 1; i <= n; i++) Log[i] = Log[i >> 1] + 1;
 12         this->n = n;
 13         for(int i = 1; (1 << i) < n; i++) {
 14             for(int j = 1; j <= n; j++) {
 15                 f[i][j] = min(f[i-1][j], f[i-1][j + (1 << (i-1))]);
 16             }
 17         }
 18     }
 19 
 20     int query(int l, int r) {
 21         int t = Log[r - l + 1];
 22         return min(f[t][l], f[t][r - (1 << t) + 1]);
 23     }
 24 } rmq;
 25 
 26 struct Edge {
 27     int to; Edge *next;
 28 } pool[N * 2], *pis = pool, *fir[N];
 29 
 30 void AddEdge(int u, int v) {
 31     pis->to = v, pis->next = fir[u], fir[u] = pis++;
 32 }
 33 
 34 int dfn[N], dfs_clock, *seq = rmq.f[0], dep[N], ds[N], tot;
 35 
 36 #define v p->to
 37 void dfs(int u, int fa) {
 38     dfn[u] = ++dfs_clock;
 39     seq[dfs_clock] = dep[u];
 40     for(Edge *p = fir[u]; p; p = p->next) {
 41         if(v != fa) {
 42             dep[v] = dep[u] + 1, dfs(v, u);
 43             seq[++dfs_clock] = dep[u];
 44         }
 45     }
 46     ds[tot++] = u;
 47 }
 48 #undef v
 49 
 50 int dis(int u, int v) {
 51     if(dfn[u] > dfn[v]) swap(u, v);
 52     return dep[u] + dep[v] - (rmq.query(dfn[u], dfn[v]) << 1);
 53 }
 54 const int INF = 1 << 29;
 55 
 56 struct Set {
 57     multiset<int> s;
 58     void insert(int x) {s.insert(x);}
 59     void erase(int x) {
 60         multiset<int>::iterator it = s.find(x);
 61         if(it != s.end()) s.erase(it);
 62     }
 63     int size() const {return s.size();}
 64     int top() {return s.empty() ? -INF : *--s.end();}
 65     int    query() {
 66         if(s.size() < 2) return -INF;
 67         return *--s.end() + *----s.end();
 68     }
 69 } A, B[N], C[N];
 70 
 71     void print(const Set &ss) {
 72         const multiset<int> &s = ss.s;
 73         for(multiset<int>::iterator it = s.begin(); it != s.end(); ++it) {
 74             printf("%d ", *it);
 75         }
 76         puts("");
 77     }
 78 bool centre[N];
 79 int fa[N], maxsz[N], sz[N], root;
 80 
 81 #define v p->to
 82 void dfs_size(int u, int fa) {
 83     sz[u] = 1, maxsz[u] = 0;
 84     for(Edge *p = fir[u]; p; p = p->next) {
 85         if(!centre[v] && v != fa) {
 86             dfs_size(v, u);
 87             sz[u] += sz[v];
 88             maxsz[u] = max(maxsz[u], sz[v]);
 89         }
 90     }
 91 }
 92 
 93 void dfs_root(int u, int fa, int r) {
 94     maxsz[u] = max(maxsz[u], sz[r] - sz[u]);
 95     if(maxsz[u] < maxsz[root]) root = u;
 96     for(Edge *p = fir[u]; p; p = p->next) {
 97         if(!centre[v] && v != fa) dfs_root(v, u, r);
 98     }
 99 }
100 
101 void divide(int u, int _fa) {
102     dfs_size(u, 0), dfs_root(u, 0, root = u);
103     centre[u = root] = 1, fa[u] = _fa;
104     for(Edge *p = fir[u]; p; p = p->next) {
105         if(!centre[v]) divide(v, u);
106     }
107 }
108 #undef v
109 
110 void add(int u, int v, int flag) {
111     if(u == v) {
112         A.erase(B[u].query());
113         if(flag) B[u].insert(0);
114         else B[u].erase(0);
115         A.insert(B[u].query());
116     }
117     int f = fa[u];
118     if(!f) return;
119     A.erase(B[f].query());
120     B[f].erase(C[u].top());
121     if(flag) C[u].insert(dis(f, v));
122     else C[u].erase(dis(f, v));
123     B[f].insert(C[u].top());
124     A.insert(B[f].query());
125     add(f, v, flag);
126 }
127 
128 int col[N];
129 
130 int main() {
131 #ifdef DEBUG
132     freopen("in.txt", "r", stdin);
133 #endif
134 
135     int n; scanf("%d", &n);
136     for(int i = 1; i < n; i++) {
137         int u, v; scanf("%d%d", &u, &v);
138         AddEdge(u, v), AddEdge(v, u);
139     }
140     dfs(1, 0);
141     rmq.init((n << 1) - 1);
142     divide(1, 0);
143     int cnt_off = n;
144     for(int i = 0; i < n; i++)
145         add(ds[i], ds[i], col[ds[i]] = 1);
146     
147     int m, u; scanf("%d", &m);
148     char opt[8];
149     while(m--) {
150         scanf("%s", opt);
151         if(opt[0] == 'G') {
152             if(cnt_off == 0) puts("-1");
153             else if(cnt_off == 1) puts("0");
154             else printf("%d\n", A.top());
155         } else {
156             scanf("%d", &u), add(u, u, col[u] ^= 1);
157             if(col[u]) cnt_off++; else cnt_off--;
158         }
159     }
160 
161     return 0;
162 }
点分治

括号序列:时间复杂度$O(n\log n)$,空间复杂度$O(n)$

  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 const int N = 100000 + 10;
  6 
  7 int col[N];
  8 const int bracket[] = {-2, -1};
  9 
 10 struct Data {
 11     /*
 12         0 : 从区间左起的
 13         [ x ] x的数量
 14 
 15         c[] 是左右括号的数量,而d[]和s[]必须保证旁边至少有一个满足条件的点
 16     */
 17     int c[2]; // [ )...) ] 或 [ (...( ]
 18     int d[2]; // [ )...) ] - [ (...( ] 或反过来
 19     int s[2]; // [ )...) ] + [ (...( ] 或反过来 
 20     int ans;
 21 
 22     void set(int x) {
 23         for(int i = 0; i < 2; i++) {
 24             c[i] = x == bracket[i];
 25             d[i] = s[i] = x > 0 && col[x] ? 0 : -(1 << 29);
 26             // 只有在x是满足条件的点的时候才把d[]和s[]赋为0,否则为-INF
 27         }
 28     }
 29 };
 30 
 31 void maxit(int &x, int y) {
 32     if(x < y) x = y;
 33 }
 34 
 35 // 实际上需要讨论lhs.c[1] 和 rhs.c[0]的大小
 36 // 但是不合法的一定不是最优的,所以可以对两种情况直接取max
 37 Data operator + (const Data &lhs, const Data &rhs) {
 38     static Data res;
 39 
 40     // update ans
 41     res.ans = max(lhs.ans, rhs.ans);
 42     maxit(res.ans, lhs.s[1] + rhs.d[0]);
 43     maxit(res.ans, lhs.d[1] + rhs.s[0]);
 44 
 45     // update s[]
 46     res.s[0] = max(lhs.s[0], rhs.s[0] - lhs.c[1] + lhs.c[0]); // lhs.c[1] >= rhs.c[0]
 47     res.s[0] = max(res.s[0], lhs.c[0] + lhs.c[1] + rhs.d[0]); // lhs.c[1] <= rhs.c[0]
 48     res.s[1] = max(rhs.s[1], lhs.s[1] - rhs.c[0] + rhs.c[1]); // rhs.c[1] >= lhs.c[0]
 49     res.s[1] = max(res.s[1], rhs.c[0] + rhs.c[1] + lhs.d[1]); // rhs.c[1] <= rhs.c[0]
 50 
 51     // update d[]
 52     res.d[0] = max(lhs.d[0], rhs.d[0] + lhs.c[1] - lhs.c[0]);
 53     res.d[1] = max(rhs.d[1], lhs.d[1] + rhs.c[0] - rhs.c[1]);
 54 
 55     // update c[] to update next s[] and d[]
 56     res.c[0] = lhs.c[0] + max(rhs.c[0] - lhs.c[1], 0);
 57     res.c[1] = rhs.c[1] + max(lhs.c[1] - rhs.c[0], 0);
 58 
 59     return res;
 60 }
 61 
 62 struct Edge {int to; Edge *next;} pool[N * 2], *pis = pool, *fir[N];
 63 void AddEdge(int u, int v) {pis->to = v, pis->next = fir[u], fir[u] = pis++;}
 64 
 65 int dfs_seq[N * 3], dfs_clock;
 66 
 67 void dfs(int u, int fa) {
 68     col[u] = 1;
 69     dfs_seq[++dfs_clock] = bracket[1];
 70     dfs_seq[++dfs_clock] = u;
 71     for(Edge *p = fir[u]; p; p = p->next) {
 72         int v = p->to;
 73         if(v != fa) dfs(v, u);
 74     }
 75     dfs_seq[++dfs_clock] = bracket[0];
 76 }
 77 
 78 int pos[N];
 79 
 80 struct SegmentTree {
 81     Data da[N * 12];
 82     void build(int s, int l, int r, int a[]) {
 83         if(l == r) {
 84             if(a[l] > 0) pos[a[l]] = s;
 85             return da[s].set(a[l]);
 86         }
 87         int mid = (l + r) >> 1;
 88         build(s << 1, l, mid, a), build(s << 1 | 1, mid + 1, r, a);
 89         da[s] = da[s << 1] + da[s << 1 | 1];
 90     }
 91 
 92     void modify(int x) {
 93         int s = pos[x]; da[s].set(x);
 94         while(s >>= 1) da[s] = da[s << 1] + da[s << 1 | 1];
 95     }
 96 } seg;
 97 
 98 int main() {
 99 #ifdef DEBUG
100     freopen("in.txt", "r", stdin);
101 #endif
102 
103     int n; scanf("%d", &n);
104     for(int i = 1; i < n; i++) {
105         int u, v; scanf("%d%d", &u, &v);
106         AddEdge(u, v), AddEdge(v, u);
107     }
108     dfs(1, 0);
109     seg.build(1, 1, n * 3, dfs_seq);
110 
111     int m; scanf("%d", &m);
112     char opt[8]; int ans, x, cnt = n;
113     while(m--) {
114         scanf("%s", opt);
115         if(opt[0] == 'G') {
116             if(cnt >= 2) ans = seg.da[1].ans;
117             else if(cnt == 1) ans = 0;
118             else ans = -1;
119             printf("%d\n", ans);
120         } else {
121             scanf("%d", &x);
122             if(col[x] ^= 1) cnt++; else cnt--;
123             seg.modify(x);
124         }
125     }
126 
127     return 0;
128 }
线段树
链分治:时间复杂度$O(n\log^2n)$,空间复杂度$O(n)$ 比点分治快多啦
notice:合并两个线段树节点的时候如果使用=赋值可能丢失儿子信息。
  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 const int N = 100000 + 10, INF = 1 << 29;
  6 
  7 struct Set {
  8     multiset<int> s;
  9     void erase(int x) {assert(s.find(x) != s.end()), s.erase(s.find(x));}
 10     void insert(int x) {s.insert(x);}
 11     int top() const {return s.empty() ? -INF : *--s.end();}
 12     int query() const {
 13         if(s.size() < 2) return -INF;
 14         return *--s.end() + *----s.end();
 15     }
 16 } heap[N], st;
 17 
 18 void print(const Set &ss) {
 19     const multiset<int> &s = ss.s;
 20     for(multiset<int>::iterator it = s.begin(); it != s.end(); ++it) {
 21         printf("%d ", *it);
 22     }
 23     puts("");
 24 }
 25 
 26 struct Edge {
 27     int to, w;
 28     Edge *next;
 29 } pool_edges[N * 2], *fir[N], *pe = pool_edges;
 30 
 31 void AddEdge(int u, int v, int w) {
 32     pe->to = v, pe->w = w, pe->next = fir[u], fir[u] = pe++;
 33 }
 34 
 35 int sz[N], top[N], dis[N], son[N], fa[N], dfs_clock, seq[N], dfn[N], end[N], col[N];
 36 
 37 #define mid ((l + r) >> 1)
 38 struct Node {
 39     int L, R, ans;
 40     Node *ch[2];
 41 
 42     void set(int u) {
 43         ans = heap[u].query();
 44         L = R = heap[u].top();
 45     }
 46 
 47     void modify(int l, int r, int p);
 48 
 49 } pool_nodes[N * 3], *pn = pool_nodes, *rt[N];
 50 
 51 void print(Node *o, int l, int r) {
 52     printf("[%d, %d] : L = %d, R = %d, ans = %d\n", l, r, o->L, o->R, o->ans);
 53     if(l != r) print(o->ch[0], l, mid), print(o->ch[1], mid + 1, r);
 54 }
 55 void merge(Node &res, const Node &lhs, const Node &rhs, int l, int r) {
 56     res.ans = max(lhs.ans, rhs.ans);
 57     res.ans = max(res.ans, lhs.R + dis[seq[mid + 1]] - dis[seq[mid]] + rhs.L);
 58 
 59     res.L = max(lhs.L, dis[seq[mid + 1]] - dis[seq[l]] + rhs.L);
 60     res.R = max(rhs.R, dis[seq[r]] - dis[seq[mid]] + lhs.R);
 61 }
 62 
 63 void Node::modify(int l, int r, int p) {
 64     if(l == r) return set(seq[p]);
 65     if(p <= mid) ch[0]->modify(l, mid, p);
 66     else ch[1]->modify(mid + 1, r, p);
 67     merge(*this, *ch[0], *ch[1], l, r);
 68 }
 69 
 70 Node *build(int l, int r) {
 71     Node *o = pn++;
 72     if(l == r) o->set(seq[l]);
 73     else {
 74         o->ch[0] = build(l, mid);
 75         o->ch[1] = build(mid + 1, r);
 76         merge(*o, *o->ch[0], *o->ch[1], l, r);
 77     }
 78     return o;
 79 }
 80 #undef mid
 81 
 82 #define v it->to
 83 void dfs_size(int u) {
 84     sz[u] = 1, col[u] = 1;
 85     for(Edge *it = fir[u]; it; it = it->next) {
 86         if(v != fa[u]) {
 87             dis[v] = dis[u] + it->w;
 88             fa[v] = u;
 89             dfs_size(v);
 90             sz[u] += sz[v];
 91             if(sz[v] > sz[son[u]]) son[u] = v;
 92         }
 93     }
 94 }
 95 
 96 void dfs_build(int u, int pre) {
 97     seq[dfn[u] = ++dfs_clock] = u;
 98     top[u] = pre;
 99     end[pre] = max(end[pre], dfn[u]);
100     if(son[u]) dfs_build(son[u], pre);
101     for(Edge *it = fir[u]; it; it = it->next) {
102         if(v != fa[u] && v != son[u]) {
103             dfs_build(v, v);
104             heap[u].insert(rt[v]->L + dis[v] - dis[u]);
105         }
106     }
107 
108     heap[u].insert(0);
109     if(top[u] == u) {
110         rt[u] = build(dfn[u], end[u]);
111         st.insert(rt[u]->ans);
112     }
113 }
114 #undef v
115 
116 void modify(int u) { 
117     static int anc[20], tot;
118     tot = 0;
119     for(int t = u; t; t = fa[top[t]]) anc[tot++] = t;
120 
121     for(int i = tot-1; i >= 0; i--) {
122         st.erase(rt[top[anc[i]]]->ans);
123         if(i) heap[anc[i]].erase(rt[top[anc[i-1]]]->L + dis[top[anc[i-1]]] - dis[anc[i]]);
124     }
125     if(col[u]) heap[u].insert(0);
126     else heap[u].erase(0);
127 
128     for(int i = 0; i < tot; i++) {
129         int x = anc[i], t = top[x];
130         rt[t]->modify(dfn[t], end[t], dfn[x]);
131         st.insert(rt[t]->ans);
132         if(i+1 < tot) heap[anc[i+1]].insert(rt[t]->L + dis[t] - dis[anc[i+1]]);
133     }
134 }
135 
136 int main() {
137 #ifdef DEBUG
138     freopen("in.txt", "r", stdin);
139 #endif
140     int n; scanf("%d", &n);
141     for(int i = 1; i < n; i++) {
142         int u, v; scanf("%d%d", &u, &v);
143         AddEdge(u, v, 1), AddEdge(v, u, 1);
144     }
145     dfs_size(1);
146     dfs_build(1, 1);
147 
148     int m; scanf("%d", &m);
149     char opt[8]; int u, tot = n;
150     while(m--) {
151         scanf("%s", opt);
152         if(opt[0] == 'G') {
153             int ans;
154             if(tot == 0) ans = -1;
155             else if(tot == 1) ans = 0;
156             else ans = st.top();
157             printf("%d\n", ans);
158         } else {
159             scanf("%d", &u);
160             if(!(col[u] ^= 1)) tot--; else tot++;
161             modify(u);
162             
163         }
164     }
165 }
链分治

转载于:https://www.cnblogs.com/showson/p/5578611.html

相关文章:

伍六七带你学算法 入门篇-最小的k个数

java面试题-最小的k个数 难度-简单 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] …

伍六七带你学算法 进阶篇-三数之和

三数之和 难度-中等 题目&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

伍六七带你学算法 入门篇-链表的中间节点

力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;[1,2,3,4,5] 输出&#xff1a;此列表中的结点 3 (序列化形式&#xf…

伍六七带你学算法 入门篇-卡牌分组

力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题&#xff0c;提交通过率令人深思 &#xff0c;思考它是不是一道简单的题… 开始正题&#xff1a; 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌…

伍六七带你学算法 进阶篇-排序算法

给定一个整数数组 nums&#xff0c;将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;[5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;[5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 各排序算法解法如下&#xff1a; (如想要了解算法排序原理…

伍六七带你学算法 进阶篇-生命游戏

有趣的算法题–生命游戏 难度-中等 根据 百度百科 &#xff0c;生命游戏&#xff0c;简称为生命&#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 想要体验生命游戏的小伙伴可以到这里——>生命游戏 进入正题&#xff1a; 给定一个包含 m n 个格子的…

Linux下docker安装配置oracle,oracle创建用户并远程连接,实测可用!

最近在给同学弄毕业设计的数据库&#xff0c;因为oracle在个人电脑上极不稳定&#xff0c;所以他的电脑数据库崩溃了&#xff0c;这时候我就在docker上为他拉了一个oracle&#xff0c;解决了问题。 docker的安装共有以下几步&#xff0c;实测没问题&#xff0c;直接搬去永久可以…

plsql配置多数据源,想换哪个换哪个

现在的公司内部普遍使用plsql对数据库进行管理。而数据库非常多&#xff0c;从测试到线上环境数据库那么多&#xff0c;我们通常使用同一配置管理&#xff0c;便于切换。那么配置数据库连接就成为了很重要的一步。 1、安装plsql &#xff08;这里大家去下载安装一下&#xff0…

常见的几种网络抓包及协议分析工具

网络工程师必备技能-抓取网络数据。在本篇博客中,我们将集中记下几个问题进行探讨:Wireshark 是免费的抓取数据包、分析数据包的工具,兼容 Windows、Linux、Mac等主流平台。使用 wireshark 抓包需要的工具是:安装了 wireshark 的 PC。wireshark 抓包的范围是:抓取安装了 wireshark 的 PC 本机的网卡上流经的数据包。其中,网卡指的是 PC 上网使用的模块,常见的包括:以太网网卡、wifi 无线网卡,PC 分别使用它们用于连接以太网、wifi 无线网络。

一文搞懂网络OSI网络模型

在互联网技术里,有两件事最为重要,一个是TCP/IP协议,它是万物互联的事实标准;另一个是Linux操作系统,它是推动互联网技术走向繁荣的基石。在网络编程中最重要的模型便是OSI七层网络模型和TCP/IP四层网络模型七层模型,也称为OSI(Open System Interconnection)参考模型,是国际标准化(ISO)指定的一个用于计算机或通信系统间互联的标准体系。建立七层模型的主要目的是为解决各种网络互联时遇到的兼容性问题。

简单两步,spring aop上手即用即会

面向切面思想在于它的干净&#xff0c;对逻辑代码没有任何侵入性&#xff0c;只需要在想要切入的方法或者类之上加上自定义的注解即可。 首先&#xff0c;就是自定义一个注解&#xff1a; //这里我们定义一个名为 MyPointer 的注解 Documented Retention(RetentionPolicy.RUNTI…

手动将jar包导入pom依赖,让jar包适配本地maven项目

前言&#xff1a; Oracle对maven很久没有更新依赖&#xff0c;虽然19年更新了一版&#xff0c;但pom引入一直有错误。 我用的是oralce 12的依赖&#xff0c;虽然有jar包&#xff0c;但是依赖和pom没有适配&#xff0c;项目打包的时候还要去中央仓库去下载&#xff0c;而中央仓库…

浏览器兼容video视频播放的多种方法&视频在浏览器播放格式,视频浏览器播放格式演示

对于老版本的IE可以通过HTML5shiv来使不支持HTML5的浏览器支持HTML新标签video和audio标签。主要解决HTML5提出的新的元素不被IE6/IE7/IE8识别,这些新元素不能作为父节点包裹子元素,且不能应用CSS样式。让CSS 样式应用在未知元素只需执行 document.createElement(elementName) 即可实现。html5shiv的工作原理也就是基于此。

Linux通过端口号杀死指定进程

前言&#xff1a; 我们在服务器上升级项目的时候&#xff0c;需要将原来的项目停止&#xff0c;然后启动新的项目。 这时候我们只知道应用所占的端口号&#xff0c;如何将进程杀死呢&#xff1f; linux中杀进程时候&#xff0c;如果你是知道它所占用的端口号的话&#xff0c;可…

Linux/docker下oracle开启监听,开启自动启动

写在前头&#xff1a; 之前呢&#xff0c;使用docker安装了oracle&#xff0c;但它默认是会关闭的。使用了几天以后突然连接异常了&#xff0c;报的问题是oracle监听有问题了&#xff0c;我知道了是oracle服务自动关闭了&#xff0c;监听也跟着关了。所以我找了一些文章&#x…

手把手教你JavaEE的分页查询、分页展示,有了这个,你的项目又多了一个谈资

前言&#xff1a; 我们在写项目的时候&#xff0c;往往有一些项目的信息展示。而展示的数据量往往是很大的&#xff0c;这时候&#xff0c;加入一个分页的功能往往是最理想的选择。 先简单描述一下功能&#xff1a; 根据你的数据量和指定的页面展示数据条数&#xff0c;进行查…

一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓

前言&#xff1a;在最开始学习编程的时候&#xff0c;打开数据结构的书&#xff0c;最显眼的就是排序算法&#xff0c;什么堆排序、希尔排序&#xff0c;然后旁边写着最坏复杂度、最优复杂度、平均复杂度&#xff0c;是一些O(n)、O(logn)、O(n)。这时候我脑子想起一首歌——大朋…

什么是LinkedList?什么时候使用它呢?Java LinkedList结构、用法及源码解析

前言&#xff1a;我们学习java时都知道ArrayList实现List接口&#xff0c;LinkedList也实现List接口&#xff0c;但我们平时用的时候LinkedList却很少被用到。那么&#xff0c;LinkedList什么时候该用到呢&#xff1f;内部又是如何实现的呢&#xff1f;本文对此进行详细说明&am…

Myeclipse中修改项目默认编码还是乱码?一步永久解决!

在myeclipse中修改默认编码后发现项目还是乱码&#xff1f; 点击Windows选择Preferences 如下图&#x1f447; 点击General->Content Types->text->选择你要修改的文件类型->选择你要修改的编码格式 &#xff08;比如我这里是jsp页面乱码&#xff09;如下图&#…

Myeclipse中项目没有代码错误提示,jsp页面无编译迹象?如何解决

在使用Myeclipse开发项目时&#xff0c;发现jsp页面中嵌入的java代码没有编译的迹象&#xff0c;错误的get方法没有报错&#xff0c;没有报错信息我们如何知道我们开发的内容是正确的呢&#xff1f; 接下来就演示一下如何解决&#x1f449; 第一步&#xff0c;点击Project 选择…

伍六七带你学算法 入门篇 ——最大子序和

力扣 53. 最大子序和 难度简单 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xf…

伍六七带你学算法 入门篇——最后一个单词的长度

难度 简单 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s&#xff0c;返回其最后一个单词的长度。如果字符串从左向右滚动显示&#xff0c;那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&#xff1a;一个单词是指仅由字母组…

伍六七带你学算法 动态规划 ——不同路径

力扣 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。 问总共有多少条不…

大脑的漏洞:你是如何走向狭隘和顽固的?

但是,我们常常会切断这个链条,只记住最终的结论,忘记了支撑结论的一系列事实、论据、逻辑,从而,任由这个落单的、孤零零的「结论」不断飘摇,不断泛化和极端化。像我在之前的文章里,以及智识营里,都提出过一些比较颠覆性的观点,就经常能看到「难以置信」「感觉自己的世界被颠覆了」「我需要时间去理解和接受」的留言……大脑难以记住复杂的事实,所以,我们会倾向于把事实「压缩」成一个高密度的观点。例如:当你阅读我的文章时,一定不要只记住我给出的「根本原因」和「做法」,也要同时记住「这些原因是怎么来的」「这些做法背后的原理」。

伍六七带你学算法——被忽视的数学公式

中学时候学习那么多的数学&#xff0c;却没有人告诉我们这些数学公式我们以后会用到哪里&#xff1f;疑惑了十好几年&#xff0c;直到&#xff0c;你进入it行业&#xff0c;它的舞台来了&#xff01; 在力扣上有一道中度难度的题&#xff0c;题目是这样的&#x1f447; &#…

设置linux初始root密码

简单一步设置linux第一个root密码 sudo passwd root #输入当前账户密码 #输入准备设置的root密码 #确认密码如下所示&#xff1a;&#x1f447;

伍六七带你学算法——栈的使用

大家都知道栈这种数据结构&#xff0c;它有非常多的应用场景。但如果我们不经常接触这些应用场景的话&#xff0c;就可能不太熟悉栈的用法。 目录smd1.栈的创建和使用JAVA Stack类&#xff1a;2.栈的实际应用示范解题如下&#x1f447;1.栈的创建和使用 JAVA Stack类&#xff…

最优的去重处理——HashSet去重

算法与数据结构是密不可分的&#xff0c;我们使用不同的数据结构和算法的组合就是我们解决问题的答案。 本篇我将就HashSet的特性和使用进行介绍。 HashSet有哪些特性呢&#xff1f; HashSet继承了Set接口&#xff0c;Set接口有如下特性&#xff1a; 1.元素的无序性 &#xff…

什么是原码、反码、补码?什么是按位与?范围数字按位与!

前言&#xff1a;学过计算机基础的大家都知道什么是二进制&#xff0c;什么是“与”运算&#xff0c;这里先给大家复习一下。 举一个简单的例子&#xff1a; 5的二进制表示是0101&#xff08;补齐4位&#xff09; 7的二进制表示是0111&#xff08;补齐4位&#xff09; 那么5&a…

不占用多余空间实现值的交换——异或运算

首先什么是异或运算&#xff1f; ^规则&#xff1a; 0 ^ x x x ^ x 0那么 a 与 b 交换值如何做呢&#xff1f;&#xff1f;&#xff1f;三行代码&#x1f447; a a ^ b; b a ^ b; a a ^ b;第一步 a a ^ b 第二步 b &#xff08;a ^ b&#xff09;^ b a ^ 0 a …