还有13天NOI,把各种乱七八糟的算法都重新过一遍还是比较有必要的。。。
//HDU 5046 Airport
//DancingLink
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 110
#define MAXD MAXN*MAXN
#define INF 0x3f3f3f3f
#define LL "%lld"
typedef long long qword;
struct point
{
qword x,y;
};
point pl[MAXN];
qword dis(point p1,point p2)
{
return abs(p1.x-p2.x)+abs(p1.y-p2.y);
}
int L[MAXD],R[MAXD],U[MAXD],D[MAXD];
int ptr[MAXN];
int tot[MAXN];
int col[MAXD];
int topd=;
int head=;
void cover(int now)
{
for (int i=R[now];i!=now;i=R[i])
{
for (int j=U[i];j!=i;j=U[j])
{
L[R[j]]=L[j];
R[L[j]]=R[j];
}
}
for (int j=U[now];j!=now;j=U[j])
{
L[R[j]]=L[j];
R[L[j]]=R[j];
}
}
void recover(int now)
{
for (int i=R[now];i!=now;i=R[i])
for (int j=U[i];j!=i;j=U[j])
L[R[j]]=R[L[j]]=j;
for (int j=U[now];j!=now;j=U[j])
L[R[j]]=R[L[j]]=j;
}
int vv[MAXN];
int ff()
{
int ret=;
for (int i=R[head];i!=head;i=R[i])
vv[col[i]]=true;
for (int i=R[head];i!=head;i=R[i])
{
if (vv[col[i]])
{
ret++;
for (int j=D[i];j!=i;j=D[j])
{
for (int k=R[j];k!=j;k=R[k])
{
vv[col[k]]=false;
}
}
}
}
return ret;
}
bool solve(int trst)
{
if (L[head]==R[head] && L[head]==head)return true;
if (!trst)return false;
if (trst<ff())return false;
pair<int,int> mnv=make_pair(INF,);
for (int i=R[head];i!=head;i=R[i])
mnv=min(mnv,make_pair(tot[i],i));
int now=mnv.second;
for (int i=D[now];i!=now;i=D[i])
{
cover(i);
if (solve(trst-))return true;
recover(i);
}
return false;
} int main()
{
freopen("input.txt","r",stdin);
int nn;
int n,m;
int x,y,z;
scanf("%d",&nn);
int caseid=;
while (nn--)
{
caseid++;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf(LL LL ,&pl[i].x,&pl[i].y);
memset(ptr,,sizeof(ptr[])*(n+));
memset(tot,,sizeof(tot[])*(n+));
qword l=-,r=1ll<<,mid;
while (l+<r)
{
mid=(l+r)>>;
topd=;
head=++topd;
L[head]=R[head]=head;
for (int i=;i<=n;i++)
{
int np=++topd;
col[np]=i;
R[np]=head;
L[np]=L[head];
L[R[np]]=np;
R[L[np]]=np;
D[np]=U[np]=np;
ptr[i]=np;
}
for (int i=;i<=n;i++)
{
int last=;
for (int j=;j<=n;j++)
{
if (dis(pl[i],pl[j])<=mid)
{
int np=++topd;
col[np]=j;
tot[ptr[j]]++;
D[np]=ptr[j];
U[np]=U[ptr[j]];
D[U[np]]=U[D[np]]=np;
if (!last)
{
L[np]=R[np]=np;
}else
{
L[np]=last;
R[np]=R[last];
L[R[np]]=R[L[np]]=np;
}
last=np;
}
}
}
if (solve(m))
{
r=mid;
}else
{
l=mid;
}
}
printf("Case #%d: "LL"\n",caseid,r);
}
}
DancingLink
半年没写DLX了,还能在30分钟内写出来,感觉不错。
DLX分为精确覆盖和完全覆盖,两者的区别大概是在cover和recover之中。
另外DLX也是需要剪枝的。
//bzoj 1135
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 210000
#define MAXT MAXN*5
#define lch (now<<1)
#define rch (now<<1^1)
#define smid ((l+r)>>1)
typedef long long qword;
struct sgt_node
{
int lc,rc;
qword lx,rx,mx;
qword sum;
}sgt[MAXT];
void update(int now)
{
sgt[now].lx=max(sgt[lch].lx,sgt[lch].sum+sgt[rch].lx);
sgt[now].rx=max(sgt[rch].rx,sgt[rch].sum+sgt[lch].rx);
sgt[now].sum=sgt[lch].sum+sgt[rch].sum;
sgt[now].mx=max(max(sgt[lch].mx,sgt[rch].mx),sgt[lch].rx+sgt[rch].lx);
}
void Build_sgt(int now,int l,int r,int v)
{
if (l==r)
{
sgt[now].sum=v;
sgt[now].lx=sgt[now].rx=sgt[now].mx=v;
return ;
}
Build_sgt(lch,l,smid,v);
Build_sgt(rch,smid+,r,v);
update(now);
}
void Modify_sgt(int now,int l,int r,int pos,int v)
{
if (l==r)
{
sgt[now].sum+=v;
sgt[now].lx+=v;
sgt[now].rx+=v;
sgt[now].mx+=v;
return ;
}
if (pos<=smid)
Modify_sgt(lch,l,smid,pos,v);
else
Modify_sgt(rch,smid+,r,pos,v);
update(now);
} int main()
{
freopen("input.txt","r",stdin);
int n,m,t,d;
int x,y;
scanf("%d%d%d%d",&n,&m,&t,&d);
Build_sgt(,,n,-t);
for (int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
Modify_sgt(,,n,x,y);
if (sgt[].mx>(qword)t*d)
{
printf("NIE\n");
}else
{
printf("TAK\n");
}
}
Hall
hall定理用于二分图匹配相关问题,在要求方案时用贪心或匈牙利算法,运用hall定理有利于优化时间复杂度。
//bzoj 3270
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<cmath>
using namespace std;
#define MAXN 1010
#define MAXV MAXN
#define MAXE MAXN*20
typedef double real;
const real eps = 1e-; struct Edge
{
int np;
Edge *next;
}E[MAXE],*V[MAXV];
int tope=-;
void addedge(int x,int y)
{
E[++tope].np=y;
E[tope].next=V[x];
V[x]=&E[tope];
}
real ps[MAXN];
real mat[MAXN][MAXN];
real res[MAXN];
int deg[MAXN]; int main()
{
freopen("input.txt","r",stdin);
int n,m;
int a,b;
int x,y,z;
scanf("%d%d",&n,&m);
scanf("%d%d",&a,&b);
a--;b--;
for (int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
x--;y--;
addedge(x,y);
addedge(y,x);
deg[x]++;
deg[y]++;
}
for (int i=;i<n;i++)
scanf("%lf",&ps[i]);
for (int i=;i<n;i++)
{
for (int j=;j<n;j++)
{
if (i==j)
{
mat[i*n+j][i*n+j]=;
continue;
}
Edge *ne1,*ne2;
for (ne1=V[i];ne1;ne1=ne1->next)
for (ne2=V[j];ne2;ne2=ne2->next)
mat[ne1->np*n+ne2->np][i*n+j]=-*(-ps[i])*(-ps[j])/deg[i]/deg[j];
Edge *ne;
for (ne=V[i];ne;ne=ne->next)
mat[ne->np*n+j][i*n+j]=-*ps[j]*(-ps[i])/deg[i];
for (ne=V[j];ne;ne=ne->next)
mat[i*n+ne->np][i*n+j]=-*(-ps[j])*ps[i]/deg[j];
mat[i*n+j][i*n+j]=-ps[i]*ps[j];
mat[i*n+j][n*n]=;
}
}
mat[a*n+b][n*n]=;
int l=n*n;
for (int i=;i<l;i++)
{
int x=-;
for (int j=i;j<=l;j++)
{
if (abs(mat[j][i])>eps)
x=j;
}
assert(x!=-);
if (x!=i)
for(int j=;j<=l;j++)
swap(mat[i][j],mat[x][j]);
for (int j=i+;j<l;j++)
{
real tmp=mat[j][i]/mat[i][i];
for (int k=i;k<=l;k++)
{
mat[j][k]-=mat[i][k]*tmp;
}
}
}
for (int i=l-;i>=;i--)
{
real tmp=mat[i][n*n];
for (int j=i+;j<n*n;j++)
tmp-=res[j]*mat[i][j];
res[i]=tmp/mat[i][i];
}
for (int i=;i<n;i++)
printf("%.6lf ",res[i*n+i]);
}
概率1
概率期望dp以及高消在很多时候都是可以转化的,而适当的转化会使思维难度大大降低。
//Miller Rabin
//HDU 2138
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long qword;
qword pow_mod(qword x,qword y,int mod)
{
qword ret=%mod;
while (y)
{
if (y&)ret=ret*x%mod;
x=x*x%mod;
y>>=;
}
return ret;
} bool MillerRabin(qword a,int n)
{
int x=n-,y=;
while ((x&)==)x>>=,y++;
a=pow_mod(a,x,n);
int pe=a;
for (int i=;i<y;i++)
{
pe=a;
a=a*a%n;
if (a== && pe!=n- && pe!=)return false;
}
return a==?true:false;
} int main()
{
// freopen("input.txt","r",stdin);
int n;
int x;
int s[]={,,,,,};
while (~scanf("%d",&n))
{
int ans=; for (int i=;i<n;i++)
{
scanf("%d",&x);
if (x==)
{
continue;
}else if (x==)
{
ans++;
continue;
}
bool flag=true;
for (int j=;j<;j++)
{
if (s[j]>=x)continue;
if (!MillerRabin(s[j],x))
{
flag=false;
break;
}
}
if (flag)
{
ans++;
}
}
printf("%d\n",ans);
Miller Rabin
这种时候还理解什么,赶快背啊!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define MAXN 110000
#define MAXM 210
#define BIG 1000000000000000LL
typedef long long qword;
int a[MAXN];
qword s[MAXN];
qword dp[][MAXN];
struct point
{
qword x,y;
};
qword area(point p1,point p2,point p3)
{
return (p1.x-p2.x)*(p1.y-p3.y) - (p1.y-p2.y)*(p1.x-p3.x);
}
point q[MAXN]; int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
//if (!a[i])i--,n--;
}
for (int i=;i<=n;i++)
s[i]=s[i-]+a[i];
for (int i=;i<;i++)
for (int j=;j<=n;j++)
dp[i][j]=-BIG;
int head,tail;
point pt;
dp[][]=;
for (int i=;i<=m;i++)
{
head=;
tail=-;
for (int j=;j<=n;j++)
{
pt.x=s[j-];
pt.y=-s[n]*s[j-]+dp[(i&)^][j-];
while (head<tail && area(q[tail-],q[tail],pt)>=)
{
if (area(q[tail-],q[tail],pt)==)
{
cout<<"haha"<<endl;
}
tail--;
}
q[++tail]=pt;
while (head<tail && s[j]*q[head].x+q[head].y<=s[j]*q[head+].x+q[head+].y)
head++;
dp[i&][j]=s[j]*q[head].x+q[head].y + s[n]*s[j]-s[j]*s[j];
// printf("%lld ",dp[i&1][j]);
}
dp[i&][]=-BIG;
// printf("\n");
}
qword ans=;
for (int i=;i<=n;i++)
ans=max(ans,dp[m&][i]);
printf("%lld\n",ans);
}
斜率优化
//POJ 1160
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 3100
#define MAXM 40
#define INF 0x3f3f3f3f
int w[MAXN][MAXN],w1[MAXN][MAXN];
int a[MAXN];
int dp[MAXM][MAXN];
pair<int,int> srange[MAXN];
int stack[MAXN];
int tops=-; int main()
{
freopen("input.txt","r",stdin);
int n,m;
int x,y,z;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",a+i);
for (int i=;i<=n;i++)
{
for (int j=i;j<=n;j++)
{
if ((i+j)/==(i+j-)/)
w[i][j]=w[i][j-]+a[j]-a[(i+j)/];
else
w[i][j]=w[i][j-]+(a[(i+j)/]-a[(i+j-)/])*(((i+j)/-i) - (j-(i+j)/))
+a[j]-a[(i+j)/];
}
}
memset(dp,INF,sizeof(dp));
dp[][]=;
srange[++tops]=make_pair(,n);
stack[tops]=;
for (int i=;i<=m;i++)
{
while (~tops)
{
for (int j=srange[tops].first;j<=srange[tops].second;j++)
dp[i][j]=dp[i-][stack[tops]]+w[stack[tops]+][j];
tops--;
}
for (int j=;j<=n;j++)
{
while (~tops && dp[i][j]+w[j+][srange[tops].first]<dp[i][stack[tops]]+w[stack[tops]+][srange[tops].first])
tops--;
if (~tops)
{
int l=srange[tops].first;
int r=srange[tops].second+;
while (l+<r)
{
int mid=(l+r)>>;
if (dp[i][j]+w[j+][mid]<dp[i][stack[tops]]+w[stack[tops]+][mid])
r=mid;
else
l=mid;
}
srange[tops].second=l;
if (r<=n)
{
srange[++tops]=make_pair(r,n);
stack[tops]=j;
}
}else
{
srange[++tops]=make_pair(,n);
stack[tops]=j;
}
}
}
int ans=dp[m][n];
printf("%d\n",ans);
return ;
}
1D1D优化
//bzoj 1856
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 20100403
#define MAXN 2001000
typedef long long qword;
qword fact[MAXN];
qword pow_mod(qword x,qword y)
{
qword ret=;
while (y)
{
if (y&)ret=ret*x%MOD;
x=x*x%MOD;
y>>=;
}
return ret;
}
qword C(int x,int y)
{
if (x<y)return ;
return fact[x]*pow_mod(fact[x-y],MOD-)%MOD*pow_mod(fact[y],MOD-)%MOD;
} int main()
{
//freopen("input.txt","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
fact[]=;
for (int i=;i<=n+m;i++)
fact[i]=fact[i-]*i%MOD;
qword ans=C(n+m,n)-C(n+m,n+);
ans=(ans%MOD+MOD)%MOD;
printf("%d\n",(int)ans);
}
Catalan
//bzoj 3339
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
#define MAXN 210000
#define smid ((l+r)>>1)
int n,m;
int a[MAXN];
int tmp[MAXN],prv[MAXN];
const int big=;
struct qur_t
{
int id,l,r,ans;
}qur[MAXN];
vector<qur_t> vec;
bool cmp_r(qur_t q1,qur_t q2)
{
return q1.r<q2.r;
}
int res[MAXN];
void solve(int l,int r,vector<qur_t> &vec)
{
if (l==r)
{
for (int i=;i<vec.size();i++)
res[vec[i].id]=l;
return ;
}
vector<qur_t> v1,v2;
multiset<int> S;
sort(vec.begin(),vec.end(),cmp_r);
for (int i=l;i<=smid;i++)
S.insert(tmp[i]);
int cur=n;
for (int i=vec.size()-;i>=;i--)
{
while (vec[i].r<cur)
{
if (a[cur]<=smid && a[cur]>=l)
{
S.erase(S.find(cur));
S.insert(prv[cur]);
}
cur--;
}
if (*S.begin()<vec[i].l)
v1.push_back(vec[i]);
else
v2.push_back(vec[i]);
}
solve(l,smid,v1);
solve(smid+,r,v2);
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int x,y,z;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
for (int i=;i<=n;i++)
{
prv[i]=tmp[a[i]];
tmp[a[i]]=i;
}
for (int i=;i<=m;i++)
{
scanf("%d%d",&qur[i].l,&qur[i].r);
qur[i].id=i;
}
vec.insert(vec.begin(),qur+,qur+m+);
solve(,big+,vec);
for (int i=;i<=m;i++)
printf("%d\n",res[i]); }
NOI考前乱写的更多相关文章
-
C语言--乱写C语言
C语言的语法太枯燥了 换个写法 #include <stdio.h> #include<stdlib.h> #define end } #define if(x) if ( ...
-
工作日常-SQL不能乱写
前言:刚接手别人的项目没多久,在昨天的一次上线中无故躺坑,且该大兄弟已经离职,不得不帮他填坑,整完后,今天想搞一个总结,结论就是:SQL不能乱写. 搜索关键词:Cause: java.sql.SQLE ...
-
冲刺CSP-S集训考试反思+其它乱写(密码私信)
RT.开坑. 10.1 开门黑23333. 放假回来稍困,而且感冒似乎愈加严重,导致我正常考试基本睁不开眼.一个小时勉强把题读懂,神志恍惚如斯. 看T2觉得估计又是各种推柿子堆定理的数学大题,写了个暴 ...
-
java代码,输入n多个数,求其平均值,虽有重复,但是第二次,我就乱写了
总结:对象调用方法,与在main 里直接输出没什么大的区别,少用方法, 乱搞++++ package com.c2; import java.util.Scanner; public class DD ...
-
「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
-
dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
-
【XJOI】【NOI考前模拟赛7】
DP+卡常数+高精度/ 计算几何+二分+判区间交/ 凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……( ...
-
杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
面试过好多人,包括自己也属于这么一个情况: 遇到问题直接去网上查,一般都可以查到解决方案.其中也包括一些基本的面试资料的答案. 其实有很多答案也都是正确的,但是还是存在一些压根就是胡乱抄来的答案,也不 ...
-
关于一道你们眼中的水题 Windy数 的乱写(数位dp)
啊一道水题有什么好说的 上课听不懂,下课泪两行. 有的人什么套路都会,我.. 只能可怜巴巴的抄代码,然后自己总结,顺(zhu)便(yao)颓博客 1.递推dp的思路做到一半死了,怎么也想不出来如何处理 ...
随机推荐
-
.net开发笔记(十二) 设计时与运行时的区别(续)
上一篇博客详细讲到了设计时(DesignTime)和运行时(RunTime)的概念与区别,不过没有给出实际的Demo,今天整理了一下,做了一个例子,贴出来分享一下,巩固前一篇博客讲到的内容. 简单回顾 ...
-
(转)A Beginner&#39;s Guide To Understanding Convolutional Neural Networks Part 2
Adit Deshpande CS Undergrad at UCLA ('19) Blog About A Beginner's Guide To Understanding Convolution ...
-
openstack controller ha测试环境搭建记录(十)——配置neutron(控制节点)
创建neutron用户:mysql -u root -p CREATE DATABASE neutron;GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@ ...
-
Linux集群问题~浅谈
系统扩展的方式 # scale up 向上扩展 # scale out 向外扩展 集群类型 LB 负载均衡集群 Load Balancing HA 高可用集群 High Availability HP ...
-
Python——逻辑运算(or,and)
print(0 and 2 > 1) #结果0 print(0 and 2 < 1) #结果0 print(1 and 2 > 1) #结果True print(1 and 2 &l ...
-
Netty官网首页(翻译)
官网:https://netty.io/ Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议 ...
-
文件系统(File System)
什么是文件系统,引用百科解释: 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 文件系统是操作系统核心的组成部分,没有它我们无法完成对文件的增.删.改.查等基本操作 概念 ...
-
Webpack 常用命令总结以及常用打包压缩方法
前言:Webpack是一款基于node的前端打包工具,它可以将很多静态文件打包起来,自动处理依赖关系后,生成一个.js文件,然后让html来引用,不仅可以做到按需加载,而且可以减少HTTP请求,节约带 ...
-
java.lang.NullPointerException 空指针异常问题
java.lang.NullPointerException 空指针异常问题: 空指针异常抛出的异常信息一般是: Exception in thread "main" java.l ...
-
属性检测 In,hasOwnPreperty()和propertyIsEnumerable()
IN 左侧是属性名:右侧是对象名, 如果 属性是 自有属性 或者继承属性 则返回 TRUE var o={x:1,y:2} "x" in o 返回 true: hasOw ...