WA掘机联赛题20180331总结

WAWAWAWAWAWAWAWAWA

这次考试,我充分地感受到了来自某术家的深深的恶意。
比比红太阳还要红的包红还要红。

①对题分析

T1:鬼知道是什么东西,我直到现在才发现灰色方框不能走,导致sigma狂暴。自己乱搞推了个公式,还是0分。。。
codeforces15E


T2:大意了,以为与线段树的区间修改不一样,不需要lazy标记,但是仔细想想,会把上下次与给覆盖了。
codeforces482B
附上自己WA代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100001;
int zktree[maxn*4],x[maxn],y[maxn],z[maxn];
int n,m,fl;
void pushup(int sl,int sr,int s,int l,int r,int root)
{
	if(sl<=l&&sr>=r)
	{
		 if(zktree[root]==-1) zktree[root]=s;
	     else zktree[root]=zktree[root]&s;
	     return ;
	}
	int mid=(l+r)/2;
	if(sl<=mid) pushup(sl,sr,s,l,mid,root<<1);
	if(sr>mid) pushup(sl,sr,s,mid+1,r,root<<1|1);
	if(zktree[root]==-1) zktree[root]=zktree[root<<1]&zktree[root<<1|1];
	else zktree[root]=(zktree[root<<1]&zktree[root<<1|1])&zktree[root];
}
void query(int l,int r,int root)
{
	if(zktree[root]==-1) zktree[root]=zktree[root>>1];
	if(l==r)return ;
	int mid=(l+r)>>1;
	query(l,mid,root<<1);
	query(mid+1,r,root<<1|1);
}
void ptf(int l,int r,int root)
{
	if(l==r)
	{
		printf("%d ",zktree[root]);
		return;
	}
	int mid=(l+r)>>1;
	ptf(l,mid,root<<1);
	ptf(mid+1,r,root<<1|1);
}
void ask(int sl,int sr,int s,int l,int r,int root)
{
	if(sl<=l&&sr>=r)
	{
		 if(zktree[root]==-1) return;
	     if ((s&zktree[root])!=s) fl=0;
		 return;
	}
	int mid=(l+r)>>1;
	if(sl<=mid)ask(sl,sr,s,l,mid,root<<1);
	if(sr>mid)ask(sl,sr,s,mid+1,r,root<<1|1);
}
int main()
{
	freopen("array.in","r",stdin);
	freopen("array.out","w",stdout);
	while(~scanf("%d%d",&n,&m))
	{
		fl=1;
		memset(zktree,-1,sizeof(zktree));
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d%d",&x[i],&y[i],&z[i]);
			pushup(x[i],y[i],z[i],1,n,1);
		}
		query(1,n,1);
		for(int i=1;i<=m;i++)
		{
			ask(x[i],y[i],z[i],1,n,1);
			if(fl==0)break;
		}
		if(!fl) printf("NO\n");
		else {printf("YES\n");ptf(1,n,1);printf("\n");}
	}
}

T3:想好了树链剖分的做法,但我不怎么会写,太长了,之后才知道还要加莫队优化,果断暴力30分。
暴力源码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct zk
{
	int u,v,w,next;
}e[300001];
int son[6001][6001],cnt=0,color[100001],n,head[100001],maxnum[100001],maxcol;
void add(int u,int v)
{
	e[cnt].u=u;
	e[cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt++;
}
void dfs(int u,int fa)
{
	son[u][color[u]]+=1;
	for(int i=head[u];i!=-1;i=e[i].next)
	{
		int v=e[i].v;
		if (v==fa) continue;
		dfs(v,u);
		for(int j=1;j<=maxcol;j++)
		{son[u][j]+=son[v][j];}
	}
	for(int i=1;i<=maxcol;i++)
	maxnum[u]=max(maxnum[u],son[u][i]);
	return;
}
int main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	memset(head,-1,sizeof(head));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&color[i]);maxcol=max(maxcol,color[i]);
	}
	int a,b;
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&a,&b);
		add(a,b);
	}
	dfs(1,1);
	int tot=0;
	for(int i=1;i<=n;i++)
	{
		tot=0;
		for(int j=1;j<=maxcol;j++)
		if (son[i][j]==maxnum[i]) tot+=j;
		printf("%d ",tot);
	}
	return 0;
}

②错误原因

各种奇葩

③分析总结

不会的就是不会,把会的写好了就作数了。

posted @ 2018-03-31 16:36  lpzMPendragon  阅读(180)  评论(0编辑  收藏  举报