
知识/模板
奶油贝斯手
coder
展开
-
区间DP模板
模板:假设要求区间[a,b]的最大/小值for(int l=1;l<=b-a+1;l++){//l枚举区间长度 for(int i=a;i<=b;i++){//i枚举区间起点 int j=i+l-1;//j为区间终点 if(j>b) break;//重要!!! for(int k=i;k<j;k++)//k为区间中的点,注意为[i,j)原创 2017-08-21 23:09:47 · 257 阅读 · 0 评论 -
【线段树】区间求和+区间修改(区间加)
#include<iostream>#include<cstdio>using namespace std;int n,m,a[1000004];struct data{int l,r,val,lazy,len;}tr[1000004];void build(int k,int s,int t) {//建树 tr[k].l=s;tr[k].r=t;tr[k].len=t-s+1;原创 2017-10-24 01:19:50 · 1541 阅读 · 0 评论 -
【线段树】单点求值+区间修改
#include<iostream>#include<cstdio>using namespace std;int n,m,a[1000004];struct data{int l,r,val,lazy,len;}tr[2*1000004];void build(int k,int s,int t) {//建树 tr[k].l=s;tr[k].r=t;tr[k].len=t-s+1;原创 2017-10-24 12:59:43 · 416 阅读 · 0 评论 -
【数论】快速幂取模
int main(){ scanf("%lld%lld%lld",&a,&n,&m); long long s=1; while(n>0){ if(n%2) s=(a%m*s)%m; a=(a%m*a%m)%m; n/=2; } printf("%lld",s);}原创 2017-11-01 13:27:29 · 324 阅读 · 0 评论 -
【数学】高斯消元
Laoj1387 贾老二学数学#include<iostream>#include<cstdio>using namespace std;int n;double a[104][104],ans[104];void gauss(){ for(int i=1;i<=n;i++){ if(!a[i][i]){ for(int j=i+1;j<=n原创 2017-11-01 13:29:53 · 286 阅读 · 0 评论 -
【线段树】Laoj1299
#include<iostream>#include<cstdio>using namespace std;int const maxn=200001;int n,m,p,a[maxn];struct data{int l,r,val;}tr[4*maxn];void build(int k,int s,int t){//建树 tr[k].l=s;tr[k].r=t; if(s原创 2017-10-24 13:33:40 · 313 阅读 · 0 评论 -
【数学】康托展开
康托展开把一个整数X展开成如下形式:X=a[n](n-1)! + a[n-1](n-2)! +…+ a[i]*(i-1)! + … + a[2]*1! + a[1]*0! 其中a[i]为当前未出现的元素中是排在第几个(从0开始),并且0 <= a[i] < i,1 <= i <= n。康托的逆运算在1…n按字典序的排列中,求第n个序列,这就是康托的逆运算。原创 2017-11-02 11:55:34 · 304 阅读 · 0 评论 -
【分块】
[题目](https://www.luogu.org/problemnew/show/3372)#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;long long n,q,a[100004],b[100004],add[100004],blo,sum[100004原创 2017-11-02 12:11:18 · 271 阅读 · 0 评论 -
【LCA】最近公共祖先
#include<iostream>#include<cstdio>#include<cstring>using namespace std;inline int read(){ int x=0;char ch; ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9')原创 2017-11-11 18:20:34 · 248 阅读 · 0 评论 -
【数论】计算单个欧拉函数
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int euler_phi(int n){ int m=(int)sqrt(n+0.5); int ans=n; for(int i=2;i<=m;i++){ if(n%i==0) { ans原创 2017-11-03 05:58:33 · 499 阅读 · 0 评论 -
【数论】用类似筛法的方法计算一段欧拉函数值
#include<iostream>#include<cstdio>#include<cmath>using namespace std;const int maxn=100000;int phi[maxn];void phi_table(int n){ for(int i=2;i<=n;i++) phi[i]=0; phi[1]=1; for(int i=2;i原创 2017-11-03 06:04:34 · 258 阅读 · 0 评论 -
【数论】求逆元
计算模n下a的逆,如果不存在逆,返回-1#include<iostream>#include<cstdio>#define ll long longusing namespace std;ll gcd(ll a,ll b,ll &d,ll& x,ll& y){ if(!b){d=a;x=1;y=0;return x;} else{ gcd(b,a%b,d,y,原创 2017-11-03 06:18:45 · 434 阅读 · 0 评论 -
【数论】【中国剩余定理】解线性模方程
n个方程:x=a[i](mod m[i]) (0<=ill china(int n,int *a,int *m){ ll M=1,d,y,x=0; for(int i=0;i<n;i++) M*=m[i]; for(int i=0;i<n;i++){ ll w=M/m[i]; gcd(m[i],w,d,d,y); x=(x+y*原创 2017-11-03 06:41:52 · 232 阅读 · 0 评论 -
C++读入优化和输出优化
【转葛姐的http://www.cnblogs.com/shamman/p/7455819.html】读入优化:inline int read() { int x=0, w=1; char ch=0; while (ch<'0' || ch>'9') { if (ch=='-') w=-1; ch=getchar();转载 2017-11-06 13:02:02 · 649 阅读 · 0 评论 -
【位运算】
说明: (1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量。 (2)运算早只能是整型或字符型的数据,不能为实型数据。i^1: 若i为偶数 i^1=i+1; 若i为奇数 i^1=i-1;(i>>k)&1: i的二进制中第k位交换: a=a^b; b=a^b; a=a^b;取反: ~某一位设置为0或1:a|=(1<<x) //x就是某位需要置1的数字,如第四原创 2017-11-06 13:26:59 · 245 阅读 · 0 评论 -
前向星存储方式
struct data{ int to,next,w;}e[40010];void add(int u,int v,int w){ e[++cnt].to=v; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt;}for(int i=head[u];i;i=e[i].next){ int v=e[i].to;原创 2017-12-12 12:27:28 · 351 阅读 · 0 评论 -
DFS SPFA
void spfa(int u){ if(flag) return; vis[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(dis[v]>dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; if(vis[原创 2017-12-12 13:06:22 · 576 阅读 · 0 评论 -
【线段树】区间求和+单点修改
#include<iostream>#include<cstdio>using namespace std;int n,m,a[100004];struct data{int l,r,val;}tr[100004];void build(int k,int s,int t) {//建树 tr[k].l=s;tr[k].r=t; if(s==t) {tr[k].val=a[s];r原创 2017-10-23 13:30:39 · 431 阅读 · 0 评论 -
【线段树】区间求和(不带修改)
#include<iostream>#include<cstdio>using namespace std;int n,m,a[100004];struct data{int l,r,val;}tr[100004];void build(int k,int s,int t) {//建树 tr[k].l=s;tr[k].r=t; if(s==t) {tr[k].val=a[s];r原创 2017-10-23 13:19:00 · 218 阅读 · 0 评论 -
Dilworth定理/NOIp1999拦截导弹
最少链划分数=最长反链长度eg:NOIp1999 拦截导弹第二问应用Dilworth定理最长反链长度即是最长不上升序列长度原创 2017-08-21 21:30:32 · 442 阅读 · 0 评论 -
单调栈/LIS的log n做法
string:stack[0]="";top=0;for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i].find(stack[top])==0){ stack[++top]=a[i]; } else{ int l=1,r=top; while(l<=r){ int mid=(l+r)/2; if(a[i].f原创 2017-08-09 00:51:34 · 744 阅读 · 0 评论 -
单调队列
scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&x); if(i>m)dp[i]=x+dp[a[head]]; else dp[i]=x; while(head=dp[i]) tail--; a[++tail]=i; while(a[head]<=i-m) head++; }原创 2017-08-09 00:48:17 · 204 阅读 · 0 评论 -
floyd最小环
for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); if(a[x][y]<=z) continue; a[x][y]=z; a[y][x]=z; b[x][y]=z; b[y][x]=z;}for(int k=1;k<=n;k++){ for(int i=1;i<k;i++){原创 2017-09-27 12:45:49 · 246 阅读 · 0 评论 -
printf输出补零
前面补零:printf("%3d",a); //如果知道位数具体数字printf("%*d",n,a);//不知道具体数字,用*代替位数,n为保留的位数后面补零printf("%-3d",a);printf("%-*d",n,a); //加负号即可原创 2017-09-02 16:18:42 · 6725 阅读 · 2 评论 -
【暴力】枚举子集
0~n的所有子集#include<iostream>#include<cstdio>using namespace std;void print_subset(int n,int s){ for(int i=0;i<n;i++) if(s&(1<<i)) printf("%d ",i); printf("\n");}int main(){ for(int原创 2017-10-27 05:59:42 · 268 阅读 · 0 评论 -
【数论】最小公倍数
int gcd(int a,int b){ return b == 0 ? a : gcd(b,a%b);}原创 2017-10-27 06:13:56 · 384 阅读 · 0 评论 -
【数论】筛素数
int m=sqrt(n+0.5);memset(vis,0 sizeof(vis));for(int i=2;i<=m;i++){ if(!vis[i]) for(int j=i*i;j<=n;j+=i) vis[i]=1;}//vis[i]=0的数即为素数原创 2017-10-27 06:18:25 · 338 阅读 · 0 评论 -
【数论】扩展欧几里得算法
#include<iostream>#include<cstdio>using namespace std;inline void exgcd(int a,int b,int c,int &x,int &y,int &p){ if(b==0) { if(c%a==0) {x=c/a;y=0;} else p=-1; }else{原创 2017-10-27 13:04:05 · 276 阅读 · 0 评论 -
【数论】最小公倍数的二进制优化
#include<iostream>using namespace std;inline int gcd(int a,int b){ if(!a || !b) return a^b; int i=0,j=0; while(!(a&1)) a>>=1;i++; while(!(b&1)) b>>=1,j++; while(a!原创 2017-10-27 13:10:14 · 389 阅读 · 0 评论 -
【数位dp】不要62
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m,a[20],dp[20][2];int dfs(int pos,int pre,int sta,bool limit){ if(pos==-1) return 1; if(!limit && dp[pos][sta]!原创 2017-10-31 12:24:01 · 286 阅读 · 0 评论 -
【数位dp】B-number
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m,a[20],dp[20][4][20];int dfs(int pos,int sta,bool limit,int p){ if(pos==-1) return p==0&&sta==2; if(!limit &&原创 2017-10-31 23:42:32 · 301 阅读 · 0 评论 -
【图论】二分图最大匹配(模板+定义定理)
模板dfs:bool dfs(int k){ for(int i=1;i<=n;i++){ if(!v[i] && map[k][i]){ v[i]=1; if(link[i]=-1 || dfs(i)){ link[i]=k; return 1;原创 2017-10-24 12:45:02 · 610 阅读 · 0 评论 -
【线段树】 区间最大值(不带修改)
#include<iostream>#include<cstdio>using namespace std;int n,m,a[100004];struct data{int l,r,val;}tr[100004];void build(int k,int s,int t) {//建树 tr[k].l=s;tr[k].r=t; if(s==t) {tr[k].val=a[s];r原创 2017-10-23 13:14:33 · 347 阅读 · 0 评论 -
归并排序
归并排序void sort(int l,int r){ if(l==r)//若只有一个数字,则无需排序 return; int mid=(l+r)>>1; sort(l,mid); sort(mid+1,r);//分治 int i=l,j=mid+1,k=l; while(i<=mid&&...原创 2018-07-31 11:05:14 · 212 阅读 · 0 评论