记一场爆0的JOI - HZH's Blog - 自闭症

记一场爆0的JOI

nbdhhzh posted @ 2015年6月13日 19:25 in 比赛 , 538 阅读

小日本的题目真无聊。。

膜1h领版的约大爷。

膜虐场AK__shi。

T1 无聊的题答。。直接弃疗

T2 傻逼DP题。直接DP,用括号序列维护一下,nlogn

#include<cstdio>
#include<algorithm>
#define N 100010
#define M 200010
using namespace std;
long long f[N],g[N],tot,sz[M],sz1[M];
int X[N],Y[N],Z[N],dad[17][N],l,cs[N],kt[N],jw[N],cf;
int n,i,x,y,head[N],ne[M],v[M],na[N],heed[N],m,z;
void add(int x,int y)
{
	v[++l]=y;
	ne[l]=head[x];
	head[x]=l;
}
void dfs(int x)
{
	cs[x]=cs[dad[0][x]]+1;
	kt[x]=++l;
	int t;
	for(t=0;dad[t][x];t++)
		dad[t+1][x]=dad[t][dad[t][x]];
	if(t>cf)cf=t-1;
	for(int i=head[x];i;i=ne[i])
	if(v[i]!=dad[0][x])
	{
		dad[0][v[i]]=x;
		dfs(v[i]);
	}
	jw[x]=++l;
}
int lca(int x,int y)
{
	if(cs[y]<cs[x])swap(x,y);
	for(int t=cf;t>=0;t--)
		if(cs[dad[t][y]]>=cs[x])y=dad[t][y];
	if(x==y)return x;
	for(int t=cf;t>=0;t--)
		if(dad[t][x]!=dad[t][y])
			x=dad[t][x],y=dad[t][y];
	return dad[0][x];
}
void aad(int x,long long y)
{
	for(;x<=l;x+=x&-x)
		sz[x]+=y;
}
long long calc(int x)
{
	long long y=0;
	for(;x;x-=x&-x)
		y+=sz[x];
	return y;
}
void aaa(int x,long long y)
{
	for(;x<=l;x+=x&-x)
		sz1[x]+=y;
}
long long caac(int x)
{
	long long y=0;
	for(;x;x-=x&-x)
		y+=sz1[x];
	return y;
}
void count(int x)
{
	for(int i=head[x];i;i=ne[i])
		if(v[i]!=dad[0][x])
		{
			count(v[i]);
			g[x]+=f[v[i]];
		}
	f[x]=g[x];
	aad(kt[x],g[x]);
	aad(jw[x],-g[x]);
	for(int i=heed[x];i;i=na[i])
	{
		tot=calc(kt[X[i]])-calc(jw[x])+Z[i];
		tot+=calc(kt[Y[i]])-calc(kt[x]);
		tot-=caac(kt[X[i]])+caac(kt[Y[i]])-2*caac(kt[x]);
		if(tot>f[x])f[x]=tot;
	}
	aaa(kt[x],f[x]);
	aaa(jw[x],-f[x]);
}
int main()
{
	scanf("%d",&n);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	l=0;dfs(1);
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&X[i],&Y[i],&Z[i]);
		z=lca(X[i],Y[i]);
		na[i]=heed[z];heed[z]=i;
	}
	count(1);
	printf("%lld\n",f[1]);
}

T3 超级傻逼数据结构。直接线段树暴力搞。。刚刚开始忘记判k=1T了一发。。否则就能成为第三个200分的了QAQ

#include<cstdio>
#define N 100010 
#define M 400010
using namespace std;
int n,m,k,i,x,y,z;
long long sum[M];
void add(int l,int r,int x,int y,int cur)
{
	if(l==r){sum[cur]=y;return;}
	int mid=(l+r)>>1;
	if(x<=mid)add(l,mid,x,y,cur<<1);
	else add(mid+1,r,x,y,cur<<1|1);
	sum[cur]=sum[cur<<1]+sum[cur<<1|1];
}
void biu(int l,int r,int L,int R,int cur)
{
	if(l==r){sum[cur]/=k;return;}
	int mid=(l+r)>>1;
	if(L<=mid&&sum[cur<<1])biu(l,mid,L,R,cur<<1);
	if(R>mid&&sum[cur<<1|1])biu(mid+1,r,L,R,cur<<1|1);
	sum[cur]=sum[cur<<1]+sum[cur<<1|1];
}
long long count(int l,int r,int L,int R,int cur)
{
	if(L<=l&&R>=r)return sum[cur];
	int mid=(l+r)>>1;
	long long ans=0;
	if(L<=mid)ans+=count(l,mid,L,R,cur<<1);
	if(R>mid)ans+=count(mid+1,r,L,R,cur<<1|1);
	return ans;
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=n;i++)
		scanf("%d",&x),add(1,n,i,x,1);
	while(m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(x==1)add(1,n,y,z,1);
		if(x==2&&k>1)biu(1,n,y,z,1);
		if(x==3)printf("%lld\n",count(1,n,y,z,1));
	}
}

好无聊啊,期待day2。

(出数据结构的结果就是中国队AK啊。。)

Avatar_small
orz hhw 说:
2015年6月14日 01:25

跪黈,200分算暴0

Avatar_small
Haryana Board Questi 说:
2022年9月03日 00:14

Haryana Board Model Paper 2023 Class 10 Pdf Download with Answers for English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay Type Questions to Term1 & Term2 Exams at official website. Haryana Board Question Paper Class 10 New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee