st

c#堆栈的使用

心已入冬 提交于 2019-12-04 06:55:37
c#堆栈的使用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Test191112 { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push('A'); st.Push('B'); st.Push('C'); st.Push('D'); Console.WriteLine("当前堆栈:"); foreach(char c in st){ Console.Write(c+" "); } Console.WriteLine(); st.Push('E'); st.Push('F'); Console.WriteLine("栈Stat顶部的元素值是:{0}",st.Peek()); if (st.Contains('D')) { Console.WriteLine("栈中已经存在这个元素了!"); } else { st.Push('0'); } Console.WriteLine("当前堆栈:"); foreach (char c in st) { Console.Write(c +

HDU 3416 Marriage Match IV (最短路径&&最大流)

女生的网名这么多〃 提交于 2019-12-04 06:31:59
/* 题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条。这是一个有向图,建边的时候要注意!! 解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短路的题目接触过很多,反向建一个图,求两边最短路,即从src到任一点的最短路dis1[]和从des到任一点的最短路dis2[],那么假设这条边是(u,v,w),如果dis1[u] + w + dis2[v] = dis1[des],说明这条边是构成最短路的边。找到这些边,就可以把边的容量设为1,跑一边最大流即可。 ———————————————— 代码: 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<queue> 5 using namespace std; 6 const int maxn = 1005; 7 const int inf = 0x3f3f3f3f; 8 int t, u, v, w; 9 struct node 10 { 11 int u, v, w, next; 12 }edge[800005], e[100005]; 13 int head[maxn], dis[2][maxn], pre[2][maxn],level[maxn]; 14 bool vis

hdu5993/2016icpc青岛L

时光毁灭记忆、已成空白 提交于 2019-12-04 04:44:00
zz:https://www.cnblogs.com/ytytzzz/p/9674661.html 题意: 给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径 点10W,询问10W,询问相互独立 Solution: 考虑线段树/倍增维护树的直径 考虑一个点集的区间 [l, r] 而我们知道了有 l <= k < r, 且知道 [l, k] 和 [k + 1, r] 两个区间的最长链的端点及长度 假设两个区间的直径端点分别为 (l1, r1) 和 (l2, r2) 那么 [l, r] 这个区间的直径长度为 dis(l1, r1) dis(l1, l1) dis(l1, r2) dis(r1, l2) dis(r1, r2) dis(l2, r2) 六个值中的最大值 本题因为操作子树,所以我们维护dfs序的区间最长链即可 #include <stdio.h> #include <algorithm> using namespace std; const int N = 2e5 + 5; int T, n, m; int len, head[N], ST[20][N]; struct edge{int u, v, w;}ee[N]; int cnt, fa[N], log_2[N], st[N], en[N], dfn[N], dis[N], dep[N], pos[N];

RMQ问题及ST表

荒凉一梦 提交于 2019-12-04 04:14:13
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大、最小值的问题。很显然,如果暴力预处理的话复杂度为 \(O(n^2)\) ,而此类问题数据又往往很大,不仅会爆时间,数组也存不下。我们需要一种能够 \(O(n\log n)\) 甚至 \(O(n)\) 预处理的数据结构,这便是ST表。 ST表(Sparse Table,应译为S表)是一种可以以 \(O(n\log n)\) 的优秀复杂度预处理出静态区间上的最大、最小值的算法,其核心是倍增的思想。它使用 \(ST[i][j]\) 表示原数组中 \(i\rightarrow i+2^j-1\) 的区间的最值。那么在查询时,只用找出两点间的距离的最小2的整数幂,然后从区间起点与终点减去这个幂分别查找取最值即可,比如要查询 \(2\rightarrow 7\) ,就可以先查询 \(2\rightarrow 5\) ,再查询 \(4\rightarrow 7\) ,然后相比较即可。 题目 ST表模板 题目大意:求静态区间最大值。 代码 #include<bits/stdc++.h> using namespace std; int n, m; int ST[1000005][25]; int Read() { int x = 0, op = 1; char ch =

炮兵阵地

北战南征 提交于 2019-12-04 04:14:10
题目描述 司令部的将军们打算在N M的网格地图上部署他们的炮兵部队。一个N M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 输入格式 第一行包含两个由空格分割开的正整数,分别表示N和M; 接下来的N行,每一行含有连续的M个字符(‘P’或者‘H’),中间没有空格。按顺序表示地图中每一行的数据。N≤100;M≤10。 输出格式 仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。 输入 #1 5 4 PHPP PPHH PPPP PHPP PHHP 输出 #1 6 代码 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>

【算法#5】SparseTable

余生颓废 提交于 2019-12-04 04:07:06
Tarjan的SparseTable,即ST表,用于求RMQ区间最值问题。 我对ST表的时间复杂度是有所疑惑的,我认为查询并不能够达到O(1)的速度。也许只是常数?但是查询区间长度为n的时候就要对长度进行logn次调整,蓝书上写的是这样,我不太确定。 本质上,由于寻求区间最值的特性,在给定区间内多次覆盖是没有关系的,但是覆盖超过给定区间的操作是不合法的,所以我们建立一个数组储存从i点开始延伸 \(2^j\) 长度区间内的最小值。 对于每个区间,一定有 \(2^k\) 大于该区间长度的一半,于是我们找到这个k并且用两个这样长度不同起点的数据覆盖区间即可。 至于ST表的建立,递推方法是最简便的一种。首先,对于每个起点,j为零的时候其值为该点的值,然后对于j大于零,首先按j从小到大枚举,有: \[\text{st[i][j]=max(st[i][j-1],st[i+1<<j-1][j-1])}\] 递推要注意边界,避免越界。 板子贴在这里。 void prepare(){ for(int i=1;i<=n;i++) st[i][0]=a[i]; for(int j=1;1<<j<=n;j++) for(int i=1;i-1+(1<<j)<=n;i++) st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]); } int result(int l

Comet OJ - Contest #14题解

99封情书 提交于 2019-12-04 01:42:47
Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #define fo(a,b,c) for (a=b; a<=c; a++) #define fd(a,b,c) for (a=b; a>=c; a--) using namespace std; int x[100001]; int y[100001]; int n,i,j,k,l,X,Y,R,ans; int main() { // freopen("a.in","r",stdin); scanf("%d%d%d%d",&n,&X,&Y,&R); fo(i,1,n) scanf("%d%d",&x[i],&y[i]); fo(i,1,n) if (((long long)(x[i]-X)*(x[i]-X)+(long long)(y[i]-Y)*(y[i]-Y))<=(long long)R*R) ++ans; printf("%d\n",ans); } B 显然p和k是位置最靠边的两个 考虑一下i和n的位置(靠左/靠右/左右) code 比较丑 #include

LeetCode23. Merge k Sorted Lists

旧时模样 提交于 2019-12-04 00:39:13
  题目: 题目链接   题意:给出k个有序链表,返回一个合并后的有序链表。   思路:显而易见,每次遍历这个k个链表的表头,哪个最小就加入答案链表即可得到正确结果,但是这样做复杂度是爆炸的,对k个链表表头遍历一遍智能解决一个结点的排序问题,效率低下。     我们可以想到数据结构课程上学到的两个有序链表合并的问题,只需要O(n)的复杂度即可完成,且空间开销极小,只需要一个记录答案的头结点即可,那么这个问题能不能转化成简单的两个有序链表合并的问题呢,答案是可以的,参考归并排序,我们用二分的思想可以轻易的解决这一问题。   ac代码: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeKLists(vector<ListNode*>& lists) { 12 return divideLists(lists, 0, lists.size() - 1); 13 } 14 15 16 ListNode* divideLists

快速输入输出模板

梦想与她 提交于 2019-12-03 23:47:45
快速输入输出 indata() 输入函数 outdata()输出函数 在程序开头结尾调用。 ggt()返回0/1的opt poread()整形读入 powrite()整形输出带换行 namespace nfdata { const int BS = 1 << 24; const int SB = 1 << 22; char buf[BS], *st, *ed; char fub[SB], *bg = fub; inline void indata() { ed = buf + fread(st = buf, 1, BS, stdin); } inline void outdata() { fwrite(fub, 1, bg - fub, stdout); } inline unsigned char ggt() { register unsigned char x; while(!isdigit(x = (*st++))); return x == '1'; } template <typename Y> inline void poread(Y &res) { register int ret = 0; char ch; while (!isdigit(ch = (*st++))) ; do ret = ret * 10 + ch - '0'; while (isdigit(ch

[bzoj2286][Sdoi2011]消耗战

自作多情 提交于 2019-12-03 14:58:15
题目链接 如果对于每个询问跑一次$dp$,那么$dp[i]$为断开$i$这棵子树的最小花费。 这样的复杂度为$O(n*m)$,过于臃肿。 所以我们要对于每次询问降低这次询问的复杂度。 我们可以发现$m$个关键点,最多有$m-1$个$lca$。 简单证明一下,如果有两个点,会有$1$个$lca$点,如果有三个点,则第三个点会和上一个$lca$产生一个$lca$。 所以以这$2*m-1$个点构建一棵树,在这个树上跑$dp$ 虚树的构建推荐一个 巨巨的博客 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 250010; 5 const ll inf = 2e18 + 10; 6 struct node { 7 int s, e, next; 8 ll w; 9 }edge[maxn * 2]; 10 int head[maxn], len; 11 void init() { 12 memset(head, -1, sizeof(head)); 13 len = 0; 14 } 15 void add(int s, int e, ll w) { 16 edge[len] = { s,e,head[s],w }; 17 head[s] = len++;