用户工具

站点工具


2020-2021:teams:wangzai_milk:20200715比赛记录

这是本文档旧的修订版!


2019 Multi-University Training Contest 3

比赛情况

题号 A B C D E F G H I J K
状态 - - - O - O O Ø O - !

O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试

比赛时间

2020-07-15 13:00-18:00

题解

# G - Find the answer

对于 $1$ 到 $n$ 每个位置 $i$ ,删除 $[1,i)$ 区间的几个元素能使得该位置的前缀和不大于 $m$ 。

离散上权值线段树,查询最少多少个元素和大于等于 $sum-m$ (肯定是最大的若干个元素),相当于线段树上二分。

点击以显示 ⇲

点击以隐藏 ⇱

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N=2e5+5;
ll w[N],num[N];
ll read()
{
	ll x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
struct Node{int l,r;ll sz,sum;}t[N*4];
void build(int idx,int l,int r)
{
	t[idx].l=l,t[idx].r=r,t[idx].sz=t[idx].sum=0;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(idx<<1,l,mid),build(idx<<1|1,mid+1,r);
}
void ins(int idx,int x)
{
	if(t[idx].l==t[idx].r){t[idx].sz++,t[idx].sum+=num[x];return;}
	int mid=(t[idx].l+t[idx].r)>>1;
	if(x<=mid)ins(idx<<1,x);else ins(idx<<1|1,x);
	t[idx].sz=t[idx<<1].sz+t[idx<<1|1].sz;
	t[idx].sum=t[idx<<1].sum+t[idx<<1|1].sum;
}
int que(int idx,ll x)
{
	if(x<=0)return 0;
	if(t[idx].l==t[idx].r)return x/num[t[idx].l]+(x%num[t[idx].l]>0);
	if(t[idx<<1|1].sum>=x)return que(idx<<1|1,x);
	return t[idx<<1|1].sz+que(idx<<1,x-t[idx<<1|1].sum);
}
int main()
{
	int q=read();
	while(q--)
	{
		int n,tot=0;
		ll m,sum=0;
		n=read(),m=read();
		for(int i=1;i<=n;i++)w[i]=read(),num[++tot]=w[i];
		sort(num+1,num+1+tot);
		tot=unique(num+1,num+1+tot)-num-1;
		build(1,1,tot);
		for(int i=1;i<=n;i++)
		{
			sum+=w[i];
			printf("%d ",que(1,sum-m));
			int x=lower_bound(num+1,num+1+tot,w[i])-num;
			ins(1,x);
		}
		puts("");
	}
	return 0;
}


# H - Game

其实是在可以动态修改的情况下(交换 $a_i,a_{i+1}$ ),回答若干 $[L,R]$ 有多少子区间异或和为零的问题。记录前缀异或和(相同则意味着区间异或和为零),swap只改变 $pre[i]$ ,带修改莫队一下,可能要卡常。

点击以显示 ⇲

点击以隐藏 ⇱

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N=1e5+5;
const int M=2e7+10;
int n,m,swp[N],bloc,a[N],pre[N],qcnt,mcnt,inq[N],l,r;
ll res[N],num[M],ans;
ll read()
{
	ll x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
struct Node
{
	int l,r,now,id;
	Node(int l=0,int r=0,int now=0,int id=0):l(l),r(r),now(now),id(id){}
}q[N];
bool cmp(Node x,Node y)
{
	if((x.l-1)/bloc==(y.l-1)/bloc)
	{
		if((x.r-1)/bloc==(y.r-1)/bloc)return ((x.r-1)/bloc&1)?x.now<y.now:x.now>y.now;
		return x.r<y.r;
	}
	return x.l<y.l;
}
void exchange(int x)
{
	swap(a[x],a[x+1]);
	if(x>=l-1&&x<=r)
	{
		ans-=num[pre[x]]*(num[pre[x]]-1)/2;
		num[pre[x]]--;
		ans+=num[pre[x]]*(num[pre[x]]-1)/2;
	}
	pre[x]^=a[x]^a[x+1];
	if(x>=l-1&&x<=r)
	{
		ans-=num[pre[x]]*(num[pre[x]]-1)/2;
		num[pre[x]]++;
		ans+=num[pre[x]]*(num[pre[x]]-1)/2;
	}
}
void work(int x)
{
	int f=1;
	if(inq[x])f=-1;
	if(x==l)
	{
		ans-=num[pre[x-1]]*(num[pre[x-1]]-1)/2;
		num[pre[x-1]]+=f;
		ans+=num[pre[x-1]]*(num[pre[x-1]]-1)/2;
	}
	if(x==r)
	{
		ans-=num[pre[x]]*(num[pre[x]]-1)/2;
		num[pre[x]]+=f;
		ans+=num[pre[x]]*(num[pre[x]]-1)/2;
	}
	inq[x]^=1;
}
int main()
{
	clock_t start1=clock(),end1;
	while(~scanf("%d%d",&n,&m))
	{
		qcnt=mcnt=ans=0,bloc=pow(n,0.6666666666)+1;
		for(int i=1;i<=n;i++)a[i]=read(),pre[i]=pre[i-1]^a[i];
		for(int i=1;i<=m;i++)
		{
			int op=read();
			if(op==1)
			{
				int l=read(),r=read();
				++qcnt;
				q[qcnt]=Node(l,r,mcnt,qcnt);
			}
			else swp[++mcnt]=read();
		}
		sort(q+1,q+1+qcnt,cmp);
		l=1,r=0;
		for(int i=1;i<=qcnt;i++)
		{
			for(int j=q[i-1].now+1;j<=q[i].now;j++)exchange(swp[j]);
			for(int j=q[i-1].now;j>q[i].now;j--)exchange(swp[j]);
			while(l>q[i].l)--l,work(l);
			while(r<q[i].r)++r,work(r);
			while(l<q[i].l)work(l),l++;
			while(r>q[i].r)work(r),r--;
			ll len=q[i].r-q[i].l+1;
			res[q[i].id]=len*(len-1)/2+len-ans;
		}
		for(int i=1;i<=qcnt;i++)printf("%lld\n",res[i]);
		while(l<=r)work(l),l++;
	}
	return 0;
}


比赛总结与反思

2020-2021/teams/wangzai_milk/20200715比赛记录.1594821107.txt.gz · 最后更改: 2020/07/15 21:51 由 zars19