这是一个句子测试

12
20
2015
0

Contest20151217滚粗记

听说这是JSOIDay6(为什么江苏有这么多省选)

膜了贵省的题目,感到不明觉厉。

T1

这是一道人类智慧题。(其实是窝想错了)

考试时不断YY费用流的模型。(其实是被Gold_7误导了)

然而这是一道区间dp。

把每个敌人抽象为左端点为ai,右端点为bi,高度为ci的线段。

对于区间[l,r],找到其中最高的线段,枚举上面的点,然后用一条直线切断它以及它下方可以切断的点,那么就阔以转移辣!

T2

这是一道难题。(其实是因为gonens不会做)

那么就介绍一下60分蒜法:枚举根,dfs,然后在线段树上修改和询问就阔以辣!

(然而窝忘记开longlong了)

T3

这是一道码农题。(其实是窝写得臭)

考试的时候发现在线是用来搞笑的。

后来正解说明在线确实是用来搞笑的。

首先从大到小枚举边,并查集维护连通性,如果不在同一个集合里就直接加上去,否则找到环上最大的边,删去。

接着用可持久化线段树维护一下选择的边。

最后对于区间[l,r]就是在编号为l的线段树上询问[l,r]。

(然而其中的离散实在是太蛋疼了)

[Codes]

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1010;
int cas,n,i,j,k,p,cnt;
int a[M],b[M],c[M],g[M],A[M],f[M][M];
int main(){
		memset(f,0,sizeof f);
		scanf("%d",&n);
		cnt=0;
		for (i=1;i<=n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]),A[++cnt]=a[i],A[++cnt]=b[i];
		sort(A+1,A+cnt+1);
		cnt=unique(A+1,A+cnt+1)-A-1;
		for (i=1;i<=n;i++)a[i]=lower_bound(A+1,A+cnt+1,a[i])-A,b[i]=lower_bound(A+1,A+cnt+1,b[i])-A;
		for (p=1;p<cnt;p++)
			for (i=1;i<=cnt-p;i++){
				memset(g,0,sizeof g);
				int j=i+p,mx=0;
				f[i][j]=1000000007;
				for (k=1;k<=n;k++)
					if (a[k]>=i&&b[k]<=j&&c[k]>mx)mx=c[k];
				if (!mx){f[i][j]=0;continue;}
				for (k=1;k<=n;k++)
					if (a[k]>=i&&b[k]<=j&&c[k]==mx)g[b[k]+1]--,g[a[k]]++;
				for (k=i+1;k<=j;k++)g[k]+=g[k-1];
				for (k=i;k<=j;k++)
					if (g[k]>0)f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+mx);
			}
		printf("%d\n",f[1][cnt]);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000010;
