st

用栈求算术表达式的值

青春壹個敷衍的年華 提交于 2019-11-28 16:17:33
题目:1 将中缀表达式转换为后缀表达式 2 求后缀表达式的值 #include<stdio.h> #define MaxSize 100 struct { char data[MaxSize]; int top; //栈顶指针 }op; //定义运算符栈 struct { float data[MaxSize]; int top; }st; //定义数值栈 void trans(char exp[],char postexp[]) { int i = 0; int j = 0; char ch; op.top = -1; //栈顶指针初始化为-1 ch = exp[i]; i++; while (ch != '\0') { switch (ch) { case '(': //判定为左括号 直接入栈 op.top++; op.data[op.top] = ch; break; case ')': while (op.data[op.top] != '(') { postexp[j] = op.data[op.top]; op.top--; j++; } op.top--; //左括号也出栈 但不输出 break; case '+': case '-': //为 + 或者 - 时候,优先级不大于栈顶任何运算符的优先级 直到 ) while (op.top != -1 && op

「ST表」学习笔记

末鹿安然 提交于 2019-11-28 14:01:52
ST表 ST表是解决 RMQ (区间最值) 问题 的经典算法。 时间复杂度上 \(O(nlog(n))\) 预处理, \(O(1)\) 处理询问。 但是ST表只能用于求 静态区间最值 ,动态区间还是需要线段树等算法。 基本原理 ST表基于倍增思想,实质是DP 考虑DP 如果用 \(f[i][j]\) 表示区间 \([i,j]\) 中的最值,显然 \(f[i][j]=max/min(f[i][j-1],a_j)\) ,这样有 \(O(n^2)\) 的复杂度,但仍不够优秀。 那么如何优化呢? 接下来就是ST表了,区间最值有一个重要的性质——max操作允许两个区间重叠,即可以用两个覆盖大区间的小区间推出一个大的区间的最值,这里就要利用倍增的思想。 我们用 \(f[i][j]\:(n*\log_2(n))\) 表示从第 \(i\) 个数开始,连续 \(2^j\) 个数中的最值,即区间 \([i,i+2^j-1]\) 中的最值。 有: \(f[i][0]=a_i\) \(f[i][j]=max/min(f[i][j-1],f[i+2^{j-1}][j-1])\) 那么DP转移方程是怎么来的呢? 根据定义, \(f[i][j]\) 表示的是 \([i,i+2^j-1]\) 的最值, \([i,i+2^j-1]\) 就要用 \([i,i+2^{j-1}-1]\) 和 \([i+2^{j-1},i

【二分图】【XSY2508】Fairy

南楼画角 提交于 2019-11-28 13:08:47
\(Description\) 给定 \(n\) 个点, \(m\) 条边的无向图(无自环),可以从图中删除一条边,问删除哪些边可以使图变成一个二分图。 \(Input\) 第 \(1\) 行包含两个整数 \(n,m\) ,分别表示点数和边数。 第 \(2~m+1\) 行每行两个数 \(x,y\) ,表示有一条边连接点 \(x,y\) 。 \(Output\) 第一行两个整数,表示能删除的边的个数。 接下来一行按照从小到大的顺序输出能删除的边的编号。 \(Sample Input\) 4 4 1 2 1 3 2 4 3 4 \(Sample Output\) 4 1 2 3 4 \(Hint\) \(10\%\) 的数据, \(n,m<=10\) \(40\%\) 的数据, \(n,m<=1000\) \(70\%\) 的数据, \(n,m<=100000\) \(100\%\) 的数据, \(n,m<=2000000\) 思路 我们看到题目,发现跟判断是否为二分图有关 我们知道,可以通过判断是否存在奇环来判断是否为二分图,而这个判断可以通过 \(col\) 染色来维护,如果相邻两个节点颜色相同,就是奇环 我们需要删掉一条边使得新图是二分图,就要使所有奇环被破坏,即 删除的这条边为所有奇环的共边 于是,我们设 \(tot\) 为奇环的总个数,设一个数组 \(num[u]\)

炮兵阵地[状态压缩DP]

末鹿安然 提交于 2019-11-28 11:14:00
看到这一道题其实和玉米田很类似,只不过多记录了前两行,其他大体细节差不多,注意滚动数组 似乎不滚动更快??? Code #include<bits/stdc++.h> using namespace std; const int N=105; struct state{ int num[105],a[105]; }st[105]; int n,m; char s[15]; int f[3][105][105]; void getstate(int k,char *s){ int t=0; for(int i=1;i<=m;i++){ t<<=1; if(s[i]=='H') t++; } for(int i=0;i<(1<<m);i++){ if((i&(i<<1))||(i&(i>>1))||(i&(i<<2))||(i&(i>>2))||(i&t)) continue; st[k].a[++st[k].a[0]]=i; for(int j=1;j<=(1<<m);j<<=1) if(i&j)++st[k].num[st[k].a[0]]; } } inline void dp(){ memset(f,-0x3f,sizeof(f)); f[0][0][0]=0; for(int j=1;j<=st[1].a[0];j++) f[1][j][0]=st[1].num[j];

列表、元组、字典

谁都会走 提交于 2019-11-28 10:57:48
列表def append(self, p_object):     '''在列表末尾添加一个元素'''l2 = [20,40,70,100]l2.append(1)l2.append(2)l2.append(3)print(l2)[20, 40, 70, 100, 1, 2, 3] def count(self, value):    '''总计一个元素在列表中出现的次数''' l2 = [20,40,70,100,20,70,80,20]print(l2.count(20))3 def extend(self, iterable):    '''向列表里添加多个元素或另一个列表''' #1l1 = [2,4,7,10]l2 = [20,40,70,100,20,70,80,20]l2.extend(l1)print(l2)[20, 40, 70, 100, 20, 70, 80, 20, 2, 4, 7, 10]#2 l2 = [20,40,70,100,20,70,80,20]l2.extend('qwer')print(l2)[20, 40, 70, 100, 20, 70, 80, 20, 'q', 'w', 'e', 'r'] def index(self, value, start=None, stop=None):      ''

HDU_6695 Welcome Party 【思维】

女生的网名这么多〃 提交于 2019-11-28 10:57:48
一、题目    Welcome Party 二、分析   最开始的时候分析错了,认为只要找两个类型中的最小差值就可以了,忽略了是求两个类型中最大值的最小差值。   那么可以对第一个类型进行从大到小排序,枚举这个类型的最大值,那么,枚举过的这个类型的人就不再选这个类型的值,而是选第二类型。   考虑对第二个类型处理,枚举过的需要维护一个最大值,对于底下还没枚举的,需要维护一个有序的序列,方便查找,如果还没枚举到的需要找到最接近当前枚举的这个值,用$multiset$维护,二分找时可能找不到,也可能找到后是比这个值小的那个更优,这里要处理一下。   对于取绝对值,$abs$用于整型,$fabs$用于浮点型,一直WA的原因也是这里。 三、AC代码 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 #define ll long long 5 #define Min(a,b) ((a)>(b)?(b):(a)) 6 #define Max(a,b) ((a)>(b)?(a):(b)) 7 #define P pair<int, int> 8 const int MAXN = 1e5 + 13; 9 struct node { 10 ll x, y; 11 bool operator < (const node &t) { 12

查询SQL时间段内执行过的哪些SQL语句

冷暖自知 提交于 2019-11-28 10:41:36
SELECT TOP 1000 QS.creation_time, SUBSTRING(ST.text, (QS.statement_start_offset / 2) + 1, ((CASE QS.statement_end_offset WHEN - 1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offset END - QS.statement_start_offset) / 2) + 1) AS statement_text, ST.text, QS.total_worker_time, QS.last_worker_time, QS.max_worker_time, QS.min_worker_time FROM sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST WHERE QS.creation_time BETWEEN '2019-08-24 11:27:16' AND '2019-08-24 18:00:00' AND ST.text LIKE '%emw_skzy101..M_WMS_SU_HIS%' ORDER BY QS.creation_time DESC 来源: https://www.cnblogs

P5022 旅行

耗尽温柔 提交于 2019-11-28 06:14:11
—————————————————————————————————————————————————— 给了最近怀疑码力的我一片希望,竟然一A了 (如果除去在loj上忘了加fre与在洛谷上忘了删fre) 暴力基环树,n^2logn 好吧当我没说,洛谷上MLE了 怎么这么毒瘤,空间这么小 ———————————————————————————————————————————————— #include<bits/stdc++.h> using namespace std; int ne,a,b,n,m,head[15000],colar[15000],dd[15000][2],flg=0,tot=0,pos=1,tn=0; int ans[5001],last[5001]; int ma[5001][5001],bol[5001][5001]; struct node{int to,nxt;}eg[15000]; void adde(int u,int v){eg[++ne].to=v;eg[ne].nxt=head[u];head[u]=ne;} int cmp(int a,int b){return a<b;} stack<int>st; void dfs(int u,int fa) { cout<<u<<" "; int cnt=0; for(int i=head[u];i;i

2019 Multi-University Training Contest 10 - Make Rounddog Happy

假如想象 提交于 2019-11-28 06:14:09
分治 + ST表 先预处理出区间内最大值的位置和每个数向左和向右能够延伸的最大距离。 然后把每个区间的最大值的位置当成中点来分治统计每个数的贡献。 统计的时候选区间较短的统计,类似于启发式合并? #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) #define __fastIn ios::sync_with_stdio(false), cin.tie(0) #define pb push_back using namespace std; using LL = long long; inline int lowbit(int x){ return x & (-x); } inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret; } template <typename A> inline A _

P3952 时间复杂度

孤人 提交于 2019-11-28 04:08:32
—————————————————————————————————————————————————— noip罕见的纯模拟题,细节还是很多的 虽然没有看题解,但也错了很多地方 1,Yes与YES 2,ERR与Err,这个真的毒瘤,一个全大写一个却不是 3,ERR后向栈中添加元素防止RE 4,最后判断栈空、 ————————————————————————————————————————- #include<bits/stdc++.h> using namespace std; int t,lne,flg[500],num[500]; char ch[100]; stack<int>st,bl; int main() { cin>>t; while(t--) { memset(flg,0,sizeof(flg)); memset(num,0,sizeof(num)); while(!st.empty())st.pop(); while(!bl.empty())bl.pop(); int tag=0,lj=0,tab=0,nowtab=0; cin>>lne>>ch; if(lne%2!=0)lj=1; if(ch[2]-'0'!=1)for(int i=4;i<strlen(ch)-1;i++)tag=tag*10+ch[i]-'0'; while(lne--) { char a,b