清北学堂学习总结 day1 数据结构 练习
1.二叉搜索树
STL set直接做就可以了
2.树状数组+差分数列:
codevs 1081 线段树练习 2
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 3
5
数据范围
1<=n<=100000
1<=q<=100000
代码:
- #define N 100100
- #include<iostream>
- #include<cstdio>
- using namespace std;
- #include<cstring>
- int a[N],b[N],n,q,l,r,x,p;
- long long tree[N];
- void build_tree(int k,int m)
- {
- while(k<=n)
- {
- tree[k]+=m;
- k+=((-k)&k);
- }
- }
- long long query(int k)
- {
- long long ans=;
- while(k)
- {
- ans+=tree[k];
- k-=((-k)&k);
- }
- return ans;
- }
- void input()
- {
- scanf("%d",&n);
- a[]=;
- for(int i=;i<=n;++i)
- {
- scanf("%d",&a[i]);
- b[i]=a[i]-a[i-];
- build_tree(i,b[i]);
- }
- }
- int main()
- {
- input();
- scanf("%d",&q);
- for(int i=;i<q;++i)
- {
- scanf("%d",&x);
- if(x==)
- {
- scanf("%d%d%d",&l,&r,&p);
- build_tree(l,p);
- build_tree(r+,-p);
- }
- else
- {
- scanf("%d",&p);
- cout<<query(p)<<endl;
- }
- }
- return ;
- }
3.ST表
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 43893 | Accepted: 20585 | |
Case Time Limit: 2000MS |
Description
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
Input
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
Output
Sample Input
- 6 3
- 1
- 7
- 3
- 4
- 2
- 5
- 1 5
- 4 6
- 2 2
Sample Output
- 6
- 3
- 0
题意:查询一个区间的最大值最小值,输出二者的差
- #include<iostream>
- #define N 50101
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int hige[N],n,q,l,r;
- #define K 17
- int min_rmq[N][K+];
- int max_rmq[N][K+];
- int ff[(<<K)+];
- void input()
- {
- scanf("%d%d",&n,&q);
- for(int i=;i<=n;++i)
- scanf("%d",&hige[i]);
- }
- void pre_chuli()
- {
- for(int i=;i<=n;++i)
- {
- min_rmq[i][]=hige[i];
- max_rmq[i][]=hige[i];
- }
- for(int j=;j<=K;++j)
- for(int i=;i+(<<j)-<=n;++i)
- {
- min_rmq[i][j]=min(min_rmq[i][j-],min_rmq[i+(<<j-)][j-]);
- max_rmq[i][j]=max(max_rmq[i][j-],max_rmq[i+(<<j-)][j-]);
- }
- memset(ff,-,sizeof(ff));
- ff[]=;
- for(int i=;i<=K;++i)
- ff[<<i]=i;
- for(int i=;i<=(<<K);++i)
- if(ff[i]==-)
- ff[i]=ff[i-];
- }
- int max_query(int l,int r)
- {
- int t=ff[r-l+];
- return max(max_rmq[l][t],max_rmq[r-(<<t)+][t]);
- }
- int min_query(int l,int r)
- {
- int t=ff[r-l+];
- return min(min_rmq[l][t],min_rmq[r-(<<t)+][t]);
- }
- int main()
- {
- input();
- pre_chuli();
- for(int i=;i<=q;++i)
- {
- scanf("%d%d",&l,&r);
- printf("%d\n",max_query(l,r)-min_query(l,r));
- }
- return ;
- }
4.trie树
cojs 173. 词链
★☆ 输入文件:link.in
输出文件:link.out
简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
给定一个仅包含小写字母的英文单词表,其中每个单词最多包含 50 个字母。
如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了一个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。
数据保证给定的单词表中,单词互不相同,并且单词按字典顺序排列。
【输入格式】
第一行一个整数 n ,表示单词表中单词数。
下接 n 行每行一个单词。
【输出格式】
一个整数,表示最长词链长度。
【输入输出样例】
输入:
link.in
5
i
int
integer
intern
internet
输出:
link.out
4
【数据范围】
50% 的数据, n<=1000
100% 的数据, n<=10000
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #define N 10100
- int n;
- int ans=;
- int topt=;
- #define L 51
- struct Trie{
- int nxt[];
- int cnt;
- }trie[L];
- void dfs(int k,int pre_ans)
- {/*dfs统计单词数目*/
- for(int i=;i<;++i)
- if(trie[k].nxt[i])
- {
- dfs(trie[k].nxt[i],pre_ans+trie[k].cnt);
- }
- ans=max(pre_ans+trie[k].cnt,ans);
- }
- void build(char *str)
- {
- int now=;
- while(*str)
- {
- if(!trie[now].nxt[*str-'a'])
- trie[now].nxt[*str-'a']=++topt;
- now=trie[now].nxt[*str-'a'];
- str++;
- }
- trie[now].cnt++;/*建树*/
- }
- void input()
- {
- scanf("%d",&n);
- for(int i=;i<=n;++i)
- {
- char s[L];
- scanf("%s",s);
- build(s);
- }
- dfs(,);
- printf("%d\n",ans);
- }
- int main()
- {
- freopen("link.in","r",stdin);
- // freopen("link.out","w",stdout);
- input();
- // fclose(stdin);fclose(stdout);
- return ;
- }
5.并查集--加权并查集
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 60173 | Accepted: 17627 |
Description
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这N个动物所构成的食物链关系进行描述:
第一种说法是"1 X Y",表示X和Y是同类。
第二种说法是"2 X Y",表示X吃Y。
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话。
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。
Input
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y。
Output
Sample Input
- 100 7
- 1 101 1
- 2 1 2
- 2 2 3
- 2 3 3
- 1 1 3
- 2 3 1
- 1 5 5
Sample Output
- 3
Source
- /*Part I - 权值(relation)的确定。
- 我们根据题意,森林中有3种动物。A吃B,B吃C,C吃A。
- 我们还要使用并查集,那么,我们就以动物之间的关系来作为并查集每个节点的
- 权值。
- 注意,我们不知道所给的动物(题目说了,输入只给编号)所属的种类。
- 所以,我们可以用动物之间“相对”的关系来确定一个并查集。
- 0 - 这个节点与它的父节点是同类
- 1 - 这个节点被它的父节点吃
- 2 - 这个节点吃它的父节点。
- 注意,这个0,1,2所代表的意义不是随便制定的,我们看题目中的要求。
- 说话的时候,第一个数字(下文中,设为d)指定了后面两种动物的关系:
- 1 - X与Y同类
- 2 - X吃Y
- 我们注意到,当 d = 1的时候,( d - 1 ) = 0,也就是我们制定的意义
- 当 d = 2的时候,( d - 1 ) = 1,代表Y被X吃,也是我们指定的意义。
- 所以,这个0,1,2不是随便选的
- Part II - 路径压缩,以及节点间关系确定
- 确定了权值之后,我们要确定有关的操作。
- 我们把所有的动物全初始化。
- struct Animal
- {
- int num; //该节点(node)的编号
- int parent; //该node的父亲
- int relation; //该node与父节点的关系,0同类,1被父节点吃,2吃父节点
- }; Animal ani[50010];
- 初始化为
- For i = 0 to N do
- ani[i].num = i;
- ani[i].parent = i;
- ani[i].relation = 0 ; //自己和自己是同类
- End For
- (1)路径压缩时的节点算法
- 我们设A,B,C动物集合如下:(为了以后便于举例)
- A = { 1 , 2 , 3 ,4 ,5 }
- B = { 6 , 7 , 8 ,9 ,10}
- C = { 11, 12, 13,14,15}
- 假如我们已经有了一个集合,分别有3个元素
- SET1 = {1,2},我们规定集合中第一个元素为并查集的“代表”
- 假如现在有语句:
- 2 2 6
- 这是一句真话
- 2是6的父亲
- ani[6].parent = 2;
- ani[6].relation = 1;
- 那么,6和1的关系如何呢?
- ani[2].parent = 1;
- ani[2].relation = 0;
- 我们可以发现6与2的关系是 1.
- 通过穷举我们可以发现
- ani[now].parent = ani[ani[now].parent].parent;
- ani[now].relation = ( ani[now].relation + ani[now.parent].relation ) % 3;
- 这个路径压缩算法是正确的
- 关于这个路径压缩算法,还有一点需要注意的地方,我们一会再谈
- 注意,根据当前节点的relation和当前节点父节点的relation推出
- 当前节点与其父节点的父节点的relation这个公式十分重要!!
- 它推不出来下面都理解不了!!自己用穷举法推一下:
- 好吧,为了方便伸手党,我给出穷举过程
- i j
- 爷爷 父亲 儿子 儿子与爷爷
- 0 0 (i + j)%3 = 0
- 0 1 (i + j)%3 = 1
- 0 2 (i + j)%3 = 2
- 1 0 (i + j)%3 = 1
- 1 1 (i + j)%3 = 2
- 1 2 (i + j)%3 = 0
- 2 0 (i + j)%3 = 2
- 2 1 (i + j)%3 = 0
- 2 2 (i + j)%3 = 1
- 嗯,这样可以看到,( 儿子relation + 父亲relation ) % 3 = 儿子对爷爷的relation
- 这就是路径压缩的节点算法
- (2) 集合间关系的确定
- 在初始化的时候,我们看到,每个集合都是一个元素,就是他本身。
- 这时候,每个集合都是自洽的(集合中每个元素都不违反题目的规定)
- 注意,我们使用并查集的目的就是尽量的把路径压缩,使之高度尽量矮
- 假设我们已经有一个集合
- set1 = {1,2,7,10}
- set2 = {11,4,8,13},每个编号所属的物种见上文
- set3 = {12,5,4,9}
- 现在有一句话
- 2 13 2
- 这是一句真话,X = 13,Y = 2
- 我们要把这两个集合合并成一个集合。
- 直接
- int a = findParent(ani[X]);
- int b = findParent(ani[Y]);
- ani[b].parent = a;
- 就是把Y所在集合的根节点的父亲设置成X所在集合的根节点。
- 但是,但是!!!!
- Y所在集合的根结点与X所在集合的根节点的关系!!!要怎么确定呢?
- 我们设X,Y集合都是路径压缩过的,高度只有2层
- 我们先给出计算的公式
- ani[b].relation = ( 3 - ani[Y].relation + ( d - 1 ) + ani[X].relation) % 3;
- 这个公式,是分三部分,这么推出来的
- 第一部分,好理解的一部分:
- ( d - 1 ) :这是X和Y之间的relation,X是Y的父节点时,Y的relation就是这个
- 3 - ani[Y].relation = 根据Y与根节点的关系,逆推根节点与Y的关系
- 这部分也是穷举法推出来的,我们举例:
- j
- 子 父相对于子的relation(即假如子是父的父节点,那么父的relation应该是什么,因为父现在是根节点,所以父.relation = 0,我们只能根据父的子节点反推子跟父节点的关系)
- 0 ( 3 - 0 ) % 3 = 0
- 1(父吃子) ( 3 - 1 ) % 3 = 2 //父吃子
- 2(子吃父) ( 3 - 2 ) % 3 = 1 //子吃父,一样的哦亲
- ——————————————————————————————————————————————————————
- 我们的过程是这样的:
- 把ani[Y],先连接到ani[X]上,再把ani[Y]的根节点移动到ani[X]上,最后,把ani[Y]的根节点移动到ani[X]的根节点上,这样算relation的
- 还记得么,如果我们有一个集合,压缩路径的时候父子关系是这么确定的
- ani[爷爷].relation = ( ani[父亲].relation + ani[儿子].relation ) % 3
- 我们已知道,( d - 1 )就是X与Y的relation了
- 而 (3 - ani[Y].relation)就是 以Y为根节点时,他的父亲的relation
- 那么
- 我们假设把Y接到X上,也就说,现在X是Y的父亲,Y原来的根节点现在是Y的儿子
- Y的relation + ani[Y]根节点相对于ani[Y]的relation
- ( ( d - 1 ) + ( 3 - ani[Y].relation) ) % 3
- 就是ani[Y]的父亲节点与ani[X]的relation了!
- 那么,不难得到,ani[Y]的根节点与ani[X]根节点的关系是:
- ( ( d - 1 ) + ( 3 - ani[Y].relation) + ani[X].relation ) % 3 ->应用了同余定理
- 注意,这个当所有集合都是初始化状态的时候也适用哦
- 还是以最开头我们给的三个集合(分别代表三个物种)为例
- 2 1 6
- 带入公式
- ani[6].relation = ( ( 2 - 1 ) + ( 3 - 0 ) + 0 ) % 3 = 1
- 也就是,6被1吃
- Part III - 算法正确性的证明
- 首先,两个自洽的集合,合并以后仍然是自洽的
- 这个不难想吧,数学上有个什么对称性定理跟他很像的。
- 如果理解不了,就这么想!!
- 当set1和set2合并之后,set2的根节点得到了自己关于set1根节点的
- 正确relation值,变成了set1根节点的儿子,那么
- set2的所有儿子只要用
- ( ani[X].relation + ani[Y].relation ) % 3就能得到自己正确的relation值了
- 所以说,针对不在同一集合的两个元素的话,除非违背了(2)和(3),否则永远是真的
- (无论这句话说的是什么,我们都可以根据所给X,Y推出两个子节点之间应有的关系,这个关系一确定,所有儿子的关系都可以确定)
- 其实所有的不同集合到最后都会被合并成一个集合的。
- 我们只要在一个集合中找那些假话就可以了。
- 首先,如何判断
- 1 X Y是不是假话。//此时 d = 1
- if ( X 和 Y 不在同一集合)
- Union(x,y,xroot,yroot,d)
- else
- if x.relation != y.relation ->假话
- 其次,如何判断
- 2 X Y是不是假话 //此时d = 2
- if ( X 和 Y 不在同一集合)
- Union(x,y,xroot,yroot,d)
- else
- (ani[y].relation + 3 - ani[x].relation ) % 3 != 1 ->假话
- 这个公式是这么来的:
- 3 - ani[x].relation得到了根节点关于x的relation
- ani[y] + 3 - ani[x].relation得到了y关于x的relation
- 所以,只要y关于x的relation不是1,就是y不被x吃的话,这句话肯定是假话!
- (2)路径压缩要特别注意的一点(错在这里,要检讨自己)
- 路径压缩的时候,记得要
- 先findParent,再给当前节点的relation赋值。
- 否则有可能因为当前节点的父节点的relation不正确而导致错的稀里哗啦。
- 例子:
- set1 = {1,2,7,10}
- set2 = {3,4,8,11}
- set3 = {12,5,14,9}
- Union(1,3,1,3,1)
- Union(3,12,3,12,2)
- 1 5 1
- 算5的relation
- 如果不先更新parent的relation,算出来应该是
- ( 3 - 0 + 0 + 1 ) % 3 = 1,5被1吃,显然不对
- 这里面,+ 0的那个0是指根节点 12 的relation(未更新,这里的0是指12与11的relation)
- 如果更新完了的话,应该是
- ( 3 - 0 + 2 + 1 ) % 3 = 0 ,5与1是同一物种,对了
- 这里面的 2 是更新节点12的relation(12与1的relation)*/
- #define N 50100
- int father[N];
- #include<iostream>
- #include<cstdio>
- int val[N];
- #include<cstring>
- using namespace std;
- int n,k;
- int d,x,y;
- int ans=;
- int find(int k)
- {
- if(k!=father[k])
- {
- int tmp=father[k];
- father[k]=find(father[k]);
- val[k]=(val[k]+val[tmp])%;/*路径压缩的过程,利用儿子与父亲,父亲与爷爷的关系,求出儿子与爷爷的关系*/
- }
- return father[k];/*注意这里是return father[k],而不是k,因为这是路径压缩,father[k]都指到了根节点,而k没有*/
- }
- int main()
- {
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;++i)
- father[i]=i,val[i]=;/*初始化并查集,val表示儿子与父亲的关系*/
- for(int i=;i<k;++i)
- {
- scanf("%d%d%d",&d,&x,&y);
- if(x>n||y>n)
- {
- ans++;
- continue;
- }
- if(d==)
- {
- if(find(x)==find(y))
- {
- if(val[x]!=val[y])
- ans++;
- }
- else
- {
- val[father[x]]=(val[y]-val[x]+)%;
- father[father[x]]=father[y];
- }
- }
- else
- {
- if(x==y)
- {
- ans++;
- continue;
- }
- if(find(x)==find(y))
- {
- if(val[x]!=(val[y]+)%)/*y的边指向x,x吃y,y离着根节点近*/
- ans++;
- }
- else{
- // father[father[x]]=father[y];/*放在上面是不对的,当初值的时候father[x]=x,father[y]=y,当把这个语句放到上面的时候,下面的语句就成了val[y]的赋值了,而不是val'[x]的赋值,因为这个时候val[y]应该是0*/
- val[father[x]]=(val[y]+-val[x]+)%;
- father[father[x]]=father[y];
- }
- }
- }
- cout<<ans<<endl;
- return ;
- }
6.线段树
水果姐今天心情不错,来到了水果街。
水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。
学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价。
就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去,求每个问题中最多可以赚多少钱。
第一行n,表示有n家店
下来n个正整数,表示每家店一个苹果的价格。
下来一个整数m,表示下来有m个询问。
下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。
有m行。
每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。
10
2 8 15 1 10 5 19 19 3 5
4
6 6
2 8
2 2
6 3
0
18
0
14
0<=苹果的价格<=10^8
0<n,m<=200000
分类标签 Tags
划分型DP 动态规划 区间型DP 线段树 树结构
代码:
- /*左闭右开区间*/
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #define lch 2*k
- #define rch 2*k+1
- #define N 200001
- #define INF (1<<31)-1
- struct node{
- long long min_,max_,z_val,f_val;
- node(){min_=INF;max_=z_val=f_val=;}/*为了方便取到最大值最小值,就用结构体初始化,会在定义的时候,自动进行*/
- }tree[N*+];
- int t=;
- int n,a[N],m;
- void input()
- {
- scanf("%d",&n);
- for(int i=;i<=n;++i)
- scanf("%d",&a[i]);
- }
- void update(int k)
- {/*DP过程,min_,max_都是由子区间推来的,正着走和反着走的推原理相同,都是三种情况*/
- tree[k].min_=min(tree[lch].min_,tree[rch].min_);
- tree[k].max_=max(tree[lch].max_,tree[rch].max_);
- tree[k].z_val=max(tree[rch].max_-tree[lch].min_,max(tree[rch].z_val,tree[lch].z_val));
- tree[k].f_val=max(tree[lch].max_-tree[rch].min_,max(tree[rch].f_val,tree[lch].f_val));
- }
- void build_tree(int k,int l,int r)
- {
- if(l==r-)
- {
- tree[k].max_=a[l];
- tree[k].z_val=tree[k].f_val=;
- tree[k].min_=a[l];
- return ;
- }
- int mid=(l+r)/;
- build_tree(lch,l,mid);
- build_tree(rch,mid,r);
- update(k);
- }
- node query(int k,int l,int r,int x,int y)
- {
- if(x<=l&&r<=y)
- {
- return tree[k];
- }
- node ans;
- int mid=(l+r)/;
- node b1,c1;
- if(x<mid)
- {
- c1=query(lch,l,mid,x,min(mid,y));/*min(mid,y),为了防止访问出界*/
- }
- if(y>mid)
- {
- b1=query(rch,mid,r,max(mid,x),y);
- }
- ans.z_val=max(b1.max_-c1.min_,max(b1.z_val,c1.z_val));
- ans.f_val=max(c1.max_-b1.min_,max(b1.f_val,c1.f_val));
- ans.max_=max(c1.max_,b1.max_);
- ans.min_=min(c1.min_,b1.min_);
- return ans;
- }
- int main()
- {
- input();
- build_tree(,,n+);
- scanf("%d",&m);
- int x,y;
- while(m--)
- {
- scanf("%d%d",&x,&y);
- node ans;
- if(x==y)
- printf("0\n");
- else if(x>y)
- {
- swap(x,y);
- ans=query(,,n+,x,y+);
- cout<<ans.f_val<<endl;
- }
- else
- {
- ans=query(,,n+,x,y+);
- cout<<ans.z_val<<endl;
- }
- }
- return ;
- }
清北学堂学习总结 day1 数据结构 练习的更多相关文章
- 清北学堂学习总结day1
上午篇 一.高精度计算: [以下内容先只考虑非负数情况] •高精度加法: 思路:[模拟竖式运算] 注意:[进位] •高精度减法: 思路:[同加法类似,模拟竖式运算,进位变退位] 注意: [结果为负数的 ...
- 清北学堂学习总结day2
今天是钟皓曦大佬讲课,先来膜一波 %%%%% •数论 数论是这次培训的一个重点,那么什么是数论呢? 数论是研究整数性质的东西,所以理论上day2不会涉及小数QwQ (切入正题) •整除性: 设a, ...
- 清北学堂学习总结day3
小学知识总结 上午篇 •积性函数的卷积公式 (1)(f * g)( n ) = ∑(d|n) f( d ) x g ( n / d ) (2)代码实现 LL f[N], g[N], h[N]; voi ...
- 清北学堂寒假集训DAY1
第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...
- 清北学堂学习总结 day2 字符串 练习
1.hash表(哈希表) codevs 2147 数星星--简单哈希 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小明 ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
随机推荐
- 【文件上传】jquery之ajaxfileupload异步上传插件
来自:http://www.blogjava.net/sxyx2008/archive/2010/11/02/336826.html 由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用J ...
- jquery.cookie.js——jquery的cookie插件
一.JS文件 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2 ...
- python基础之内置异常对象
前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...
- python基础之上下文管理器
前言 关于计算器运行的上下文的概念,我的理解也不是很深:按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行.下面谈谈pyth ...
- Android 反编译神器jadx的使用
一.前言 今天介绍一个非常好用的反编译的工具 jadx .jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求. jadx 优点: 图形化的界面. 拖拽式的操作. 反编译输出 Java 代码 ...
- 批量删除.svn文件夹和.svn文件
新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...
- java获取weblogic应用运行路径
String url = TemplateBuilder(当前类).class.getClassLoader().getResource("").getPath(); String ...
- 手机页面或是APP中减少使用setTimeout和setInterval,因为他们会导致页面卡顿
1.setTimeout致使页面的卡顿或是不流畅,打乱模块的生命周期 ,还有setTimeout其实是很难调试的. 当一个页面有众多js代码的时候,setTimeout就是导致页面的卡顿. var s ...
- centos 下单独安装mysql
https://www.cnblogs.com/running-mydream/p/4666094.html https://www.cnblogs.com/lzj0218/p/5724446.htm ...
- swiper (Table切换和动态加载时候出现的问题)
本文为让心灵-去旅行原创,转载请说明.. 我们在写一个简单的swiper图片轮播的时候很简单,是写死的也就那么几张图片轮播.如果这时候图片和一些东西是后台的,你从js里动态添加到DOM时,这时候你就会 ...