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;
}
②错误原因
各种奇葩
③分析总结
不会的就是不会,把会的写好了就作数了。