const int M=5010;
long long ans1;
int n,i,x,y,ch,edgenum,ans2;
int head[M],vet[M],next[M],len[M],flag[M];
int tree[maxn*4];
void addedge(int x,int y,int ch){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
	len[edgenum]=ch;
}
int query(int x,int l,int r,int p){
	if (l==r)return l;
	int mid=l+r>>1;
	if (tree[p<<1]>=x)return query(x,l,mid,p<<1);
		else return query(x-tree[p<<1],mid+1,r,p<<1|1);
}
void update(int x,int l,int r,int p,int t){
	tree[p]+=t;
	if (l==r)return;
	int mid=l+r>>1;
	if (x<=mid)update(x,l,mid,p<<1,t);
		else update(x,mid+1,r,p<<1|1,t);
}
void dfs(int u,int dep){
	int e,v;
	flag[u]=1;
	if (dep&1)ans1+=query(dep/2+1,1,maxn,1),ans2++;
	for (e=head[u];e;e=next[e]){
		v=vet[e];
		if (flag[v])continue;
		update(len[e],1,maxn,1,1);
		dfs(v,dep+1);
		update(len[e],1,maxn,1,-1);
	}
}
int main(){
	scanf("%d",&n);
	for (i=1;i<n;i++){
		scanf("%d%d%d",&x,&y,&ch);
		addedge(x,y,ch);
		addedge(y,x,ch);
	}
	for (i=1;i<=n;i++){
		memset(flag,0,sizeof flag);
		dfs(i,0);
	}
	printf("%.7lf\n",(double)ans1/ans2);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=200010;
int n,m,i,j,sum,q,opt,x,y,ans,edgenum,cnt,mx,tot;
int A[M],B[M],b[M],root[M],f[M],id[M],fi[M];
int head[1010],edg[1010],vet[M],next[M],len[M],isok[M],data[M];
struct shit{int x,y,w;}a[M];
struct node{int l,r,w;}tree[M*40];
bool cmp(shit x,shit y){return x.w>y.w;}
void addedge(int x,int y,int ch,int w){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
	len[edgenum]=ch;
	data[edgenum]=w;
}
int dfs(int u,int pre,int st){
	int e,v;
	if (u==st&&pre!=-1)return 1;
	for (e=head[u];e;e=next[e]){
			v=vet[e];
			if (e==(pre^1))continue;
			if (dfs(v,e,st)){
				if (len[e]>len[mx])mx=e;
				return 1;
			}
		}
	return 0;
}
int search(int x){
	if (f[x]!=x)f[x]=search(f[x]);
	return f[x];
}
void update(int x,int l,int r,int &p,int t){
	tree[++cnt]=tree[p],p=cnt,tree[p].w+=t;
	if (l==r)return;
	int mid=l+r>>1;
	if (x<=mid)update(x,l,mid,tree[p].l,t);
		else update(x,mid+1,r,tree[p].r,t);
}
int query(int x,int y,int l,int r,int p){
	if (x>y)return 0;
	if (x==l&&y==r)return tree[p].w;
	int mid=l+r>>1;
	if (y<=mid)return query(x,y,l,mid,tree[p].l);
		else if (x>mid)return query(x,y,mid+1,r,tree[p].r);
			else return query(x,mid,l,mid,tree[p].l)+query(mid+1,y,mid+1,r,tree[p].r);
}
int main(){
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
	int mm=0;
	for (i=1;i<=m;i++)if (a[i].x!=a[i].y)a[++mm]=a[i];
	m=mm;
	sort(a+1,a+m+1,cmp);
	for (i=1;i<=m;i++)A[i]=a[m-i+1].w;
	sum=unique(A+1,A+m+1)-A-1;
	for (i=1;i<=m;i++)id[i]=lower_bound(A+1,A+sum+1,a[i].w)-A;
	for (i=1;i<=m;i++)id[i]=sum-id[i]+1;
	for (i=1;i<=n;i++)f[i]=i;
	for (i=1;i<=m;i++){
		edgenum=1;
		memset(head,0,sizeof head);
		for (j=1;j<=edg[0];j++)addedge(a[edg[j]].x,a[edg[j]].y,a[edg[j]].w,edg[j]),addedge(a[edg[j]].y,a[edg[j]].x,a[edg[j]].w,edg[j]);
		root[i]=root[i-1];
		fi[id[i]]=i;
		edg[++edg[0]]=i;
		addedge(a[i].x,a[i].y,a[i].w,i);
		addedge(a[i].y,a[i].x,a[i].w,i);
		update(id[i],1,sum,root[i],a[i].w);
		int p=search(a[i].x),q=search(a[i].y);
		if (p!=q){
			f[p]=q;
			continue;
		}
		mx=0;
		dfs(a[i].x,-1,a[i].x);
		mx=data[mx];
		update(id[mx],1,sum,root[i],-a[mx].w);
		int mm=0;
		for (j=1;j<=edg[0];j++)if (edg[j]!=mx)edg[++mm]=edg[j];
		edg[0]=mm;
	}
	scanf("%d%d",&q,&opt);
	while (q--){
		scanf("%d%d",&x,&y);
		int l=ans*opt+x,r=l+y,pre=r;
		if (l>A[sum]){puts("0");ans=0;continue;}
		l=lower_bound(A+1,A+sum+1,l)-A;
		r=upper_bound(A+1,A+sum+1,r)-A-1;
		r=sum-r+1,l=sum-l+1;
		ans=query(r,l,1,sum,root[fi[l]]);
		printf("%d\n",ans);
	}
}
Category: 蒟蒻的滚粗记 | Tags:
12
15
2015
0

Contest20151214滚粗记

听说这是JSOIDay5

膜了贵省的题目,感到不明觉厉。

条哥出去吔东西了,于是没有断网。

为了比赛公平,窝决定先泼会隔膜。

T1

这是一道好题。(然而窝不会做)

NiroBC将此题吊着打太强辣!!!

考虑三维容斥,即选i行j列k中颜色,表示i行j列可染可不染,另外n-i行和m-j列必定不染,k种颜色可用可不用,c-k种颜色必定不用。

那么答案就是

[tex]\sum\limits_{i = 0}^n {\sum\limits_{j = 0}^m {\sum\limits_{k = 0}^c {\mathop C\nolimits_n^i \mathop C\nolimits_m^j } } } \mathop C\nolimits_c^k {(k + 1)^{ij}}{( - 1)^{n + m + c - i - j - k}}[/tex]

于是n3枚举i、j、k就可以辣!(NiroBC还有一个不明觉厉的n2logn的做法)

T2

这是一道送分题。(其实是窝做过)

首先考虑这样一种暴力:枚举i,然后在前面找j,求出[j,i]的gcd。

那么可以优化,即已经知道了gcd[i,j],那么gcd[i,j+1]=gcd(a[j+1],gcd[i,j])。

显然会发现有许多gcd是相同的,那么对于后面就没用辣~

那么只要维护一下不同的gcd就能AC了。(虽然理论上是n2的但是卡它的数据太难出了Orz)

T3

这是一道恶心题。(其实是窝懒得写)

首先对于每一条地铁线路构一条新的路径,其中上站的边权为1,0,下站的边权为0,0,中途乘坐的边权为0,1。

那么只要让第一维边权最短的情况下第二维边权最长,跑最短路就可以辣!

然并卵Spfa被卡飞。。

于是可以先dijkstra处理第一维最短路,那么出现在最短路上的边一定构成了一个DAG。

那么就可以拓扑排序辣!

【Codes】

#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int mod=1000000007;
int n,m,p,i,j,k;
ll ans;
ll c[410][410];
ll mi[410][160010];
int main(){
	scanf("%d%d%d",&n,&m,&p);
	c[0][0]=1;
	for (i=1;i<=max(n,max(m,p));i++){
		c[i][0]=1;
		for (j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
	}
	for (i=1;i<=p+1;i++){
		mi[i][0]=1;
		for (j=1;j<=n*m;j++)mi[i][j]=mi[i][j-1]*i%mod;
	}
	for (i=0;i<=n;i++)
		for (j=0;j<=m;j++)
			for (k=0;k<=p;k++){
				ll tmp=c[n][i]*c[m][j]%mod*c[p][k]%mod*mi[k+1][i*j]%mod;
				if ((n+m+p-i-j-k)&1)ans=(ans-tmp+mod)%mod;else ans=(ans+tmp)%mod;
			}
	printf("%lld\n",ans);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int M=200010;
int n,i,j,r;
ll ans;
ll a[M],h[M][2],q[M][2];
ll gcd(ll x,ll y){
	if (!(x%y))return y;else return gcd(y,x%y);
}
int main(){
	scanf("%d",&n);
	for (i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		for (j=1;j<=r;j++)h[j][0]=gcd(h[j][0],a[i]);
		h[++r][0]=a[i],h[r][1]=i;
		int cnt=1;
		q[1][0]=h[1][0],q[1][1]=h[1][1];
		ans=max(ans,h[1][0]*(i-h[1][1]+1));
		for (j=2;j<=r;j++)
			if (h[j][0]!=h[j-1][0]){
				q[++cnt][0]=h[j][0],q[cnt][1]=h[j][1];
				ans=max(ans,h[j][0]*(i-h[j][1]+1));
			}
		r=cnt;
		for (j=1;j<=cnt;j++)h[j][0]=q[j][0],h[j][1]=q[j][1];
	}
	printf("%lld\n",ans);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#define fi first
#define se second
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int M=5000010;
const int inf=1000000007;
int n,m,i,j,y,st,ed,tmp,cnt,edgenum,Edgenum;
char s[50];
int head[M],vet[M],next[M],Head[M],Vet[M],Next[M],Len[M],init[M],dis[M],Dis[M],len[M][2],inq[M],x[M],q[M];
priority_queue<PII,vector<PII>,greater<PII> >Q;
pair<ull,int>a[M];
int solve(){
	ull tmp=0;
	for (int i=0;i<strlen(s);i++)tmp=tmp*2333+s[i];
	int ans=a[lower_bound(a+1,a+m+1,make_pair(tmp,0))-a].se;
	return ans;
}
void addedge(int x,int y,int p,int q){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
	len[edgenum][0]=p;
	len[edgenum][1]=q;
}
void Addedge(int x,int y,int p){
	Vet[++Edgenum]=y;
	Next[Edgenum]=Head[x];
	Head[x]=Edgenum;
	Len[Edgenum]=p;
	init[y]++;
}
void dijkstra(){
	for (i=1;i<=cnt;i++)dis[i]=inf;
	Q.push(make_pair(0,st));dis[st]=0;
	for (i=1;i<=cnt;i++)inq[i]=0;
	while (!Q.empty()){
		int u=Q.top().se;Q.pop();
		if (inq[u])continue;
		inq[u]=1;
		for (int e=head[u];e;e=next[e]){
			int v=vet[e];
			if (dis[u]+len[e][0]<dis[v]){
				dis[v]=dis[u]+len[e][0];
				Q.push(make_pair(dis[v],v));
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++){
		scanf("%s",s);
		for (j=0;j<strlen(s);j++)a[i].fi=a[i].fi*2333+s[j];
		a[i].se=i;
	}
	sort(a+1,a+m+1);
	cnt=m;
	for (i=1;i<=n;i++){
		scanf("%d",&tmp);
		scanf("%s",s);
		x[1]=solve();
		addedge(x[1],++cnt,1,0);
		for (j=2;j<=tmp;j++){
			scanf("%s",s);
			y=cnt,x[j]=solve();
			addedge(y,++cnt,0,1);
			addedge(x[j],cnt,1,0);
			addedge(cnt,x[j],0,0);
		}
		addedge(x[tmp],++cnt,1,0);
		for (j=tmp-1;j>=1;j--){
			y=cnt;
			addedge(y,++cnt,0,1);
			addedge(x[j],cnt,1,0);
			addedge(cnt,x[j],0,0);
		}
	}
	scanf("%s",s);
	st=solve();
	scanf("%s",s);
	ed=solve();
	dijkstra();
	for (i=1;i<=cnt;i++)
		for (int e=head[i];e;e=next[e])
			if (dis[i]+len[e][0]==dis[vet[e]])Addedge(i,vet[e],len[e][1]);
	int l=1,r=0;
	for (i=1;i<=cnt;i++)if (!init[i])q[++r]=i;
	while (l<=r){
		int u=q[l++];
		for (int e=Head[u];e;e=Next[e]){
			int v=Vet[e];
			init[v]--;
			if (init[v]==0)q[++r]=v;
		}
	}
	for (i=1;i<=cnt;i++){
		int u=q[i];
		for (int e=Head[u];e;e=Next[e]){
			int v=Vet[e];
			Dis[v]=max(Dis[v],Dis[u]+Len[e]);
		}
	}
	printf("%d\n%d\n",dis[ed],Dis[ed]);
}
Category: 蒟蒻的滚粗记 | Tags:
12
13
2015
0

Contest20151211滚粗记

听说这是JSOIDay4

膜了贵省的题目,感到不明觉厉。

T1

咦这是什么题目?

5min过去了。。。听说NiroBC已经AK弃疗了。。。

Orz好像70分是送的。。

那么想一想正解吧。

考虑一条u->v的边,那么这条边被删掉的条件是:存在另一条路径使得u能到v。

那么分块,如果u的出度小于[tex]\sqrt n[/tex],就枚举u的出边,否则枚举v的入边。

那么问题就转化为判断两点的连通性。

那么只要拓扑+压位就可以辣!

T2

咦这是什么题目?

好吧先yy个20分暴力。

接着Gold_7将此题AC,感到不明觉厉。

正解是:

将正权连源,负权连汇,按照墙的权值建图,跑最小割。

ans=权值绝对值之和-最小割。

正确性在于:假如存在一条源到汇的路径,那么显然:

1、不取正权的点。

2、不取负权的点。

3、用墙将它们隔开。

那么只要把这条路径隔断就可以了。

T3

咦这是什么题目?

好吧先yy个20分暴力。

结果写萎了。。

蛋疼的满分算法如下:

显然最大值的长度len为[tex]\left[ {\frac{{n - 1}}{k}} \right] + 1[/tex]

那么可以对所有点向后扩展len位,排序,显然答案必定是这些数其中一个。

那么二分,每个点能扩展len位就扩展,否则扩展len-1位。

接着只要判断一下有没有一种扩展方式在扩展了k次的限制下超过了n位就可以辣!

【Codes】

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
typedef long long ll;
using namespace std;
const int M=200010;
const int N=30010;
int n,m,i,l,r,edgenum,edgenum1,ans;
int head[M],vet[M],next[M],price[M],head1[M],vet1[M],next1[M],x[M],y[M],h[M];
ll f[N][1010];
void addedge(int x,int y){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
	price[y]++;
}
void addedge1(int x,int y){
	vet1[++edgenum1]=y;
	next1[edgenum1]=head1[x];
	head1[x]=edgenum1;
	price[y]++;
}
int main(){
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)scanf("%d%d",&x[i],&y[i]),addedge(y[i],x[i]);
	for (i=1;i<=n;i++){
		if (!price[i])h[++r]=i;
		f[i][i/30]=(1<<(i%30));
	}
	l=1;
	while (l<=r){
		int u=h[l];
		for (int e=head[u];e;e=next[e]){
			int v=vet[e];
			for (i=0;i<=n/30;i++)f[v][i]|=f[u][i];
			price[v]--;
			if (!price[v])h[++r]=v;
		}
		l++;
	}
	for (i=1;i<=m;i++)addedge1(x[i],y[i]);
	for (i=1;i<=m;i++)
		if (price[x[i]]<=sqrt(n)){
			for (int e=head1[x[i]];e;e=next1[e]){
				int v=vet1[e];
				if (v==y[i])continue;
				if (f[v][y[i]/30]&(1<<(y[i]%30))){ans++;break;}
			}
		}else{
			for (int e=head[y[i]];e;e=next[e]){
				int v=vet[e];
				if (v==x[i])continue;
				if (f[x[i]][v/30]&(1<<(v%30))){ans++;break;}
			}
		}
	printf("%d\n",ans);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=400010;
int n,m,i,j,edgenum,source,sink,cnt,ans,x; 
int head[M],vet[M],next[M],size[M],h[M],q[M];
int point[210][210];
void addedge(int x,int y,int ch){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
	size[edgenum]=ch;
	vet[++edgenum]=x;
	next[edgenum]=head[y];
	head[y]=edgenum;
}
int bfs(){
	for (int i=1;i<=M;i++)h[i]=-1;
	int l=1,r=1;
	q[1]=source,h[source]=0;
	while (l<=r){
		int u=q[l];
		for (int e=head[u];e;e=next[e])
			if (size[e]>0&&h[vet[e]]<0){
				int v=vet[e];
				h[v]=h[u]+1;
				q[++r]=v;
			}
		l++;
	}
	if (h[sink]<0)return 0;else return 1;
}
int dfs(int u,int aug){
	if (u==sink)return aug;
	int flow=0;
	for (int e=head[u];e;e=next[e])
		if (size[e]>0&&h[vet[e]]==h[u]+1){
			int v=vet[e];
			int tmp=dfs(v,min(aug-flow,size[e]));
			size[e]-=tmp;
			size[e^1]+=tmp;
			flow+=tmp;
			if (flow==aug)return flow;
		}
	if (!flow)h[u]=-1;
	return flow;
}
int main(){
	scanf("%d%d",&n,&m);
	source=1,sink=n*m+2,cnt=1,edgenum=1;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++){
			scanf("%d",&x);
			point[i][j]=++cnt;
			if (x>0)addedge(source,point[i][j],x),ans+=x;else if (x<0)addedge(point[i][j],sink,-x),ans-=x;
		}
	for (i=1;i<n;i++)
		for (j=1;j<=m;j++){
			scanf("%d",&x);
			addedge(point[i][j],point[i+1][j],x);
			addedge(point[i+1][j],point[i][j],x);
		}
	for (i=1;i<=n;i++)
		for (j=1;j<m;j++){
			scanf("%d",&x);
			addedge(point[i][j],point[i][j+1],x);
			addedge(point[i][j+1],point[i][j],x);
		}
	while (bfs())ans-=dfs(source,1000000007);
	printf("%d\n",ans);
}
Category: 蒟蒻的滚粗记 | Tags:
12
8
2015
0

Contest20151207滚粗记

听说这是JSOIDay3

膜了贵省的题目,感到不明觉厉。

Orz NiroBC 210

Orz Chrysanthemum 130

Orz drc神犇(SB) 0

T1

看到期望慌了,先吔点东西压压惊。

好吧让窝萌推一下。

对于一个女性,列表中总共有cnt个对象,选中第i个对象的概率:

[tex]\sum\limits_{j = 0}^{ + \infty } {p*{{(1 - p)}^{i + cnt*j - 1}}}[/tex]

显然这是一个等比数列,列出求和公式:

[tex]\frac{{1 - {{(1 - p)}^j}}}{{1 - {{(1 - p)}^{cnt}}}}*p*{(1 - p)^{i - 1}}[/tex]

当j趋向于正无穷时(1-p)j趋向于0,那么公式就变成了:

[tex]\frac{{p*{{(1 - p)}^{i - 1}}}}{{1 - {{(1 - p)}^{cnt}}}}[/tex]

接着只要倒着扫一遍,然后将概率一一插入树状数组并询问就可以辣!

什么我居然丢了这送的40分。

T2

看到题目慌了,这不是NiroBC出的Gold_7穿裙子?

让窝萌来YY一个最小割小费用最大流吧。

哦好像是错的。愉快爆蛋。

我去正解是贪心。。。贪心怎会没有反例

考虑将x0放入x,y0放入y,其中b[x]>b[y],Out[x0]<Out[y0]。

如果把x0放入y,y0放入x(假设x0和y0都是可以放进x和y的)。

ans1=(In[x]-Out[x0])*b[x]+(In[y]-Out[y0])*b[y]

ans2=(In[x]-Out[y0])*b[x]+(In[y]-Out[x0])*b[y]

ans1-ans2=(Out[y0]-Out[x0])*(b[x]-b[y])<0

显然按b排序,取能放下的最大的,一定不存在更优解。

所以贪心好像没有反例。

那么用数据结构维护一下就可以辣!

(窝用二分+线段树O(nlogn2)然而Gold_7用set既快又短。。。)

T3

看到计蒜几何慌了,让我先打个20分压压惊。

诶好像40分也很好拿吖。

诶好像这只是一道码农题+乱搞题。

拒绝做这种恶心题。

【Codes】

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1000010;
int n,m,i,j,x,y,edgenum;
double p,ans;
int head[M],vet[M],next[M],a[M];
double tree[M];
double mi[M];
void addedge(int x,int y){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
}
int lowbit(int x){return x&(-x);}
double query(int x){
	double ans=0;
	while (x){
		ans+=tree[x];
		x-=lowbit(x);
	}
	return ans;
}
void update(int x,double t){
	while (x<=n){
		tree[x]+=t;
		x+=lowbit(x);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	scanf("%lf",&p);
	for (i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		addedge(x,y);
	}
	mi[0]=1;
	for (i=1;i<=n;i++)mi[i]=mi[i-1]*(1-p);
	for (i=n;i>=1;i--){
		int cnt=0;
		for (int e=head[i];e;e=next[e])a[++cnt]=vet[e];
		sort(a+1,a+cnt+1);
		for (j=cnt;j>=1;j--)ans+=p*mi[j-1]/(1-mi[cnt])*query(a[j]-1),update(a[j],p*mi[j-1]/(1-mi[cnt]));
	}
	printf("%.2lf",ans);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
int n,i,flag;
ll ans;
int tree[500010];
struct shit{ll in;ll out;ll imp;}a[500010];
bool cmp(shit i,shit j){return i.imp>j.imp;}
void update(int x,int l,int r,int p,int cmp){
	tree[p]+=cmp;
	if (l==r)return;
	int mid=l+r>>1;
	if (x<=mid)update(x,l,mid,p<<1,cmp);else update(x,mid+1,r,p<<1|1,cmp);
}
int search(int x,int y,int l,int r,int p){
	if (x==l&&y==r)return tree[p];
	int mid=l+r>>1;
	if (y<=mid)return search(x,y,l,mid,p<<1);
		else if (x>mid) return search(x,y,mid+1,r,p<<1|1);
			else return search(x,mid,l,mid,p<<1)+search(mid+1,y,mid+1,r,p<<1|1);
}
int main(){
	scanf("%d",&n);
	for (i=1;i<=n;i++)scanf("%d%d%d",&a[i].out,&a[i].in,&a[i].imp);
	sort(a+1,a+n+1,cmp);
	for (i=1;i<=n;i++)update(a[i].out,1,10000,1,1);
	for (i=1;i<=n;i++){
		if (a[i].in==1){ans+=a[i].in*a[i].imp;continue;}
		int cnt=0;
		int l=1,r=a[i].in-1;
		while (l+1<r){
			int mid=l+r>>1;
			if (search(mid,a[i].in-1,1,10000,1))l=mid;else r=mid;
		}
		if (search(r,a[i].in-1,1,10000,1))cnt=r;else if (search(l,a[i].in-1,1,10000,1))cnt=l;else ans+=a[i].in*a[i].imp;
		if (cnt)update(cnt,1,10000,1,-1),ans+=(a[i].in-cnt)*a[i].imp;
	}
	printf("%lld\n",ans);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const double pi=3.1415926535;
int n,i,ans,ans1,flag[100];
double stx[100],sty[100],edx[100],edy[100];
double X1,Y1,X2,Y2,ang,len,k;
int check(int x){
	if (stx[x]==edx[x]){if (k*stx[x]>=sty[x]&&k*stx[x]<=edy[x]||k*stx[x]>=edy[x]&&k*stx[x]<=sty[x])return 0;else return 1;}
	double k1=(edy[x]-sty[x])/(edx[x]-stx[x]);
	double b=sty[x]-stx[x]*k1;
	if (k==k1)return 1;
	double xx=b/(k-k1);
	if (xx>=stx[x]&&xx<=edx[x])return 0;else return 1;
}
int main(){
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	scanf("%d%lf%lf",&n,&ang,&len);
	for (i=1;i<=n;i++){
		scanf("%lf%lf%lf%lf%d",&stx[i],&sty[i],&edx[i],&edy[i],&flag[i]);
		if (stx[i]>edx[i])swap(stx[i],edx[i]),swap(sty[i],edy[i]);
		if (flag[i]==1){printf("Orz\n");return 0;}
	}
	scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2); 
	double shit=X1;
	while (shit<=X2){
		shit=shit+(X2-X1)/1000000;
		if (shit==0)continue;
		ans1++;
		k=Y1/shit;
		for (i=1;i<=n+1;i++)
			if (i==n+1||!check(i))break;
		if (i!=n+1)continue;
		double x=Y1/k;
		if (shit*shit+Y1*Y1<=len*len){
			if (shit<0&&atan(k)+pi/2<=ang/360*pi||shit>0&&pi/2-atan(k)<=ang/360*pi)ans++;
		}
	}
	printf("%.4lf\n",(double)ans/ans1);
}
Category: 蒟蒻的滚粗记 | Tags:
12
4
2015
0

UOJ Round #10滚粗记

既然UOJ Easy Round是省选难度,那么请问不带Easy的是什么鬼?

当然我的Blog也出现了点意外,计数器君被drc刷爆了。

T1

诶这是什么神题,我怎么连30分都不会做。

哎呦原来只要可行解呀,这60分是送的呀,出题人送温暖啊。

那就打60分好了。

接着Gold_7AC此题,感到不明觉厉,于是撒了金坷垃打了正解。

如果x柱上的盘的权值在[l,r]之间,那么可以把[l,mid]放在y柱上,[mid+1,r]放在z柱上。

接着再对y、z柱上的盘分治,排序,然后移回来,那么x柱上的盘就完成了排序。

打完之后不停地WA。。。

然后发现数组开小了。。。(打Pascal的Debuff啊)

T2

交互题是什么不明觉厉的东西?

不会,弃坑。

T3

掐指一算,发现暴力拿不了20分。

弃疗了。。。

如果有丧病的OIer对T2或T3感兴趣的话请看链接:http://jiry_2.blog.uoj.ac/blog/1024

【Codes】

#include<cstdio>
#include<algorithm>
#include<cstring>
int n,i,x,ans;
int h[3][1000010];
int f[1000010][2];
using namespace std;
void sol(int l,int r,int p){
	if (l==r)return;
	int mid=l+r>>1;
	int x=(p+1)%3,y=(p+2)%3;
	for (i=h[p][0];i>=h[p][0]-r+l;i--)
		if (h[p][i]<=mid){
			f[++ans][0]=p,f[ans][1]=x;
			h[x][++h[x][0]]=h[p][i];	
		}else{
			f[++ans][0]=p,f[ans][1]=y;
			h[y][++h[y][0]]=h[p][i];
		}
	h[p][0]-=r-l+1;
	sol(l,mid,x);
	sol(mid+1,r,y);
	for (i=h[y][0];i>=h[y][0]-r+mid+1;i--)f[++ans][0]=y,f[ans][1]=x;
	for (i=h[y][0]-r+mid+1;i<=h[y][0];i++){
		f[++ans][0]=x,f[ans][1]=p;
		h[p][++h[p][0]]=h[y][i];
	}
	for (i=h[x][0];i>=h[x][0]-mid+l;i--)f[++ans][0]=x,f[ans][1]=y;
	for (i=h[x][0]-mid+l;i<=h[x][0];i++){
		f[++ans][0]=y,f[ans][1]=p;
		h[p][++h[p][0]]=h[y][i];
	}
	h[x][0]-=mid-l+1;
	h[y][0]-=r-mid;
}
int main(){
	scanf("%d",&n);
	for (i=1;i<=n;i++)scanf("%d",&x),h[0][++h[0][0]]=x;
	for (i=1;i<=n>>1;i++)swap(h[0][i],h[0][n-i+1]);
	sol(1,n,0);
	printf("%d\n",ans);
	for (i=1;i<=ans;i++)printf("%d %d\n",f[i][0]+1,f[i][1]+1);
}
Category: 蒟蒻的滚粗记 | Tags:
12
1
2015
0

Contest20151130滚粗记

听说这是JSOI2015Day2

膜了贵省的题目,感到不明觉厉。

Orz NiroBC 230

Orz Gold_7 220

Orz Chrysanthemum 220

我等蒟蒻第三题炸飞,120收场。

T1

第一眼看到题目慌掉了。让我打个暴力压压惊。

好像答案就是2nk。。。。

T2

第一眼看到题目慌掉了。让我打个暴力压压惊。

诶这个K究竟有什么用,不明觉厉啊。那就20分好了。

正解是:

二分答案(什么居然是分数规划)

那么如果存在更优解,显然有:[tex]\frac{M(i,j)-m(i,j)}{j-i+K}>b[/tex]

首先暴力处理出len=l的情况。

显然对于len(l,r],如果它能产生最优解,那么可以得到:

M(i,j)=a[i],m(i,j)=a[j]或M(i,j)=a[j],m(i,j)=a[i]。

那么将分母乘过去,就有:a[i]+b*i-(a[j]+b*j)>b*K或a[i]-b*i-(a[j]-b*j)>b*K。

令c[i]=a[i]+b*i或a[i]-b*i,那么等式成立的条件是:

存在i,j,满足:l<j-i+1<=r,c[i]-c[j]>b*K。

那么就可以单调队列辣!!!

T3

第一眼看到题目慌掉了,突然发现这道题好像做过类似的。

恩好像跟前面那个Count on a tree差不多,写个可持久化trie树吧。

恩我第一次写。

恩我过样例了。

恩我炸了。

原来是lca的时候大于小于号打错了。

(听说这道题还有一个不明觉厉的hash做法)

Codes

#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int maxn=1000000007;
ll n,k;
ll quickmi(ll x,ll y,ll mod){
	ll ans=1;
	while (y){
		if ((y&1)==1)ans=ans*x%mod;
		x=x*x%mod;
		y=y>>1;
	}
	return ans;
}
int main(){
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	scanf("%lld%lld",&n,&k);
	printf("%lld\n",quickmi(2,n*k,maxn));
}
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int M=100010;
double a[M],c[M];
int cas,n,K,l,r,i;
struct node{int head;int tail;int w[M];}h1,h2;
int check(double b){
	for (int i=1;i<=n;i++)c[i]=a[i]+b*i;
	h1.head=1,h1.tail=1,h1.w[1]=n;
	for (int i=n-l+1;i>=1;i--){
		while (h1.head<h1.tail&&h1.w[h1.head]>i+r-1)h1.head++;
		if (c[i]-c[h1.w[h1.head]]>=b*K)return 1;
		while (h1.head<=h1.tail&&c[h1.w[h1.tail]]>=c[i+l-2])h1.tail--;
		h1.w[++h1.tail]=i+l-2;
	}
	for (int i=1;i<=n;i++)c[i]=-a[i]+b*i;
	h1.head=1,h1.tail=1,h1.w[1]=n;
	for (int i=n-l+1;i>=1;i--){
		while (h1.head<h1.tail&&h1.w[h1.head]>i+r-1)h1.head++;
		if (c[i]-c[h1.w[h1.head]]>=b*K)return 1;
		while (h1.head<=h1.tail&&c[h1.w[h1.tail]]>=c[i+l-2])h1.tail--;
		h1.w[++h1.tail]=i+l-2;
	}
	return 0;
}
int main(){
	scanf("%lld",&cas);
	while (cas--){
		scanf("%d%d%d%d",&n,&K,&l,&r);
		for (i=1;i<=n;i++)scanf("%lf",&a[i]);
		double L=0,R=1000;
		h1.head=1,h1.tail=1,h2.head=1,h2.tail=1;
		h1.w[1]=1,h2.w[1]=1;
		for (i=2;i<=n;i++){
			while (h1.head<h1.tail&&h1.w[h1.head]<i-l+1)h1.head++;
			while (h2.head<h2.tail&&h2.w[h2.head]<i-l+1)h2.head++;
			while (h1.head<=h1.tail&&a[h1.w[h1.tail]]<a[i])h1.tail--;
			while (h2.head<=h2.tail&&a[h2.w[h2.tail]]>a[i])h2.tail--;
			h1.w[++h1.tail]=i;
			h2.w[++h2.tail]=i;
			if (i>=l)L=max(L,(a[h1.w[h1.head]]-a[h2.w[h2.head]])/(l-1+K));
		}
		l++;
		if (l<=r){
			while (R-L>0.000001){
				double mid=(L+R)/2;
				if (check(mid))L=mid;else R=mid;
			}
		}
		printf("%.4lf\n",L);
	}
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=200010;
int n,i,x,y,m,edgenum,cnt;
char a[M];
int head[M],vet[M],next[M],root[M],dep[M];
int fa[M][17];
char ch[M][20];
char st[20];
struct node{int w;int son[26];}tree[M*10];
void addedge(int x,int y){
	vet[++edgenum]=y;
	next[edgenum]=head[x];
	head[x]=edgenum;
}
void addtrie(int &p,int x,int dep){
	tree[++cnt]=tree[p],p=cnt,tree[p].w++;
	if (dep==strlen(ch[x]))return;
	addtrie(tree[p].son[ch[x][dep]-'a'],x,dep+1);
}
int query(int x,int dep){
	if (x==0&&dep)return 0;
	if (dep==strlen(st))return tree[x].w;
	return query(tree[x].son[st[dep]-'a'],dep+1);
}
int lca(int x,int y){
	if (dep[x]<dep[y])swap(x,y);
	int t=dep[x]-dep[y];
	for (int i=0;i<=16;i++)
		if (t&(1<<i))x=fa[x][i];
	for (int i=16;i>=0;i--)
		if (fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	if (x==y)return x;
	return fa[x][0];
}
void dfs(int u,int cnt){
	int e,v;
	if (u!=1)root[u]=root[fa[u][0]],addtrie(root[u],cnt,0);
	for (int i=1;i<=16;i++)
		if ((1<<i)<=dep[u])fa[u][i]=fa[fa[u][i-1]][i-1];
			else break;
	for (e=head[u];e;e=next[e]){
		v=vet[e];
		if (v!=fa[u][0])fa[v][0]=u,dep[v]=dep[u]+1,dfs(v,e+1>>1);
	}
}
int main(){
	scanf("%d",&n);
	for (i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		scanf("%s",ch[i]);
		addedge(x,y);
		addedge(y,x);
	}
	dfs(1,-1);
	scanf("%d",&m);
	for (i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		scanf("%s",st);
		printf("%d\n",query(root[x],0)+query(root[y],0)-2*query(root[lca(x,y)],0));
	}
}

 

Category: 蒟蒻的滚粗记 | Tags:
11
24
2015
1

Contest20151123滚粗记

听说这是JSOI2015

膜了贵省的一试题目,感到不明觉厉。

T1 树形dp

怎么说呢。。。真是水题啊。。。

对于每个点可经过次数,实际上就是最多可以走过多少个儿子。所以处理出所有儿子的最优值然后取最优的若干个就可以了。

对于方案是否唯一,会有以下三种情况:

1、某个儿子的方案不唯一。

2、存在一个未选过的儿子,其最优值与某个选过的儿子的最优值相等。

3、该节点的最优值为0。

刚转C的Sb,不会用stl,于是手写了一个qsort

接着qsort写错了。。。(对此我还能说什么呢)

T2 hash

表示一看到题目被吓到了,心想究竟是打N^5还是N^4呢。

最后毅然决然打了N^5强势骗40分。

正解是:

首先预处理出矩阵对称、翻转的情况及其hash值。

枚举中心,二分边长,hash判断相同。

有一个技巧:用一个unsigned int自然溢出,可以为懒癌晚期患者提供便利。

T3 乱搞

蒟蒻表示看不懂题意。。。

请看神犇Gold7的题解:

http://gold7.is-programmer.com/posts/189435.html

【Codes】

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=200010;
int n,i,x,y,top,ans,flag,edgenum;
int head[M],vet[M],next[M],c[M],w[M];
int h[M][2];
void addedge(int x,int y){
    vet[++edgenum]=y;
    next[edgenum]=head[x];
    head[x]=edgenum;
}
bool cmp(int x,int y){
    return x>y;
}
void qsort(int l,int r){
    int i=l,j=r,mid=h[l+r>>1][0];
    do{
        while (h[i][0]>mid)i++;
        while (h[j][0]<mid)j--;
        if (i<=j){
            swap(h[i][0],h[j][0]);
            swap(h[i][1],h[j][1]);
            i++,j--;
        }
    }while (i<=j);
    if (l<j) qsort(l,j);
    if (i<r) qsort(i,r);
}
int dfs(int u,int pre){
    int e,v,i;
    int sum=w[u],st=top+1;
    for (e=head[u];e;e=next[e]){
        v=vet[e];
        if (v!=pre&&c[v]>=1)h[++top][0]=dfs(v,u),h[top][1]=flag;
    }
    flag=0;
    if (c[u]==1) {
        if (!sum) flag=1;
        return sum;
    }
    qsort(st,top);
    for (i=st;i<=top;i++){
        sum+=h[i][0];
        flag=flag|h[i][1];
        if (i-st+2==c[u])break;
    }
    if (i<top&&h[i+1][0]==h[i][0]&&h[i][0]||sum==0)flag=1;
    top=st-1;
    return max(sum,0);
} 
int main(){
    scanf("%d",&n);
    for (i=2;i<=n;i++)scanf("%d",&w[i]);
    c[1]=1000000000;
    for (i=2;i<=n;i++)scanf("%d",&c[i]);
    for (i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        addedge(x,y);
        addedge(y,x);
    }
    printf("%d\n",dfs(1,-1));
    if (flag)printf("solution is not unique\n");
        else printf("solution is unique\n");
}
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef unsigned int uint;
using namespace std;
const int d1=233,d2=2333;
int n,i,j;
uint a[7][510][510];
uint Ppow[1010],Qpow[1010];
void build(int x){
	for (int i=1;i<=n;i++){
		int P=Ppow[n-i];
		for (int j=1;j<=n;j++){
			a[x][i][j]=a[x][i][j]*P*Qpow[n-j];
			a[x][i][j]+=a[x][i-1][j]+a[x][i][j-1]-a[x][i-1][j-1];
		}
	}
}
uint clac(int i,int j,int len,int x){
	return (a[x][i][j]-a[x][i-len][j]-a[x][i][j-len]+a[x][i-len][j-len])*Ppow[i]*Qpow[j];
}
int isok(int i,int j,int len,int x){
	int sum=clac(i,j,len,0);
	if (x==8)return isok(i,j,len,90)&isok(i,j,len,0);
	if (x==4)return isok(i,j,len,180)&isok(i,j,len,0);
	if (x==180&&sum==clac(n-i+len,n-j+len,len,6))return 1;
	if (x==90&&sum==clac(j,n-i+len,len,5))return 1;
	if (x==0&&(sum==clac(i,n-j+len,len,1)||sum==clac(n-i+len,j,len,2)||sum==clac(j,i,len,3)||sum==clac(n-i+len,n-j+len,len,4)))return 1;
	return 0;              
}
int check(int len,int x){
	for (int i=len;i<=n;i++)
		for (int j=len;j<=n;j++) if (isok(i,j,len,x)) return 1;
	return 0;
}
int solve(int x){
	int l,r,mid;
	for (l=1,r=n/2;mid=l+r>>1,l<=r;){
		if (check(2*mid,x))l=mid+1;else r=mid-1;}
	l--;if (!check(2*l+1,x)) return 2*l;
	for (r=n/2;mid=l+r>>1,l<=r;)
		if (check(2*mid+1,x))l=mid+1;else r=mid-1;
	l--;return 2*l+1;
}
int main(){
	scanf("%d",&n);
	char ch[n];
	for (i=1;i<=n;i++){
		scanf("%s",&ch);
		for (j=1;j<=n;j++){
			int x=ch[j-1]-'0';
			a[0][i][j]=a[1][i][n-j+1]=a[2][n-i+1][j]=a[3][j][i]=a[4][n-j+1][n-i+1]=a[5][j][n-i+1]=a[6][n-i+1][n-j+1]=x;
		}
	}
	Ppow[0]=1; for (i=1;i<=n;i++)Ppow[i]=Ppow[i-1]*d1;
	Qpow[0]=1; for (i=1;i<=n;i++)Qpow[i]=Qpow[i-1]*d2;
	for (i=0;i<=6;i++)build(i);
	printf("%d %d ",solve(8),solve(90));
	int x1=solve(4),x2=solve(180),x3=solve(0);
	if (x1==8&&x2==8&&x3==9)printf("8 8 8\n");else printf("%d %d %d\n",x1,x2,x3);
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define A first
#define B second
using namespace std;
const int M=20010;
int n,m,cas,edgenum,i,u,v,t,cnt;
int head[M],vet[M],next[M],f[M],fa[M],hash[M],price[M],b[M],c[M];
pair<int,int>data[M];
priority_queue<int>h[M];
void addedge(int x,int y){
    vet[++edgenum]=y;
    next[edgenum]=head[x];
    head[x]=edgenum;
}
int search(int x){
    if (f[x]!=x)f[x]=search(f[x]);
    return f[x];
}
void dfs(int u){
    int e,v;
    for (int e=head[u];e;e=next[e]){
        v=vet[e];
        if (v==fa[u])continue;
        fa[v]=u;
        if (price[u]==2)f[search(v)]=search(u);
        dfs(v);
    }
}
int main(){
    scanf("%d",&m);
    for (int cas=1;cas<=m;cas++){
        edgenum=0;
        memset(head,0,sizeof head);
        memset(price,0,sizeof price);
        scanf("%d",&n);
        for (i=1;i<n;i++){
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
            price[u]++;
            price[v]++;
        }
        for (i=1;i<=n;i++)f[i]=i,hash[i]=1;
        int shit=0;
        for (i=1;i<=n;i++)if (price[i]!=2){shit=i;break;}
        fa[shit]=shit;
        dfs(shit); 
        for (i=1;i<=n;i++)b[i]=search(i),c[i]=b[i];
        sort(c+1,c+n+1);
        cnt=unique(c+1,c+n+1)-c-1;
        for (i=1;i<=n;i++)b[i]=lower_bound(c+1,c+cnt+1,b[i])-c;
        for (int t=1;t<=2;t++){
            for (i=1;i<=cnt;i++)while(!h[i].empty())h[i].pop();
            for (i=1;i<=n;i++)
                for (int e=head[i];e;e=next[e])
                    if (b[i]!=b[vet[e]])h[b[vet[e]]].push(hash[b[i]]);
            for (i=1;i<=cnt;i++){
                hash[i]=1;
                while (!h[i].empty()){
                    hash[i]=(hash[i]*10007^h[i].top()+6667)%10009;
                    h[i].pop();
                }
            }
        }
        sort(hash+1,hash+cnt+1);
        for (i=1;i<=cnt;i++) data[cas].B=(data[cas].B*10007^hash[i]+6667)%10009;
        data[cas].A=cnt;
    }
    sort(data+1,data+m+1);
    m=unique(data+1,data+m+1)-data-1;
    printf("%d\n",m);
    for (i=1;i<=m-1;i++)printf("%d ",data[i].A);
    printf("%d\n",data[m].A);
}
Category: 蒟蒻的滚粗记 | Tags:
11
24
2015
1

noip2015滚粗记

Notice:阅读时请隔10秒按一下F5因为可能你在读而我正在更新。

Day-3

顺理成章地成为了嘴巴选手!码农题妥妥滚粗感觉自己萌萌哒。。。

无标题无标题1

 

联赛要跪辣。。。。先预备一份滚粗记。

program verygoodluck;
var
  rp:int64;
  begin
    rp:=maxlongint;
    while true do inc(rp);
  end.

停课还是很爽哒!(为什么期中考定在联赛后??)

Day-2

这莫非是嘴巴选手的第二场?!

无标题无标题

暴搜专题T2这么水我居然没有做!?

话说数论专题的扩展欧几里得和欧拉筛被狗吃了?!

(相传联赛之前无视水题是滚粗的预兆QAQ)

无标题

晚上的这场是传说中的全真模拟。。。

话说那个P是用画图加上去的吧。。。

听说难度是倒着来的。。。

条哥重复了inf遍“这道题可以做的”。。。

出题人这么出是不是rp掉光啊。。。

Day-1

传说中的安慰考。。。

无标题

 

因为组合手抖打错结果全T了Orz。。。

膜衲姐AK rp++

接着颓了一个下午。。。

无标题

感觉别人的滚粗记好文艺啊。。。

晚上本来要交流滚粗经历的,然而条哥被抓去做苦力了233。于是机房群体开黑。。。

IMG_0301_副本IMG_0317_副本IMG_0319_副本IMG_0314_副本

这真是美不胜收啊!(联赛之前黑人是不是不大好)

(↑请注意这是一个flag)

Day0

懒癌晚期患者早上八点钟才到学校。。。(门卫居然放我进去了!?)

然后开始交流滚粗经历。(说多了都是泪啊!)

接着就开始颓。。。(顺便把森林冰火人2给AK了)

然后我们吃完饭大摇大摆地从操场走过(校庆的大屏幕确实很赞的说。。只可惜唱校歌的人手一直举着好蠢啊、、、)

然后我们找条哥要三国杀(然而好像被吃没了。。)

然后我们就出发辣!!!

接着发现有人带了三国杀,于是路上又颓了一个下午Orz。u=2220736356,2727361215&fm=21&gp=0

晚上在宾馆,由于没有电脑和wifi(这个传说中有时候有有时候没有的东西),只好欣赏碟中谍(然而并不看得懂剧情。。。)

后来花哥用高科技开了个热点。。。(然而并没有什么太大的作用)

9:30 睡觉 祈求rp++

接着有个电话问我们要不要一个女同学。。。

接着我们听见附近有人购买了一个12元的商品(是不是我想歪了)(后来发现只是方便面)。。

迷迷糊糊睡着了、、、

Day1

早上6点醒来睡不着了,于是开始思考人生。

接着起床。。。。

相传和wxx一个房间的慈溪中学妹子是我的一个远房亲戚(还叫我小叔叔我是不是太老了。。。)。

在去考场的路上我口胡:今年联赛第三题似乎很可能出爆搜诶。。。

wxx说:那不是完了啊,我6道爆搜代码题只过了一道。。。

接着来到了赛场,惊奇地发现邹逍遥坐我旁边!!!(Au爷气场果然非同一般)

打开试题(这密码是昨天加的么。。。中文意思居然是你们那边有没有下雪。。。)(听说北京的雪下得很大。。。)

先看T1。这不是幻方么?!听说很难的样子!!!

然后发现给你了方法。。。

这不是傻逼模拟么??

再看T2。第一眼:这不是外向环套树么?莫非要用树形dp?

第二眼:这原来是个傻逼Tarjan。。。

再看T3:。斗地主?!(邹逍遥看到题目怒吼一声。。。)

这数据范围明显爆搜剪枝啊!!!(我的flag灵验了)

一算状态数,50亿左右,想到了一句经典的话:广搜的内存开不下,我们可以用时间相近而内存远小于广搜的idA*。

于是心中窃喜,先把T1和T2给日了。

打完T2对拍发现还有三个小时哈哈哈我要AK辣!!!(条哥经典语录:嚣张的人必跪)

于是花了半个小时构造估价函数。。。(yy出一堆乱七八糟的区间问题)

又花了一个小时来实现。。。

一跑样例,连第二个都过不了。。。

再一看,迭代到6层就受不了了。。。

不慌,看看题目,我的妈妈内存居然有1G!!!!!!!

话说我居然只开了一个14的数组。。。

哦这原来是哈希+类似记忆化的优化!!!

于是怒改程序(你知道把函数变成过程有多么恶心么。。)

跑了跑第二个样例,过了。

于是跑大样例,错得离谱。

看看时间,还有一小时多。(邹逍遥在旁边自由自在地玩小恐龙。。)

不慌,动态调试一番。

哈希冲突了。。。。

于是记了一个新的关键字。

再跑大样例。

什么居然有答案是maxlongint!!!!

此时还有四十分钟。

于是抠出单组数据,发现并没有错。

一定是初始化错了!!

于是给所有数组开了个fillchar

错得更离谱了。

彻底慌掉,于是动态调试。

接着发现hash的0忘记开了(喂答案的hash值就是0好不好)

再跑大样例,感觉并没有什么问题。(没有问题就是最大的问题!!(相传这是一个悖论))

此时离考试结束还有30分钟。

闲得无聊,于是把两个输出文件放在一起对拍。

什么居然错了!!!!!!!!!!!!!!!!!!!!!!!!!!!

于是赶紧看是哪一个数据。

卧槽第69组!!!!!

这怎么抠啊!!!!

不慌,动态调试。

无果。

此时大脑一片空白,不断按F8和F4,却不知道自己哪里错了。我开始设想要是这道题爆蛋退役了怎么办,要不要放弃骗分。

此时离考试结束还有十五分钟。

几乎绝望。

等一下!

怎么还原的时候牌数变少了!?

发现最后一张忘记还原了!!!!!

改正之。

又错。

哦or打成and了。

再运行。

对了。

那一刻仿佛从地狱回到了天堂。

此时离考试结束还有10分钟。(邹逍遥依然在打小恐龙)

于是检查了下文件名和T1 T2就出来了。

听说alpq斗出了95分。

听说李昊没判三张牌带两张王。。(魂归天)(其实并没有)

听说zyd用了dp,枚举状态和转移(不明觉厉,必有反例

听说娜姐拿了70分(我太慌了连大数据都没试过)。

听说董晨不用hash大样例秒出。。

听说有许多人第三题骗了30分。。

听说一大片230。。

我好可怜啊连自己大约几分都不知道。

诶这是从哪里出来的东西。。。

psb(你是在嘲笑我么)

由于之前的大起大落,并没有心情吃午饭。

下午观赏画皮,看得我心慌慌(然而这并不是恐怖片)。

顺便看noip贴吧上一群人撕逼大战。。。

什么四张牌可以带两张王我没判!!

什么四张牌可以带一对我没判!!

然而题目并没说清楚(数据随机出是不是可以水一发(你想多了))

接着认识到鸟大了什么林子都有。

一选手T1花3小时推出1~39的所有情况,结果打表的时候多了个空格(此选手日后必成大器)。

一选手T2说我不会图论于是就写了floyed判最小圈。

喂这道题按照题意模拟的复杂度也是这个吧!!!

一选手T3跟我一样没判四张带一对大呼要爆蛋。

请看数据范围有30%并没有这么多牌啊!!!!!

晚饭依然没有食欲(异常萎靡)。

接着颓了一个晚上。

Day2

又来到了熟悉的考场。

考前围观邹逍遥玩小恐龙。

T1一看二分+贪心。

T2一看dp+优化。

T3一看不会做。

于是将T1日翻(真的是日翻么。。。我会让你后悔。。。)

T2发现有个前缀和转移。

懒癌晚期患者懒得维护前缀和。

于是尝试直接转移。

yy出了一个乱七八糟的转移方程。

居然过了大样例。

T3强势骗60分。

哇噻一条链有20分诶!!!!!好诱人的样子!!!

并不会(其实是并不想)。。。

于是弃疗了(此期间寒风从没有关的窗户里吹来冻死我了)。

看见邹逍遥正在调T3。

接着看见他好像A了。

接着看见他T2居然打了90分算法!!!(难道他比我还愚昧(你想多嘞,你不是也被老爷机卡常了么))

接着观赏他玩小恐龙(玩到了3500分太强辣!!膜膜膜)

u=2148627425,2155141538&fm=15&gp=0

接着就结束了。

回来的路上风雨如晦(衢州的雨,谁的泪。。。)。

听说晚上就能出山寨成绩辣!!!

被条哥告知Day2T1炸了!!!!

完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了完了!!!!!!

听说小条强势525。

董日辰水过Day2T2怒拿575接着开始在qq空间上卖萌(拒绝优雅装逼和无形装逼)。

于是要到了程序。

在openjudge上一测。。。。。。。。

什么过了!?

然而没有人给我解释。。。。

一夜没有睡好。。。

Day3

早上在洛谷上交了一发。。。

发现又过了。。。

诶这是怎么回事!!!!

被条哥告知挂了还有希望一等。

我要讨回公道!!!

先读了一天的文化课冷静一下。

接着被条哥告知lh数据并未换行。。。(无力吐槽)

回到555。。

为什么我的命运就像过山车。。。

地狱-->天堂-->地狱-->天堂-->???

鸟爷爷也翻盘了。(集体报喜场面真是。。。)

于是打了一个晚上的斗地主。。。

psb

 

Day inf

接受了文化科的洗礼之后,我已经发生了质的转变。

无标题_副本------------------>1

 

终于有一天我决定摆脱这一切。。。

于是萌萌哒lyz回到机房转C辣!!!!

恰逢成绩出来。。最终成绩540=100+100+90+100+90+60。。

许多人1=了。

也有许多人被线踩了。(在此默哀)

还记得张爷爷教师节立下的flag:

最近图论越来越多了,你们要学好弗洛伊德和迪杰卡尔(莫非你不会spfa)。

最近数论越来越多了,数论题就是模拟题,你们要学好模拟。

最近联赛搜索越来越少了,你们要学好其他算法。

衲姐一等没有问题,狗蛋应该没戏。

张爷爷果然毁人不倦!!

这天晚上下着雨。

于是开始思考人生。

想当年我们当初来的时候,也不曾想到有今天。当时我们很轻松也很恣睢,黄大爷当时还是一只众人仰慕的神犇。那个时候我们迫于初中老师和家长不敢全天旷课,于是常常下午结伴而来,然后在超市关门的最后一刻挤进去买吃的。接着整个下午都在颓废中度过,机房里一直是《素颜》的单曲循环,而我当时热衷于看《盗墓笔记》,楼下总是十分嘈杂地撕名牌,瓜哥也坚持晚饭以后欣赏艺术。

后来学到了二维片段和、线段树、dp等一些乱七八糟的东西,长了许多姿势。寒假里被拉去训练,本来说好三天图论三天数论却因为窝萌捉急的理解能力变成了六天图论。那时候看到noip真题直接被吓哭,连同余方程都不会做,感觉联赛1=的几率十分渺茫。皮球爷爷在wc中大展淫威,怒夺第三,于是众人仰慕。

寒假过了,最为悠闲的生活告一段落。在拿到入学通知之后滚到yyhs变成了一名直录生。之后的几个月窝萌都在机房中度过,翘掉所有的自习课去见条哥,从来不交作业,结果理科一炸到底。日复一日地白天刷poj,晚上听课或是打比赛,在比较宽裕的时间里把联赛的算法都过了一遍。或许许多人就是在那时候堕落的,差距也渐渐拉开。

无标题

到了暑假,几乎一天都没有休息过。一开始翘了军训跟着辽宁省队和yyhs的三个大神做noi,每天打完暴力直接弃疗,不过学到了诸如树链剖分和splay这类高级的(用于装B的?)东西。感觉心灵完全遭受了打击,只好滚回原来的机房去做noip摸你赛。当时许多事情都已经淡忘了,但我依然记得做到难题成绩出来时的姹紫嫣红,依然记得中午集体订外卖打三国杀,依然记得打多校时被各路神犇虐飞的哀嚎,依然记得小条在超市被装进手推车,依然记得在机房的互黑……暑假的生活看上去很单调,但我们也长了许多比赛经验和技巧,也收获了宅在家里没有的欢乐。

qaq

后来开学了,感到有必要补一补文化课,于是来机房的时间也就渐渐少了,在bzoj的刷题量也渐渐被初三的两只神犇超越。条哥说的话仿佛还在昨天:“努力三个月,冲几个1=。”“只剩两个月了,泥萌还在玩游戏。”“最后一个月了,我也不想说泥萌了。”每天穿梭在如山的作业和oi(与agar?)之间,但是感觉很快乐。

psb无标题

后来。。。

后来窝萌就去noip了。

再过一个月,就是入高中oi坑一周年纪念了。

回首一年,有很多感慨。

窝萌还有很多算法要学,省选,也有很长的路要走。

Bless all!

 
Category: 蒟蒻的滚粗记 | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com