有人问我为什么有些题那么快_(:зゝ∠)_
所以我来解释一下我加的黑科技,题目编号是乱的= =,有想要我解释的题请评论
首先是fastio,bzoj上有了这个就可以轻易rank1吧。。
#define S 100000
char bf[S],*p1=bf,*p2=bf;
#define nc() (p1==p2&&(p2=(p1=bf)+fread(bf,1,S,stdin),p2==p1)?-1:*p1++)
inline int read(){
int x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
char pf[S],*o1=pf,*o2=pf+S;
#define ot(x) (o1==o2?fwrite(pf,1,S,stdout),*(o1=pf)++=x:*o1++=x)
inline void print(int x){static char s[15],*b;b=s;if(!x)*b++=48;for(;x;*b++=x%10+48,x/=10);for(;b--!=s;ot(*b));}
fwrite(pf,1,o1-pf,stdout);
//for(i=1;i<=m;++i)print(ans[i]),ot('\n');
所以在这里我就不解释用fastio艹上去的题了
bzoj4345

题解在这-->http://qiancl.is-programmer.com/posts/191596.html
我会说黑科技是因为用了splay吗
bzoj4373(已被艹)

题解在这-->http://qiancl.is-programmer.com/posts/192245.html
这题是使过的
bzoj4260

题解在这-->http://qiancl.is-programmer.com/posts/183365.html
这题字母树自带30常数,然后我发现把长度改小也能过,于是嘿嘿嘿
bzoj4278

这题啊。。接下去的几个人都是900+ms了
我的做法是贪心,可以简单的插掉。。做法我想不起来了具体就看代码吧= =
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define nc() getchar()
inline int read(){
int x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
#define N 200020
int n,m,i,j,l,r,L,R,a[N],b[N];
int main(){
for(n=read(),i=1;i<=n;++i)a[i]=read();
for(m=read(),i=1;i<=m;++i)b[i]=read();
l=r=1;a[n+1]=0x7f7f7f7f;b[m+1]=0x7f7f7f7f;
while(l<=n||r<=m){
if(a[l]<b[r]){
if(L){for(i=l-L,r-=R;i<l&&b[r]>=a[i];++i)printf("%d ",a[i]);l=i,L=R=0;}
else printf("%d ",a[l++]);
}else if(a[l]==b[r])++L,++l,++r,++R;
else if(a[l]>b[r]){
if(L){for(i=r-R,l-=L;i<r&&a[l]>=b[i];++i)printf("%d ",b[i]);r=i,L=R=0;}
else printf("%d ",b[r++]);
}
}
for(i=n-L+1;i<=n;++i)printf("%d ",a[i]);
for(i=m-R+1;i<=m;++i)printf("%d ",b[i]);
}
bzoj4281(已被艹)

这题只是求一下LCA,= =LCA怎么求呢。。树剖啊,树剖的log很神奇~,我上面那个估计也应该写的树剖吧。。不过代码长度好鬼畜
bzoj3784

刚开始我还想着用st表来O(1)查询把速度提上去,然后发现跑的真tm慢,还不如人家线段树,既然线段树辣么快,那我写棵zkw好了,没想到效果辣么好
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define nc() getchar()
inline int read(){
int x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
#define N 50050
int i,j,k,m,n,x,y,M,cnt,last[N],root,allsz,sz[N],f[N],L,R,ed,can[N<<1],q[N*15],anscnt,mx[N*15*4];
struct node{
int v,l,m,r,w;
inline bool operator<(const node&b)const{return v<b.v;}
}pre[N*15];
struct edge{int to,next,v;}e[N<<1];
inline void add(int w,int v,int u){
e[++cnt]=(edge){v,last[u],w},last[u]=cnt;
e[++cnt]=(edge){u,last[v],w},last[v]=cnt;
}
inline void Mx(int&a,int b){if(b>a)a=b;}
void find(int x,int fa){
sz[x]=1,f[x]=0;
for(int i=last[x],y;i;i=e[i].next)if((y=e[i].to)!=fa&&can[i])find(y,x),sz[x]+=sz[y],Mx(f[x],sz[y]);
Mx(f[x],allsz-sz[x]);if(f[x]<f[root])root=x;
}
void dfs(int x,int fa,int w){
q[++ed]=w,pre[++anscnt]=(node){L,R,w};
for(int i=last[x];i;i=e[i].next)if(e[i].to!=fa&&can[i])dfs(e[i].to,x,w+e[i].v);
}
void work(int x){
L=ed+1;for(int i=last[x];i;i=e[i].next)if(can[i])R=ed,dfs(e[i].to,x,e[i].v);
pre[++anscnt]=(node){L,ed,0};
for(int i=last[x];i;i=e[i].next)if(can[i])can[i^1]=0,f[0]=allsz=sz[e[i].to],find(e[i].to,root=0),work(root);
}
inline int max(int a,int b){return q[a]>q[b]?a:b;}
priority_queue<node>Q;
inline void build(int n){
for(M=1;M<=n+1;M<<=1);
for(int i=M+1;i<=M+n;++i)mx[i]=i-M;
for(int i=M-1;i>0;--i)mx[i]=max(mx[i<<1],mx[i<<1|1]);
}
inline int ask(int l,int r){
int ans=ed+1;
for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1){
if(~l&1)ans=max(ans,mx[l^1]);
if(r&1)ans=max(ans,mx[r^1]);
}return ans;
}
inline void insert(int l,int r,int w){
if(l>r)return;int x=ask(l,r);
Q.push((node){q[x]+w,l,x,r,w});
}
int main(){
for(n=read(),m=read(),cnt=i=1,memset(can,1,sizeof can);i<n;++i)add(read(),read(),read());
for(f[0]=allsz=n,find(1,root=0),work(root),q[ed+1]=-0x7f7f7f7f,build(ed),i=1;i<=anscnt;++i)insert(pre[i].v,pre[i].l,pre[i].m);
while(m--){
node now=Q.top();Q.pop(),printf("%d\n",now.v);
insert(now.l,now.m-1,now.w),insert(now.m+1,now.r,now.w);
}
}
updating...
2016年3月10日 10:43
4278是错的,eg.
3
1 2 3
3
1 2 3
2016年3月11日 12:08
@star: 嗯,所以说可以简单的叉掉