
acm_数据结构
GrimCake
这个作者很懒,什么都没留下…
展开
-
NYOJ-2 括号配对问题
#include#include#includeusing namespace std;char str[10001];int main(){ int T,flag; cin>>T; while(T--) { flag=1; stacks; memset(str,0,sizeof(str)); cin>>str; for(int i=0;str[i]!=0;i原创 2017-03-18 22:35:03 · 288 阅读 · 0 评论 -
codeforces-914D Bash and a Tough Math Puzzle(线段树维护gcd)
链接:http://codeforces.com/problemset/problem/914/D题意:给定一个序列,给出两种操作1 l r x表示判断l到r区间内能否通过改变一个数字使得该区间的gcd=x,2 i y把第i个数改为y题解:通过这道题才知道gcd也是有区间性质的,那么就是一道普通的单点修改加区间查询了。可以通过判断递归到叶子判断该数能否整除x,不能的话返回1进行累加,要注意的是当一...原创 2018-04-08 23:43:53 · 219 阅读 · 0 评论 -
codeforces-915F Imbalance Value of a Tree(并查集+树上统计)
链接:http://codeforces.com/problemset/problem/915/F题意:树上每一个点有一个点权,求树上所有的路径的(最大点权值-最小点权值)之和题解:可以考虑先求出所有路径中最大点权值之和。显然,每一个点都能对一些路径产生贡献,我们可以先按点权从小到大排序,然后每次取一个点,那么所取的点就是在当前已取出的点中最大的。用并查集维护之前取出的在不同子树中的点以及数量,并...原创 2018-04-05 20:51:37 · 288 阅读 · 0 评论 -
codeforces-501B Misha and Changing Handles(map)
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<map>using namespace std;int n;map<string, string> ma;map<string, int>原创 2018-05-18 15:29:26 · 231 阅读 · 0 评论 -
codeforces-706D (异或trie树)
题意:给定一种集合支持一下操作1.加入一个数2.删除一个数3.给定一个数,在集合中找出一个数,使得这两个数异或值最大,输出最大值题解: 这道题可以作为异或trie树的模板题。把每一个数扩充成30位从最高位开始建树,删除的操作是为每一个节点保存一个值,如果该值不为0说明该节点存在,否则不存在。查询的时候从最高位开始,0对1,1对0进行查找,最后的结果一定是最优的。代码:#include<...原创 2018-05-19 22:25:28 · 294 阅读 · 0 评论 -
codeforces-61E (线段树求三元逆序对)
题意:给出一个序列,求三元逆序对题解:枚举中间的数就好了,那么结果就是它左边大于它的数的个数*右边小于它的数的个数,和求线段树二元逆序对的方法是一样的。线段树求二元逆序对方法:首先离散化,从左往右扫一遍序列,每一次查询区间(a[i], n)的和,然后更新使a[i]叶子的值自增1。#include<iostream>#include<cstring>#include<...原创 2018-06-14 11:12:20 · 719 阅读 · 0 评论 -
codeforces-220B(莫队+离散化)
题目链接:http://codeforces.com/problemset/problem/220/B题意:给一段长为n的序列和m个关于区间的询问,求出每个询问的区间中有多少种数字是 该种数字出现的次数等于该数字 的。题解:莫队算法,因为数字很大所以要离散化然后记录一下原来的数字,不能用map记录会超时,map是多带一个log的。代码:#include<iostream>#inclu...原创 2018-06-08 09:36:35 · 475 阅读 · 0 评论 -
bzoj 1012: [JSOI2008]最大数maxnumber(线段树)
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int M;long long D;long long t = 0;int cnt;struct node{ int l, r; long long ma;}s[200010*4]...原创 2018-07-17 15:39:23 · 243 阅读 · 0 评论 -
codeforces-191C (树链剖分+边的区间修改)
题意:给出一棵树,每次可以使任意两点间的路径的权值加1,最后求出每条边的权值题解:可以作为基于边权的树链剖分的模板,有个技巧是用eg数组来将边的序号和点关联起来代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace st...原创 2018-07-14 13:37:57 · 708 阅读 · 0 评论 -
UVa-673 Parentheses Balance(栈模拟)
简单括号匹配问题#include#include#include#include using namespace std;stack st;char arr[130];int main(){ int T; cin>>T; getchar(); while(T--){ while(st.size()) st.pop(); gets(arr); int len原创 2017-08-29 22:12:01 · 419 阅读 · 0 评论 -
UVa-133 The Dole Queue(约瑟夫环)
题意:為了縮短領救濟品的隊伍,NNGLRP決定了以下策略:每天所有來申請救濟品的人會被放在一個大圓圈,面朝裡面。選定一個人為編號 1 號,其他的就從那個人開始逆時針開始編號直到 N。一個官員一開始逆時針數,數 k 個申請者,然後另一個官員第 N 個始順時針方向數 m 個申請者,這兩個人就被送去再教育。如果兩個官員數的是同一個人,那個人則被送去從政,然後2個官員再在剩下的人裡面繼續選直到沒人剩下來,原创 2017-08-29 12:08:34 · 388 阅读 · 0 评论 -
Luogu-p1996约瑟夫问题(循环队列)
#include#includeusing namespace std;int main(){ queue q; int n,m,k=0,h; cin>>n>>m; for(int i=1;i<=n;i++){ q.push(i); } h=1; while(k<n){ if(h!=m){ q.push(q.front()); q.pop(); h+原创 2017-04-07 21:03:34 · 508 阅读 · 0 评论 -
UVa-11995 I Can Guess the Data Structure!(STL的使用)
#include#include#includeusing namespace std;int main(){ int n; int op,value; while(scanf("%d",&n)!=EOF){ priority_queue p_que; queue que; stack sta; int flag_s=1,flag_q=1原创 2017-03-22 17:54:46 · 384 阅读 · 0 评论 -
Luogu-p1090 合并果子(优先队列)
每次取出两个优先队列中最小的合并 然后再加入队列中#include#include#includeusing namespace std;priority_queue,greater > q;//取最小的优先队列int main(){ int n,a,x,y; cin>>n; for(int i=0;i<n;i++){ cin>>a; q.push(a); } in原创 2017-03-30 23:02:27 · 411 阅读 · 0 评论 -
UVa-11988(数组模拟链表)
题目大意:你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下。给你一段按键的文本,其中'['表示Home键,']'表示End键,输出这段悲剧的文本。如:abc[de]f 则输出deabcf分析:用next[k]来表示k的下一个字符的序号,cur表示当前字符序号,last表示最后一个字符序号。下面一步步来讲解怎么做首先,为了方便起见,输入的字符串从s+1开始,即s原创 2017-08-11 16:41:39 · 376 阅读 · 0 评论 -
UVa-11136 Hoax or what(优先队列或multiset)
题意:活动天数为n, 每天有k张小票, 每一天奖品的价值为最大的小票减最小的小票, 同时删除这两张小票。问n天的奖品总价值是多少。考察set的基本用法#include#include#includeusing namespace std;multiset q;int n, k, a;int main(){ while(scanf("%d", &n)==1 && n!=0)原创 2017-08-11 21:07:19 · 385 阅读 · 0 评论 -
UVa-11987 Almost union-find(带删除操作的并查集)
题意:有三种操作:1 p q:合并元素p和q所在集合2 p q:把元素p移动到q所在集合3 p :输出p所在集合元素个数和该集合所有元素之和分析:这道题考察了并查集的删除操作以及统计并查集元素和, 对于每一个集合,我们只需要考虑根节点root号位置,注意find查找到的是根节点的位置,实际根节点有可能不在这里,用cnt[root]和sum[root]来代表该集合元素个数与元素之原创 2017-08-12 14:15:42 · 596 阅读 · 1 评论 -
UVa-127 "Accordian" Patience(栈+模拟链表)
题目大意:给出52张牌(52堆),从左到右,如果一张牌和他左边第一张牌或左边第三张牌匹配(匹配的含义是点数或者花色相同),就把它移动到左边第一张或第三张上面,如果同时匹配则移动到左边第三张上面,这张牌可以一直移动一直到无法匹配为止。如果有一堆牌移空了,则把后面的堆往前挪填补这个位置。最后输出牌的堆数和每堆牌的牌数。#include#include#includeusing namespa原创 2017-08-28 17:46:24 · 410 阅读 · 0 评论 -
UVa-101 The Blocks Problem(栈模拟)
题意:给出n个数字(0到n-1),有四种操作:move a onto b: 把a上的数字回到初始位置,把b上的数字回到初始位置,把a移动到b上move a over b:把a上的数字回到初始位置,把a移动到b上move a onto b:把b上的数字回到初始位置,把a和a上的数字一起移动到b上,a和a上的数字顺序不变move a over b:把a和a上的数字一起移动到b上最顶层原创 2017-08-28 23:26:25 · 377 阅读 · 0 评论 -
1106: [POI2007]立方体大作战tet(树状数组)
题意:有n种数字的牌叠成一堆,每种数字有两个。相邻相同的数字可以消去,每次只能交换相邻两个数字,消去某种数字后上面的牌会落下,因此可能产生连锁反应。问最少交换几次使所有牌都消去。题解:有几种情况第一种: 1.....1 2.....2这样先消1和先消2一样第二种:1212 同上,并且只用消一个第三种: 1 2 ....2 1 显然先消2更优分析可得,每种数字记录中间有多少...原创 2018-08-05 11:07:56 · 351 阅读 · 0 评论