- 博客(73)
- 收藏
- 关注
原创 求组合数
c[1][1]=c[0][1]=1; for(int i=2;i<=k;++i) for(int j=0;j<=min(i,n);++j) { if(!j) c[j][i]=1; else c[j][i]=c[j-1][i-1]+c[j][i-1]; }
2019-10-11 17:29:10
104
原创 2018-2019 ACM-ICPC Asia Seoul Regional Contest A Circuits Gym - 101987A (线段树+lazy标记)
用线段树做这题至少有两种写法 输入数据的离散,建树,求每个离散后的纵坐标穿过的矩形数都一样,不同的地方在遍历纵坐标求答案。 线段树存的是lazy标记和区间内最大值 1.输入矩形的横坐标没用,只要储存纵坐标。坐标范围达到10的7次方,故先离散化。把每个矩形表示成纵坐标对应的线段即可 2.在线段树中把这些区间值加一(建树),注意要用lazy标记,顺便分别...
2019-10-10 00:06:35
418
原创 高精度gcd(P2152 SuperGCD)
更相损减法 初始化r=0,求gcd(a,b): a!=b时,如果a、b都为偶数,a、b都除以2,r++;如果其中一个为偶数,偶数除以2;如果两个都为奇数,大数减去小数。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using n...
2019-10-06 17:02:16
465
原创 P3313 [SDOI2014]旅行(计时器)
树链剖分+动态开点的线段树 树剖好以后每个宗教建一棵线段树,把初始状态每个城市插入树中。 查询时边求LCA边在线段树中查询。#include<iostream>#include<cstdio>#include<cstring>#include<Windows.h>using namespace std;int wi[1...
2019-10-06 09:45:56
113
原创 P3168 任务查询系统
区间修改+单点查询利用时间点建树,因为主席树建树时第i结点会继承第i-1个结点的信息,可以只修改区间端点使每个时间点对应的树恰好表示该时间的任务优先级情况。1.把区间端点全部放入数组task中排序,起始点时间不变,结束点时间加一。2.按时间从1到n建树,每次建树把task中所有时间为i的结点建到树里,起始点加入树(标记为1),结束点在树中减去(标为-1)3.直接查询时间点对应的那棵...
2019-10-05 13:21:15
226
原创 二维线段树
线段树套线段树数组开二维,外层结点不存值,内层结点存储区间内数之和,更新内层和普通线段树相同,更新外层线段树底层结点和其他结点不同。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int tree[2000][2000],Mat[512][512];...
2019-10-05 13:09:39
171
原创 P3302 森林
主席树+倍增 先建好初始状态的主席树和倍增数组,之后每次加边把结点少的树合到结点多的树上,每次合并都要新开结点,所以数组开大点 注意:动态树建倍增数组要把终止条件从log[deep]改为上限19或者更大,因为同一个点的深度会发生变化,如果每次修改不彻底,倍增数组残留的值可能不为0,lca的时候会导致跳过头#include<iostream>#include&...
2019-10-04 22:45:23
114
原创 最近公共祖先(LCA)
1.前向星建图2.预处理i从1到n,lg[1]=0,如果i是2的幂,lg[i]=lg[i-1]+1,否则 lg[i]=lg[i-1].3.一次dfs求各节点深度和倍增数组4.lca查询 先跳到同一深度,若重合直接返回结果,否则同时往上跳,跳到lca下面一个位置,最后返回其父节点。#include<iostream>#include<cstdio>...
2019-10-04 16:56:14
179
原创 树链剖分
两次dfs把树剖成一段一段连续的链,整体建一次树,用线段树维护区间信息#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;int to[200010],nex[200010],head[100010];int d[...
2019-10-04 12:58:25
115
原创 前向星
head数组表示以某个点为起点的第一条边next数组表示以某个点为起点的下一条边to数组表示边的重点 int con=1; memset(head,0,sizeof(head)); for(int i=1;i<n;++i) { int a,b; scanf("%d%d",&a,&b); ...
2019-10-03 16:23:19
120
原创 带修主席树(动态逆序对)
树状数组套权值线段树1.树状数组每个节点的值为该区间内权值线段树的根结点。2.每棵权值线段树储存其根节点对应树状数组中所表示的区间内的值离散化后在线段树对应各区间内的的个数。3.先边输入初始序列边求出初始逆序和,每次询问先输出一次逆序和,再删该数。修改查询如何求初始逆序和:1.每次输入序列中一个数后,查询该数前面(包括该数)小于等于该数的数的个数,用当前数的位置(即当...
2019-10-01 23:00:47
436
原创 杨辉三角
int ang[13][32];ang[1][0]=ang[1][2]=0;ang[1][1]=1;for(int i=2;i<=12;++i){ for(int j=1;j<=i;++j) ang[i][j]=ang[i-1][j]+ang[i-1][j-1];}
2019-09-28 14:51:31
129
原创 乘法+加法lazy标记(维护序列)
坑点:区间可能乘0,不能用乘法标记大于1作为下传条件,下传条件应该为乘法标记不等于1。做法:维护标记时,操作为乘:乘法标记直接修改,加法标记也要乘操作数;操作为加:只改加法标记。下传标记时:分别修改两个子节点的值,先下传乘法标记,再下传加法标记。#include<iostream>#include<cstdio>#include<cstring>...
2019-09-27 23:53:22
169
原创 区间元素种类(HH的项链)
HH的项链将所有区间读入,按右端从小到大排序。 从左至右扫描,当前元素上一次出现的位置对应线段树中的结点值全部减一,更新当前元素此次出现的位置(确保相同元素在树上只存在当前最右的一个),查询所有区间右端为当前位置的区间,求出这些区间内的元素种类。 按输入顺序输出。核心思想:去重时保留最右的,线段树结点直接存储元素种类。#include<iostream>#includ...
2019-09-27 20:22:54
362
原创 单调队列
用于处理滑动区间内最大最小值问题 从前向后扫描滑动轨道,每次执行:加入:从队尾开始向前扫描,至当前队尾元素大于/小于待加入元素,从队尾加入当前元素。 删除:如果队首元素不在当前区间内,队首出队,至队首在当前区间内。 struct node{ ll s,t,v[1000010];}maxv,minv;bool check(ll x){ minv.t...
2019-09-26 12:24:14
96
原创 主席树
主席树+离散1.利用前缀和性质,建立n棵权值线段树(1-i区间内有几个数离散化后的值在树上每个结点对应区间内)2.查询i到j区间只需将第j棵树减去第i-1棵树,得到表示i到j区间内情况的树,线段树查询即可。建树O(nlogn),查询每次O(logn)注意:待修主席树为了修改方便(和建树共用一个函数),开点时常用if(!rt) rt=con-1;这样修改的时候不会新开节点。 ...
2019-09-21 21:52:14
121
原创 判断线段是否相交
double x1[100010],y1[100010],x2[100010],y2[100010];inline double cross(int a,int b){ double x=x2[a]-x1[a],y=y2[a]-y1[a]; return ((x2[b]-x1[a])*y-x*(y2[b]-y1[a]))*((x1[b]-x1[a])*y-x*(y1[b]-y...
2019-09-17 22:45:49
139
原创 判断直线是否相交
double x1,Y1,x2,y2,x3,y3,x4,y4;bool line(){ double x=x2-x1,y=y2-Y1; //cout<<x<<' '<<y<<endl; // cout<<(x3-x1)<<' '<<(y3-Y1)<<endl; if(...
2019-09-17 22:45:40
612
原创 三角形外心
double x1,Y1,x2,y2,x3,y3;struct vec{ double a,b,c; vec(double x,double y,double z):a(x),b(y),c(z){};};vec pro(double x1,double Y1,double x2,double y2){ return (vec){x2-x1,y2-Y1,-((x2...
2019-09-17 22:45:36
398
原创 最短路径
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <string>#include <map>using ...
2019-09-17 22:45:24
153
原创 STL set和multiset
set和multiset会根据特定的排序原则将元素排序 默认为从小到大。两者不同之处在于,multisets允许元素重复,而set不允许重复。 从小到大(less),从大到小(greater),与priority_queue相反。 lower_bound()返回大于或等于的位置,upper_bound()返回大于的位置,否则返回end()...
2019-09-17 22:45:15
112
原创 欧拉筛
bool vis[1000010]; int prime[1000010]; int con=0; memset(vis,0,sizeof(vis)); for(int i=2;i<1000000;++i) { if(!vis[i]) prime[con++]=i; for(int j=0;j&...
2019-09-15 10:25:23
134
原创 素数检测(Miller-Rabin方法)
Miller-Rabin方法 Miller-Rabin方法是一种随机化算法,设n为待检验的整数;k为选取a的次数。重复k次计算,每次在[1,n-1]范围内随机选取一个a,若a^(n-1) modn!=1 ,则n为合数;若随机选取的k个a都使a^(n-1)≡1 (mod n)成立,则返回n为素数或伪素数的信息。 对于32位内的任一个整数n,如果其通过了以2,7,...
2019-08-31 23:40:41
2124
原创 KMP
KMP int i=0,j=-1; next1[0]=-1; while(i<x) //x为字符串长度 { if(j==-1||k[j]==k[i]) { i++; j++; next1[i]=j; } else ...
2019-08-31 23:40:07
119
原创 2019.8.31银川网络赛
AMaximum Element In A Stack 刚开始写了个数组模拟栈,结果一直WA到比赛结束前几分钟。。。最后用了STL结果过了????? 一直以为是栈写残了 结果:maxv[con++]=max(maxv[con-1],Stack[id-1]);//一直WA------------------------------------------------------...
2019-08-31 23:39:29
172
原创 线段树区间离散方法
将所有区间的左右端点存入数组,并从小到大排序,再去重,遍历数组,若两个相邻元素差值不为1,在数组末尾插入两元素中的最小值加一,再排序一次。 遍历原区间,取数组中等于该值的元素位置的下标加1作为离散后的区间端点即可。 for(int i=1;i<=n;++i) { scanf("%d%d",&st[i],&ed[i])...
2019-08-25 18:46:23
110
原创 2019.4.27.训练情况
个人训练情况 Stat # Title Solved 8/14 A The Perfect Stall Solved 3/5 B March of the Penguins 1/1 C PIGS 0/4 D Sightseeing tour ...
2019-04-27 10:47:46
150
原创 2019.4. 13训练情况总结
个人训练情况 Stat # Title Solved 18/18 A Tr A Solved 15/20 B Fibonacci Solved 11/24 C Matrix Power Series Solved 7/13 D Corn Fields Solved ...
2019-04-20 10:54:47
119
原创 2019.4.1 训练情况总结
个人训练情况新生训练mission 7——线段树与树状数组已完成8题(共十题) Stat # Title Solved 14/17 A Frequent values Solved 23/34 B 敌兵布阵 Solved 20/31 C I Hate It Solved 17/30...
2019-04-01 23:39:54
185
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