日记 算法发表于 2个月前 (08-27)21条评论
n正在传网盘…… 链接:http://pan.baidu.com/s/1kVsZwRP 密码:ag46 好拉
Category Archives: DefaultCategory
数组operator写法
int n;nstruct arr{n ll a[10000];n ll &operator[](int i) {n if (i<-n) i=-n; if (i>n) i=n;n return a[5000+i];n }n}f;n//这个数组写法好评
Pygame 语法速记
变量声明
BZOJ 五月胡乱补题
【BZOJ 4806: 炮】同BZOJ 1801
n【BZOJ 3242: [Noi2013]快餐店】树形dp,要么最远点在同一颗树上(dp),要么在不同树上,此时答案=去掉任何一条边后形成的树的答案的最小值,我们枚举去掉的那条边。
n由于答案=s[i]-s[j]+dis[i]+dis[j],i,j可以分开考虑,也可以用线段树解决。
n【BZOJ 4878: [Lydsy2017年5月月赛]挑战NP-Hard】染色问题,每次沿边染max,注意最后如果颜色数超过k,则可以按(k+1)-k-…-1的简单路径
n【4879: [Lydsy2017年5月月赛]失控的数位板】只要把所有的点的最后一次涂色时间求出来就行了。
n【BZOJ 4894: 天赋】有向图生成树计数的基尔霍夫矩阵
n【BZOJ 3534: [Sdoi2014]重建】 变元矩阵-树定理,求所有生成树边权积的和。把度数改为连出的边权和,$A[i][j]=-$边权,$A[i][i]=$连出的边权和.
n【BZOJ 4031: [HEOI2015]小Z的房间】矩阵树定理,注意gauss消元辗转相除的写法
n【BZOJ 4837: [Lydsy2017年4月月赛]LRU算法】模拟
n【BZOJ 4596: [Shoi2016]黑暗前的幻想乡】矩阵树定理+容斥
n【BZOJ 3517: 翻硬币】
FWT代码-BZOJ 4589 Hard Nim
题目:给n个不超过m的素数,求xor和=0的方案数,FWT变换裸题。
n题目
期末考期间作死囤题的我12月乱做——囤题计划4
- n
- [Upd 2016.12.29] 话说统一下格式会死吗……写了4份囤题用了4种格式……还好我不是处女……
- [Upd 2016 1.6]今天CF研究了shift-and算法,居然超时我&^(^*&)
- [Upd 2016.1.9] 居然丢失了一部分文档……已经补在后面了……
- [Upd 2016.1.10] 过了facebookHackCup的资格赛……因为网络延时只交了1题好气啊……投诉主席!不过还好总算是过了.今天栗子考完电磁场了大家会不会轻松一点?
n
n
n
n
我的WordPress数据库穿越到异世界了怎么办,在线等
RT
n由于博主sb的没有续费Godaddy以及本机备份丢失(主要是这个原因),一些博客文章丢失了。
BZOJ 1001([BeiJing2006]狼抓兔子-最大流转对偶图最短路)
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 5779 Solved: 1297
[Submit][Status][Discuss]
Description
道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.
Input
Output
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
#include<cstdlib> #include<cstdio> #include<iostream> #include<functional> #include<algorithm> #include<cstring> using namespace std; #define MAXN (999*999*2+2+10) #define MAXM (MAXN*3) #define For(i,n) for(int i=1;i<=n;i++) int n,m,N,M,s,t,pre[MAXN]={0},edge[MAXM],next[MAXM],weight[MAXM],size=0; int no(int i,int j,int k){return (i-1)*2*M+j*2-(k^1);} void addedge(int u,int v,int w) { edge[++size]=v; weight[size]=w; next[size]=pre[u]; pre[u]=size; } void addedge2(int u,int v){int w;scanf("%d",&w);addedge(u,v,w),addedge(v,u,w);} int q[MAXN*9],d[MAXN]; void SPFA() { memset(d,127,sizeof(d));d[s]=0; int head=1,tail=1; q[1]=s; while (head<=tail) { int now=q[head]; for (int p=pre[now];p;p=next[p]) { int &v=edge[p]; if (d[now]+weight[p]<d[v]) { d[v]=d[now]+weight[p]; q[++tail]=v; } } head++; } } int main() { // freopen("bzoj1001.in","r",stdin); scanf("%d%d",&n,&m); N=n-1,M=m-1; s=N*M*2+1;t=s+1; For(i,n) For(j,m-1) { if (i==1) addedge2(s,2*j); else if (i==n) addedge2(no(i-1,j,0),t); else addedge2(no(i,j,1),no(i-1,j,0)); } For(i,n-1) For(j,m) { if (j==1) addedge2(t,2*M*(i-1)+1); else if (j==m) addedge2(2*M*i,s); else addedge2(no(i,j-1,1),no(i,j,0)); } For(i,n-1) For(j,m-1) addedge2(no(i,j,0),no(i,j,1)); SPFA(); cout<<d[t]<<endl; return 0; }
BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)
3132: 上帝造题的七分钟
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 46 Solved: 18
[Submit][Status][Discuss]
Description
“第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵。
第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作。
第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作。
第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围。
第五分钟,和雪说,要有耐心,于是便有了时间限制。
第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中及最终结果均不超过32位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。”
——《上帝造裸题的七分钟》
所以这个神圣的任务就交给你了。
Input
输入数据的第一行为X n m,代表矩阵大小为n×m。
从输入数据的第二行开始到文件尾的每一行会出现以下两种操作:
L a b c d delta —— 代表将(a,b),(c,d)为顶点的矩形区域内的所有数字加上delta。
k a b c d —— 代表求(a,b),(c,d)为顶点的矩形区域内所有数字的和。
请注意,k为小写。
Output
针对每个k操作,在单独的一行输出答案。
Sample Input
L 1 1 3 3 2
L 2 2 4 4 1
k 2 2 3 3
Sample Output
HINT
对于100%的数据,1 ≤ n ≤ 2048, 1 ≤ m ≤ 2048, 1 ≤ delta ≤ 500,操作不超过200000个,保证运算过程中及最终结果均不超过32位带符号整数类型的表示范围。
Source
2D树状数组支持单点修改+求和(1,1)-(x,y)矩形
因此按照zkw的思路用逆求和数组做(就是把区间修改结构-用2个单点修改的逆求和数组d',{i*d'}代替,神思路)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; #define MAXN (2050) int lowbit(int x){return x&(-x);} int n,m,x1,x2,y1,y2,delta; struct arr_tree { int b[MAXN][MAXN]; arr_tree(){memset(b,0,sizeof(b)); } void add(int x,int y,int c,bool b1,bool b2) { if (!x||!y||x>n||y>m) return; if (b1) c*=(x-1);if (b2) c*=(y-1);if (!c) return; for (int i=x;i<=n;i+=lowbit(i)) for (int j=y;j<=m;j+=lowbit(j)) b[i][j]+=c; } int qur(int x,int y) { if (!x||!y) return 0; int ans=0; for (int i=x;i;i-=lowbit(i)) for (int j=y;j;j-=lowbit(j)) ans+=b[i][j]; return ans; } void add(int x1,int y1,int x2,int y2,int c,bool b1,bool b2) { add(x2+1,y2+1,delta,b1,b2),add(x1,y1,delta,b1,b2); add(x1,y2+1,-delta,b1,b2),add(x2+1,y1,-delta,b1,b2); } }d,di,dj,dij; int Dsum(int x,int y) { return d.qur(x,y)*x*y+dij.qur(x,y)-di.qur(x,y)*y-dj.qur(x,y)*x; } int main() { scanf("X %d %d",&n,&m); char c; while (scanf("%c",&c)==1) { while (c^'L'&&c^'k') if (scanf("%c",&c)!=1) return 0; switch(c) { case 'L': scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta); if (x1>x2) swap(x1,x2),swap(y1,y2); d.add(x1,y1,x2,y2,delta,0,0),di.add(x1,y1,x2,y2,-delta,1,0); dj.add(x1,y1,x2,y2,-delta,0,1),dij.add(x1,y1,x2,y2,delta,1,1); break; default: scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if (x1>x2) swap(x1,x2),swap(y1,y2); printf("%dn",Dsum(x2,y2)+Dsum(x1-1,y1-1)-Dsum(x1-1,y2)-Dsum(x2,y1-1)); } } }
BZOJ 2111([ZJOI2010]Perm 排列计数-乘法逆元+完全二叉树模型+数列分数表示法)
2111: [ZJOI2010]Perm 排列计数
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 478 Solved: 283
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
100%的数据中,1 ≤ � N ≤ 106, P� ≤ 10^9,p是一个质数。
#include<cstdio> #include<cmath> #include<functional> #include<iostream> #include<algorithm> using namespace std; #define MAXN (1000000+1) #define eps (1e-9) int n,F; int exgcd(int a,int b,long long &x,long long &y){if (!b) {x=1,y=0;return a;}int ans=exgcd(b,a%b,x,y);long long z=x;x=y;y=z-(a/b)*y;return ans;} long long f[MAXN],g[MAXN],jc[MAXN]; long long mulinv(int b) { long long x,y; exgcd(b,F,x,y); // return ((-x)/F*F+F+x)%F; return (x+abs(x)/F*F+F)%F; } int main() { scanf("%d%d",&n,&F); f[0]=g[0]=f[1]=g[1]=1%F; jc[0]=jc[1]=1; for (int i=2;i<=n;i++) jc[i]=jc[i-1]*i%F; for(int i=2;i<=n;i++) { int dep=(int)(log(i)/log(2)+eps)+1; int l=(int)pow(2.0,dep-2)-1; // cout<<l<<' '<<(int)(eps+pow(2.0,dep-2))<<' '<<(i-1-2*l)<<' '; l+=min((i-1-2*l),(int)(eps+pow(2.0,dep-2))); int r=i-l-1; // cout<<i<<' '<<dep<<' '<<l<<' '<<r<<' '<<f[l]<<' '<<f[r]<<endl; f[i]=f[l]*f[r]%F*jc[i-1]%F; g[i]=g[l]*g[r]%F*jc[l]%F*jc[r]%F; } // cout<<f[n]<<' '<<g[n]<<endl; cout<<f[n]*mulinv(g[n])%F<<endl; return 0; }