高一上一月中旬日记

1.11

闲话

  • 上午第三节课的时候被 miaomiao 拉去隔壁补 whk 了。期间询问 field 新机房的事宜,得知因新机房较大,能容约 50 人(但高一、高二加起来都没有 50 人),即将给隔壁零基础的用,我们还在现在所在的“小机房”上课,大概会在暑假的时候搬过去一起打模拟赛。键盘的退格键恢复正常,还听 field 吐槽了下现在一格宽的退格多么难用。
  • NOIP 的证书到了,教练用手机挨个拍照,可能是为了宣传?但教练没给我们发。
  • 下午放 @Qyun 的每日一歌《若我不曾见过太阳》。
  • miaomiao 说这三周的课今明两天如果补不完就等到下周四再补,语文可以先放一放,但问题是就算语文、英语都不补剩下四科三天也补不完。
  • 体活前问 field 为啥新机房没有抽屉导致键盘只能放到桌面上,他说因为抽屉容易坏而且没什么用(指习惯把键盘放到抽屉里的人很少)。准备上体活的时候 miaomiao 说让我们好好休息休息。
  • 晚上回来后 field 说因我们长时间没在班里上课,所以平常考试家长仅能看到赋分前的结果,赋分后都变成了 0 分不计入班级成绩统计,而且期末考试很有意义,能检验我们补课的成果,所以我们得考期末。
  • 记录下晚上的两个梦。
    • 因为第二天早上有体活,遂晚起了一会儿。起床后一直走到莘元馆才意识到下雪了,通过地面上的薄雪可知下得不是很大,但是头顶上有一堆形如大雁的鸟过去,它们的身上却堆了一层厚厚的雪,抖了抖身子后却有巨型冰块、雪块从它们的身上掉了下来。回头走看见从宿舍到教学楼的一段路旁边突然多出来一段河,沿途有人通过冰面上打的孔把先前鸟掉下来的冰块、雪块扔到河里,河里也有比金枪鱼体型还打的鱼从孔里跳上来找人寻求食物,遂也有人拿着鲜鱼挨个进行投喂。还有人为了检查工具质量问题,当场销毁看不合格工具,因此我参观了绑着燃烧瓶的约两米长的弹簧被投掷至远处后迅速被点燃又突然消失了。
    • 不知道是什么考试要去不知道什么地方,考完试集合时发现是在我老家屋子里,先到集合的有 @xrlong 等人,然后因为就直接放假了所以我家长就直接带我走了,等出家门时却发现我在我家后院的门里出来了,旁边用于停车的仓库突然有约两个班数量的人以跑操队形跑了出来,顺着胡同向前走的过程中气氛非常喜庆。在进我家前院大门时发现院子里挤满了人,有 @HaneDaniko@Qyun , @oceans_of_stars 和初一、初二时候的一堆同学,勉强挤到门口时众人突然有说有笑地围着我,然后又开始发期末考试的答题纸和语文答案,初三原班语文课代表把答案给我的时候我说为啥我的语文答案会让原班给我,然后她白了我一眼,说了一堆不知道什么话,接着就醒了。

做题纪要

luogu P8421 [THUPC2022 决赛] rsraogps

  • 将询问挂在右端点上进行扫描线,修改暴力向左延伸至多 O(logn) 位,可以接受。

  • 考虑手动模拟维护历史版本和的过程。

  • 具体地,考虑维护 hsumj 表示 l[1,j],r[l,i] 的答案,将询问差分成 hsumrhsuml1 的形式。

  • 修改和查询时下传求历史和轮数的时间戳,可以通过记录上一次修改的时间、历史版本和的前缀和、懒惰标记的前缀和后 O(1) 计算。

    点击查看代码
    uint a[1000010],b[1000010],c[1000010],hsum[1000010],t[1000010],lazy[1000010],ans[5000010];
    vector<pair<uint,uint> >q[1000010];
    uint ask(uint i,uint tim)
    {
    	return hsum[i]+(tim-t[i])*lazy[i];
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	uint n,m,l,r,i,j;
    	scanf("%u%u",&n,&m);
    	for(i=1;i<=n;i++)  scanf("%u",&a[i]);
    	for(i=1;i<=n;i++)  scanf("%u",&b[i]);
    	for(i=1;i<=n;i++)  scanf("%u",&c[i]);
    	for(i=1;i<=m;i++)
    	{
    		scanf("%u%u",&l,&r);
    		q[r].push_back(make_pair(l,i));
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=i-1;j>=1;j--)
    		{
    			if((a[j]&a[j+1])==a[j]&&(b[j]|b[j+1])==b[j]&&__gcd(c[j],c[j+1])==c[j])  break;	
    			a[j]&=a[j+1];
    			b[j]|=b[j+1];
    			c[j]=__gcd(c[j],c[j+1]);
    		}	
    		hsum[i]=ask(i-1,i-1);// i 先继承 i-1 先前的答案
    		j++;
    		for(;j<=i;j++)
    		{
    			hsum[j]=ask(j,i-1);
    			lazy[j]=lazy[j-1]+a[j]*b[j]*c[j];
    			t[j]=i-1;
    		}
    		for(j=0;j<q[i].size();j++)  ans[q[i][j].second]=ask(i,i)-ask(q[i][j].first-1,i);//询问时将多产生的一次时间戳下传
    	}
    	for(i=1;i<=m;i++)  printf("%u\n",ans[i]);
    	return 0;
    }
    

luogu P9607 [CERC2019] Be Geeks!

  • 启发式分裂,需要解决快速求出 l=Lxxr=xRxgcdi=lr{ai} 的问题。

  • 差分成 f(Lx,Rx)f(Lx,x1)f(x+1,Rx) 分别进行统计,其中 f(x,y)=xlrygcdi=lr{ai} ,然后和上题一样维护。

    点击查看代码
    const ll p=1000000007;
    ll a[200010],hsum[200010],lazy[200010],t[200010],l[200010],r[200010];
    vector<pair<ll,ll> >q[200010];
    stack<ll>s;
    ll ask(ll i,ll tim)
    {
    	return (hsum[i]+(tim-t[i])*lazy[i]%p)%p;
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,ans=0,i,j;
    	cin>>n;
    	for(i=1;i<=n;i++) 
    	{
    		cin>>a[i];
    		while(s.empty()==0&&a[s.top()]<a[i])  s.pop();
    		l[i]=(s.empty()==0)?s.top()+1:1;
    		s.push(i);
    		if(i-1>=l[i])  q[i-1].push_back(make_pair(l[i],p-a[i]));
    	}
    	while(s.empty()==0)  s.pop();
    	for(i=n;i>=1;i--)  
    	{
    		while(s.empty()==0&&a[s.top()]<=a[i])  s.pop();
    		r[i]=(s.empty()==0)?s.top()-1:n;
    		s.push(i);
    		q[r[i]].push_back(make_pair(l[i],a[i]));
    		if(i+1<=r[i])  q[r[i]].push_back(make_pair(i+1,p-a[i]));
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=i-1;j>=1;j--)
    		{
    			if(__gcd(a[j],a[j+1])==a[j])  break;
    			a[j]=__gcd(a[j],a[j+1]);
    		}
    		hsum[i]=ask(i-1,i-1);
    		j++;
    		for(;j<=i;j++)
    		{
    			hsum[j]=ask(j,i-1);
    			lazy[j]=(lazy[j-1]+a[j])%p;
    			t[j]=i-1;
    		}
    		for(j=0;j<q[i].size();j++)  
    		{
    			ans=(ans+(ask(i,i)-ask(q[i][j].first-1,i)+p)%p*q[i][j].second%p)%p;
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

CF888E Maximum Subsequence

  • 折半搜索。

    点击查看代码
    int a[50],ans=0,p;
    set<int>s;
    set<int>::iterator it;
    void dfs1(int pos,int n,int sum)
    {
    	if(pos==n+1)
    	{
    		ans=max(ans,sum);
    		s.insert(sum);
    		return;
    	}
    	dfs1(pos+1,n,sum);
    	dfs1(pos+1,n,(sum+a[pos])%p);
    }
    void dfs2(int pos,int n,int sum)
    {
    	if(pos==n+1)
    	{
    		it=s.lower_bound(p-sum);
    		if(it!=s.begin())
    		{
    			it--;
    			ans=max(ans,sum+*it);
    		}
    		return;
    	}
    	dfs2(pos+1,n,sum);
    	dfs2(pos+1,n,(sum+a[pos])%p);
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,i;
    	cin>>n>>p;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	dfs1(1,n/2,0);
    	dfs2(n/2+1,n,0);
    	cout<<ans<<endl;
    	return 0;
    }
    

1.12

闲话

  • 在机房补 whk
  • 上午约 10:00 时机房突然跳闸了,仅有 huge 曾经在的教师机活了下来,找到 huge 后让我们先活动一会儿,等来电了再让我们接着补 whk / 写专题,遂在机房打板羽。然后 huge 进来说最近有个武大营,明确表示与强基计划招生无关,猜测会与暑假南大营一样在测试后主要是为了宣传学校,等到高三报强基的时候再去了解各院校可能会有点晚,让我们早做打算,说我们如果看不上武大或者没打算上武大的话就不用报了,但还是把主要心思放在清北营上,遂我们都报了。报名表用问卷星搭的,仅让填写了身份证号和获奖情况等重要信息,甚至指导教师电话都不是必填项。
  • 下午大课间的时候和 huge 说现在落下的课貌似到期末之前补不完了,而且他说这次期末之前不再给我们回班上 whk 的时间; huge 让我们专心补 whk ,不要一心二用。
  • 晚上 huge 来转的时候他说让我们收集一下听课期间的遗留问题,他好找科任老师来给我们答疑。

做题纪要

1.13

闲话

  • 上午 7:3512:05 打学校 OJ 的模拟赛。
  • 下午放 @ppllxx_9G 的每日一歌《打上火花》;然后讲题。下午大课间的时候 huge 让我们出去活动活动,可以去楼下转转,遂去楼道里打羽毛球了。
  • hugemiaomiao 几乎半个多下午都在隔壁机房不知道在做什么,过了一会儿 huge 突然进来给我们说了一道很有意思的签到题 [ABC388E] Simultaneous Kagamimochi ,问了下我们二分答案、 ST 表、优先队列、双指针相关做法以及能否扩展至 [ABC388G] Simultaneous Kagamimochi 2 ,说这题虽然放在了 E 题但比较好写,他一开始只想到了建二分图然后发现复杂度假了,接着 miaomiao 当着我们的面给 huge 讲了双指针做法。貌似前面他们在隔壁就是在讨论这题相关做法。

做题纪要

HZTG5872. 枇杷树

HZTG5873. 上古遗迹

[ABC388E] Simultaneous Kagamimochi

  • 多倍经验: CF372A Counting Kangaroos is Fun

    点击查看代码
    int a[500010];
    int main()
    {
    	int n,ans=0,l,r,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	sort(a+1,a+1+n);
    	for(l=n/2,r=n;l>=1;l--)
    	{
    		if(a[r]>=a[l]*2)
    		{
    			ans++;
    			r--;
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

[ABC388G] Simultaneous Kagamimochi 2

  • 二分答案,前 mid 小和后 mid 大顺次匹配。

  • 由于 {a} 升序,处理出 bi 表示最小的 j 使得 aj2ai

  • 合法当且仅当于 i[l,l+mid1],birmid+1+il+11 ,移项得到 biirl+1mid

  • 维护 bii 的区间最大值即可。

    点击查看代码
    int a[200010],b[200010];
    struct ST
    {
    	int f[20][200010];
    	void init(int n,int a[])
    	{
    		memset(f,0,sizeof(f));
    		for(int i=1;i<=n;i++)  f[0][i]=a[i];
    		for(int j=1;j<=log2(n);j++)
    		{
    			for(int i=1;i+(1<<j)-1<=n;i++)
    			{
    				f[j][i]=max(f[j-1][i],f[j-1][i+(1<<(j-1))]);
    			}
    		}
    	}
    	int query(int l,int r)
    	{
    		int t=log2(r-l+1);
    		return max(f[t][l],f[t][r-(1<<t)+1]);
    	}
    }T;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,l,r,ans,mid,x,y,i;
    	cin>>n;
    	for(i=1;i<=n;i++)  cin>>a[i];
    	for(i=1;i<=n;i++)
    	{
    		b[i]=lower_bound(a+1,a+1+n,a[i]*2)-a-i;
    	}
    	T.init(n,b);
    	cin>>m;
    	for(i=1;i<=m;i++)
    	{
    		cin>>x>>y;
    		l=1;
    		r=(y-x+1)/2;
    		ans=0;
    		while(l<=r)
    		{
    			mid=(l+r)/2;
    			if(T.query(x,x+mid-1)<=y-x+1-mid)
    			{
    				ans=mid;
    				l=mid+1;
    			}
    			else
    			{
    				r=mid-1;
    			}
    		}
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    

HZTG5874. 吞天得手

1.14

闲话

  • 候操位置变成了揽月楼前。
  • 上午 miaomiao 来了之后问我们怎么构造专题还没写完,说今天任务由数据结构专题改成了构造专题。
  • 下午起床后是防震演练,因宿舍离操场较近所以集合得很快。到机房后放 @HANGRY_sol 的每日一歌《消愁》, huge 说只有经历过一些事情的人才能感觉出歌里的韵味,问我们这么喜欢听是因为构造专题一点都写不动吗;体育课正常。
  • 吃完晚饭后 miaomiao 说让我们在楼道里吃水果时注意上课时间。

做题纪要

[AGC029C] Lexicographic constraints

CF1495C Garden of the Sun

CF1053E Euler tour

CF1227G Not Same

[AGC020D] Min Max Repetition

牛客周赛 Round 76 C 小红的gcd

  • 操作至 i,j[1,n],ai=aj=gcd(ai,aj) 显然最优,容易证明存在一种操作方式使得每个数都等于 gcdi=1n{ai}

    点击查看代码
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,d=0,x,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>x;
    		d=__gcd(d,x);
    	}
    	cout<<n*d<<endl;
    	return 0;
    }
    

牛客周赛 Round 76 E 幂次进近

  • nk,nk+1 进行判断,略卡精度。

    点击查看代码
    long double f(long double n,long double m,long double k)
    {
    	return abs(n-pow(m,k));
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll t,ans,i;
    	long double n,k;
    	cin>>t;
    	for(i=1;i<=t;i++)
    	{
    		cin>>n>>k;
    		ans=pow(n,1.0/k);
    		cout<<(f(n,ans,k)<f(n,ans+1,k)?ans:ans+1)<<endl;
    	}
    	return 0;
    }
    

牛客周赛 Round 76 F 同位序列

  • 将值域计入状态进行转移, g(x)lowbit 乱求即可。

    点击查看代码
    int a[100010];
    unordered_map<int,int>f;
    int lowbit(int x)
    {
    	return (x&(-x));
    }
    int g(int x)
    {
    	return x+lowbit(x)+(1<<(__builtin_popcount(x)-__builtin_popcount(x+lowbit(x))))-1;
    }
    void print(int x)
    {
    	if(f[x]==0)  return;
    	cout<<x<<" ";
    	print(g(x));
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,maxx=0,opt=0,i;
    	cin>>n;
    	for(i=1;i<=n;i++)  cin>>a[i];
    	sort(a+1,a+1+n,greater<int>());
    	for(i=1;i<=n;i++)
    	{
    		f[a[i]]=f[g(a[i])]+1;
    		if(f[a[i]]>maxx)
    		{
    			maxx=f[a[i]];
    			opt=a[i];
    		}
    	}
    	cout<<maxx<<endl;
    	print(opt);
    	return 0;
    }
    

[AGC030C] Coloring Torus

luogu P8310 〈 TREEのOI 2022 Spring 〉Essential Operations

  • 两棵线段树分别存储上一次 4 操作前的状态和当前状态,遇到 4 操作则交换两棵树并进行操撤销作。

  • 需要查理线段树。

    点击查看代码
    const int p=19260817;
    int a[500010],pd[100010],l[100010],r[100010],x[100010];
    struct SMT
    {
    	struct SegmentTree
    	{
    		int len,sum,add,mul;
    	}tree[1000010];
    	#define lson(rt)  (mid<<1)
    	#define rson(rt)  (mid<<1|1)
    	void pushup(int rt,int l,int r)
    	{
    		int mid=(l+r)/2;
    		tree[rt].sum=(tree[lson(rt)].sum+tree[rson(rt)].sum)%p;
    	}
    	void build(int rt,int l,int r)
    	{
    		tree[rt].len=r-l+1;
    		tree[rt].add=0;  tree[rt].mul=1;
    		if(l==r)
    		{
    			tree[rt].sum=a[l];
    			return;
    		}
    		int mid=(l+r)/2;
    		build(lson(rt),l,mid);
    		build(rson(rt),mid+1,r);
    		pushup(rt,l,r);
    	}
    	void pushlazy(int rt,int add,int mul)
    	{
    		tree[rt].add=(1ll*tree[rt].add*mul%p+add)%p;
    		tree[rt].mul=1ll*tree[rt].mul*mul%p;
    		tree[rt].sum=(1ll*tree[rt].sum*mul%p+1ll*tree[rt].len*add%p)%p;
    	}
    	void pushdown(int rt,int l,int r)
    	{
    		int mid=(l+r)/2;
    		pushlazy(lson(rt),tree[rt].add,tree[rt].mul);
    		pushlazy(rson(rt),tree[rt].add,tree[rt].mul);
    		tree[rt].add=0;  tree[rt].mul=1;
    	}
    	void update(int rt,int l,int r,int x,int y,int add,int mul)
    	{
    		if(x<=l&&r<=y)
    		{
    			pushlazy(rt,add,mul);
    			return;
    		}
    		pushdown(rt,l,r);
    		int mid=(l+r)/2;
    		if(x<=mid)  update(lson(rt),l,mid,x,y,add,mul);
    		if(y>mid)  update(rson(rt),mid+1,r,x,y,add,mul);
    		pushup(rt,l,r);
    	}
    	int query(int rt,int l,int r,int x,int y)
    	{
    		if(x<=l&&r<=y)  return tree[rt].sum;
    		pushdown(rt,l,r);
    		int mid=(l+r)/2;
    		if(y<=mid)  return query(lson(rt),l,mid,x,y);
    		if(x>mid)  return query(rson(rt),mid+1,r,x,y);
    		return (query(lson(rt),l,mid,x,y)+query(rson(rt),mid+1,r,x,y))%p;
    	}
    }T[2];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,op=0,last=0,i,j;
    	cin>>n>>m;
    	for(i=1;i<=n;i++)  cin>>a[i];
    	T[0].build(1,1,n);
    	T[1].build(1,1,n);
    	for(i=1;i<=m;i++)
    	{
    		cin>>pd[i];
    		if(pd[i]==1)
    		{
    			cin>>l[i]>>r[i]>>x[i];
    			T[op].update(1,1,n,l[i],r[i],x[i],1);
    		}
    		if(pd[i]==2)
    		{
    			cin>>l[i]>>r[i]>>x[i];
    			T[op].update(1,1,n,l[i],r[i],0,x[i]);
    		}
    		if(pd[i]==3)
    		{
    			cin>>l[i]>>r[i];
    			cout<<T[op].query(1,1,n,l[i],r[i])<<endl;
    		}
    		if(pd[i]==4)
    		{
    			op^=1;
    			for(j=i-1;j>last;j--)
    			{
    				if(pd[j]==1)  T[op].update(1,1,n,l[j],r[j],x[j],1);
    				if(pd[j]==2)  T[op].update(1,1,n,l[j],r[j],0,x[j]);
    			}
    			last=i;
    		}
    	}
    	return 0;
    }
    

CF804E The same permutation

1.15

闲话

  • 上午 7:3512:05 打学校 OJ 的模拟赛。
  • 下午放 @xrlong 的每日一歌《Bad Apple》。因想去提高 OJ 看原根的题单遂去找 huge 把提高 OJ 打开的时候他说让我去找 miaomiao ,这个限制是他设置的。然后去找 miaomiao 简单说明原因后就把提高 OJ 打开了,然后他问我多项式学到什么程度了,我说多项式还没学呢,他又问多项式还没学呢怎么就开始学原根了,我说是因为今天模拟赛 T2 需要原根所以才去学的,他又问我们现在知识点都是遇到了才去学的吗;又问我原根、二项式反演、斯特林数、容斥、多项式整体学得怎么样,我说因为当时说数学的知识点等年后统一再学遂整体基本都没怎么动,只有个别人打了打板子之类的;然后又问我点分治、可持久化数据结构、群论和线性基、 KDTree 题写了吗,我说点分治都写了、可持久化数据结构还差一个平衡树、群论和 KDTree 一点没写、线性基写了一半;然后又问我还有什么东西没学,我说卡特兰数、 Prüfer 序列,和再往后的一些专题还没写,他说再往后的一些专题可以等省选后再写。
  • miaomiao 带着两个不知道干什么的老师来巡视机房,那两个老师说机房味道太大了,问 miaomiao 机房的通风情况。
  • 吃完晚饭后 miaomiao 嫌我们在楼道里吃水果时间太长了,说隔壁 18:45 早就都在机房做好了,我们还从食堂晃晃悠悠走到机房然后靠在墙边上吃水果、聊天,他并不是反对我们吃水果、聊天,只是嫌时间有点长了,让我们以后尽量在 18:50 前干完。然后说他带的这么多届学生,都是资历越老、越是老油条的越懒散,以前暑假都是只有放假前、中间、开学前放一天或两天假,今年暑假给我们放这么多假还在宿舍玩狼人杀、打牌,在机房四处灌水,我们都看在眼里,他也看在眼里,还有这次冬令营还有人去打牌来着,说我们太懒散了,高二的肯定不能再摸鱼了,高一的也得把自己当成高二的看。然后说了下今年冬令营奖项的变革,说 THUWC 将一等约、二等约合并成了金奖,其他高校组织的冬令营或校测也多了起来,强基刚开始的时候银牌以上选手都是去清北的,现在其他高校也想要更多点的奥赛生了,体系是在逐渐摸索向好发展的,但我们也要有一定的实力,要知道自己的实力在省内的大致排名。他上次和 @Delov 聊天的时候说基本上比赛期间遇到的各种问题都是因为自身实力不足,模拟赛的时候不想写部分分、暴力怎么指望自己正赛的时候能写部分分、暴力呢,而且现在出题人组题也不好组,他们也害怕万一被选手一眼切了,所以我们做题能马上和出题人脑电波对上并理解出题人的意图是很困难的,要重视思考部分分的过程。

做题纪要

Gym103428H city safety

luogu P6091 【模板】原根

  • 原根板子。

    点击查看代码
    ll prime[1000010],vis[1000010],phi[1000010],pr[1000010],len=0;
    vector<ll>result,ans;
    void isprime(ll n)
    {
    	memset(vis,0,sizeof(vis));
    	phi[1]=1;
    	for(ll i=2;i<=n;i++)
    	{
    		if(vis[i]==0)
    		{
    			len++;  prime[len]=i;
    			phi[i]=i-1;
    		}
    		for(ll j=1;j<=len&&i*prime[j]<=n;j++)
    		{
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0)
    			{
    				phi[i*prime[j]]=phi[i]*prime[j];
    				break;
    			}
    			else  phi[i*prime[j]]=phi[i]*(prime[j]-1);
    		}
    	}
    	pr[2]=pr[4]=1;
    	for(ll i=2;i<=len;i++)
    	{
    		for(ll j=1;j*prime[i]<=n;j*=prime[i])  pr[j*prime[i]]=1;
    		for(ll j=2;j*prime[i]<=n;j*=prime[i])  pr[j*prime[i]]=1;
    	}
    }
    ll qpow(ll a,ll b,ll p)
    {
    	ll ans=1;
    	while(b)
    	{
    		if(b&1)  ans=ans*a%p;
    		b>>=1;
    		a=a*a%p;
    	}
    	return ans;
    }
    void divide(ll n)
    {
    	result.clear();
    	for(ll i=1;i<=len&&prime[i]*prime[i]<=n;i++)
    	{
    		if(n%prime[i]==0)
    		{
    			result.push_back(prime[i]);
    			while(n%prime[i]==0)  n/=prime[i];
    		}
    	}
    	if(n>1)  result.push_back(n);
    }
    bool check(ll x,ll p)
    {
    	if(qpow(x,phi[p],p)!=1)  return false;
    	for(ll i=0;i<result.size();i++)
    	{
    		if(qpow(x,phi[p]/result[i],p)==1)  return false;
    	}
    	return true;
    }
    ll min_pr(ll p)
    {
    	if(pr[p]==0)  return -1;
    	for(ll i=1;i<=p-1;i++)
    	{
    		if(check(i,p)==true)  return i;
    	}
    	return -1;
    }
    void all_pr(ll p,ll g)
    {
    	ans.clear();
    	if(g==-1)  return;
    	for(ll i=1,x=g;i<=phi[p];i++,x=x*g%p)
    	{
    		if(__gcd(i,phi[p])==1)  ans.push_back(x);
    	}
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll t,p,d,i,j;
    	cin>>t;
    	isprime(1000000);
    	for(j=1;j<=t;j++)
    	{
    		cin>>p>>d;
    		divide(phi[p]);
    		all_pr(p,min_pr(p));
    		sort(ans.begin(),ans.end());
    		cout<<ans.size()<<endl;
    		for(i=1;i<=ans.size()/d;i++)
    		{
    			cout<<ans[i*d-1]<<" ";
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    

Gym103428C Assign or Multiply

CF484E Sign on Fence

  • luogu P2839 [国家集训队] middle 一样做即可。

    点击查看代码
    pair<int,int>a[100010];
    struct PDS_SMT
    {
    	int root[100010],rt_sum=0;
    	struct node
    	{
    		int len,pre,suf,ans;
    		node()
    		{
    			len=pre=suf=ans=0;
    		}
    		node operator + (const node &another)  const
    		{
    			node tmp;
    			tmp.len=len+another.len;
    			tmp.pre=(pre==len)?pre+another.pre:pre;
    			tmp.suf=(another.suf==another.len)?suf+another.suf:another.suf;
    			tmp.ans=max({ans,another.ans,suf+another.pre});
    			return tmp;
    		}
    	};
    	struct SegmentTree
    	{
    		int ls,rs;
    		node val;
    	}tree[100010<<5];
    	#define lson(rt) (tree[rt].ls)
    	#define rson(rt) (tree[rt].rs)
    	int build_rt()
    	{
    		rt_sum++;
    		return rt_sum;
    	}
    	void pushup(int rt)
    	{
    		tree[rt].val=tree[lson(rt)].val+tree[rson(rt)].val;
    	}
    	void build(int &rt,int l,int r)
    	{
    		rt=build_rt();
    		tree[rt].val.len=r-l+1;
    		if(l==r)  return;
    		int mid=(l+r)/2;
    		build(lson(rt),l,mid);
    		build(rson(rt),mid+1,r);
    	}
    	void update(int pre,int &rt,int l,int r,int pos)
    	{
    		rt=build_rt();
    		tree[rt]=tree[pre];
    		if(l==r)
    		{
    			tree[rt].val.pre=tree[rt].val.suf=tree[rt].val.ans=1;
    			return;
    		}
    		int mid=(l+r)/2;
    		if(pos<=mid)  update(lson(pre),lson(rt),l,mid,pos);
    		else  update(rson(pre),rson(rt),mid+1,r,pos);
    		pushup(rt);
    	}
    	node query(int rt,int l,int r,int x,int y)
    	{
    		if(x<=l&&r<=y)  return tree[rt].val;
    		int mid=(l+r)/2;
    		if(y<=mid)  return query(lson(rt),l,mid,x,y);
    		if(x>mid)  return query(rson(rt),mid+1,r,x,y);
    		return query(lson(rt),l,mid,x,y)+query(rson(rt),mid+1,r,x,y);
    	}
    }T;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,st,ed,k,l,r,mid,ans,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i].first;  a[i].second=i;
    	}
    	sort(a+1,a+1+n,greater<pair<int,int> >());
    	T.build(T.root[0],1,n);
    	for(i=1;i<=n;i++)  T.update(T.root[i-1],T.root[i],1,n,a[i].second);
    	cin>>m;
    	for(i=1;i<=m;i++)
    	{
    		cin>>st>>ed>>k;
    		l=1;  r=n;  ans=0;
    		while(l<=r)
    		{
    			mid=(l+r)/2;
    			if(T.query(T.root[mid],1,n,st,ed).ans>=k)
    			{
    				ans=mid;
    				r=mid-1;
    			}
    			else
    			{
    				l=mid+1;
    			}
    		}
    		cout<<a[ans].first<<endl;
    	}
    	return 0;
    }
    

1.16

闲话

  • 在机房补 whkmiaomiao 说让我们明天、周日也补 whk 使得在期末前把课补完,如果还不够就再把周六加上。
  • 下午体育课正常。

做题纪要

1.17

闲话

  • 在机房补 whk ,尝试和 field 交涉让我们不考期末但失败了。
  • 下午因要给零基础的腾机房所以被赶回来了。
  • 武大营没过。

做题纪要

BZOJ4675 点对游戏

  • 每个人的结果相互独立,贡献来自每对点对。

  • (x2)(n2)k=1mi=1nj=in[disi,j=ak]=x(x1)n(n1)k=1mi=1nj=in[disi,j=ak] 即为所求,其中 x 表示某人能选取的点的数量。

    点击查看代码
    struct node
    {
    	int nxt,to;
    }e[100010];
    int head[50010],a[20],m,cnt=0,ans=0;
    void add(int u,int v)
    {
    	cnt++;
    	e[cnt].nxt=head[u];
    	e[cnt].to=v;
    	head[u]=cnt;
    }
    struct Divide_On_Tree
    {
    	int siz[50010],weight[50010],vis[50010],dis[50010],tmp[50010],judge[50010],center;
    	queue<int>q;
    	void init(int n)
    	{
    		center=0;
    		get_center(1,0,n);
    		get_siz(center,0);
    		divide(center);
    	}
    	void get_center(int x,int fa,int n)
    	{
    		siz[x]=1;
    		weight[x]=0;
    		for(int i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(e[i].to!=fa&&vis[e[i].to]==0)
    			{
    				get_center(e[i].to,x,n);
    				siz[x]+=siz[e[i].to];
    				weight[x]=max(weight[x],siz[e[i].to]);
    			}
    		}
    		weight[x]=max(weight[x],n-siz[x]);
    		if(weight[x]<=n/2)  center=x;
    	}
    	void get_siz(int x,int fa)
    	{
    		siz[x]=1;
    		for(int i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(e[i].to!=fa&&vis[e[i].to]==0)
    			{
    				get_siz(e[i].to,x);
    				siz[x]+=siz[e[i].to];
    			}
    		}
    	}
    	void get_dis(int x,int fa)
    	{
    		tmp[0]++;
    		tmp[tmp[0]]=dis[x];
    		for(int i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(e[i].to!=fa&&vis[e[i].to]==0)
    			{
    				dis[e[i].to]=dis[x]+1;
    				get_dis(e[i].to,x);
    			}
    		}
    	}
    	void divide(int x)
    	{
    		judge[0]=1;  q.push(0);
    		vis[x]=1;
    		for(int i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(vis[e[i].to]==0)
    			{
    				tmp[0]=0;
    				dis[e[i].to]=1;
    				get_dis(e[i].to,x);
    				for(int j=1;j<=tmp[0];j++)
    				{
    					for(int k=1;k<=m;k++)
    					{
    						if(a[k]>=tmp[j])  ans+=judge[a[k]-tmp[j]];
    					}
    				}
    				for(int j=1;j<=tmp[0];j++)
    				{
    					q.push(tmp[j]);  judge[tmp[j]]++;
    				}
    			}
    		}
    		while(q.empty()==0)
    		{
    			judge[q.front()]=0;  q.pop();
    		}
    		for(int i=head[x];i!=0;i=e[i].nxt)
    		{
    			if(vis[e[i].to]==0)
    			{
    				center=0;
    				get_center(e[i].to,x,siz[e[i].to]);
    				get_siz(center,0);
    				divide(center);
    			}
    		}
    	}
    }D;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,u,v,x,y,z,i;
    	cin>>n>>m;
    	for(i=1;i<=m;i++)  cin>>a[i];
    	for(i=1;i<=n-1;i++)
    	{
    		cin>>u>>v;
    		add(u,v);
    		add(v,u);
    	}
    	D.init(n);
    	x=n/3+(n%3>=1);  printf("%.2lf\n",1.0*x*(x-1)/n/(n-1)*ans);
    	y=n/3+(n%3>=2);  printf("%.2lf\n",1.0*y*(y-1)/n/(n-1)*ans);
    	z=n/3;           printf("%.2lf\n",1.0*z*(z-1)/n/(n-1)*ans);
    	return 0;
    }
    

luogu B4120 [202501A] 数字谜

  • 顺序结构。

    点击查看代码
    cout<<b-a%10+10*(b-a%10<0)<<endl;
    

luogu B4121 [202501B] 会场座位

  • 简单分讨。

    点击查看代码
    int a,b;
    cin>>a>>b;	
    if(b%2==1)  swap(a,b);
    if(a%2==b%2)  cout<<abs(a-b)/2-1<<endl;
    else  cout<<(ceil(a/2.0)+b/2-1)<<endl;
    

luogu B4122 [202501C] Pollard-Rho

  • 循环结构。

    点击查看代码
    int x,c,k,i;
    cin>>x>>c>>k;
    for(i=1;i<=k-1;i++)
    {
    	x=(x*x+c)%10000;
    }
    cout<<x<<endl;
    

luogu B4123 [202501D] 检票

  • 循环结构。

    点击查看代码
    int a[10010],b[10010],c[10010];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		if(a[i]<=15)
    		{
    			b[0]++;
    			b[b[0]]=a[i];
    		}
    		else
    		{
    			c[0]++;
    			c[c[0]]=a[i];
    		}
    	}
    	for(i=1;i<=b[0];i++)  cout<<b[i]<<" ";
    	for(i=1;i<=c[0];i++)  cout<<c[i]<<" ";
    	return 0;
    }
    

luogu B4125 [202501F] 知识竞赛

  • 模拟。

    点击查看代码
    int a[100][100],sum[100];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,maxx=0,pos=0,cnt=0,i,j;
    	cin>>n>>m;
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			cin>>a[i][j];
    			sum[j]+=a[i][j];
    		}
    	}
    	for(i=m;i>=1;i--)
    	{
    		if(sum[i]>maxx)
    		{
    			maxx=sum[i];
    			pos=i;
    		}
    	}
    	maxx=0;
    	for(i=1;i<=n;i++)
    	{
    		if(a[i][pos]>maxx)
    		{
    			maxx=a[i][pos];
    			cnt=1;
    		}
    		else
    		{
    			cnt+=(a[i][pos]==maxx);
    		}
    	}
    	cout<<maxx<<" "<<cnt<<endl;
    	return 0;
    }
    

luogu B4124 [202501E] 右箭头

  • 模拟。

    点击查看代码
    char c[110][110];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,k,i,j,h;
    	cin>>n>>m>>k;
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++) c[i][j]='.';
    	}
    	for(i=m-(n+1)/2+1,j=1;i<=m;i++,j++)
    	{
    		for(h=j;h<=n-j+1;h++)  
    		{
    			c[h][i]='#';
    		}
    	}
    	for(i=1;i<=m-(n+1)/2;i++)
    	{
    		for(j=(n+1)/2-k/2;j<=(n+1)/2+k/2;j++)
    		{
    			c[j][i]='#';
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++) cout<<c[i][j];
    		cout<<endl;
    	}
    	return 0;
    }
    

luogu B4126 [202501G] 古希腊掌管节奏的神

  • 模拟。

    点击查看代码
    char s[10010];
    vector<int>a[10];
    int val(char s,char t)
    {
    	if(t=='\'')  return (s=='L')?2:4;
    	else  return (s=='L')?1:3;
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int type,n,last=0,ans=0,cnt=0,i,j;
    	cin>>(s+1)>>type;
    	n=strlen(s+1);
    	s[n+1]='a';
    	for(i=1;i<=n;i++)
    	{
    		if(s[i]=='(')
    		{
    			last=i;
    			ans++;
    		}
    		else
    		{
    			if(s[i]==')')  last=0;
    			else
    			{
    				if(last==0)  ans+=(s[i]!='\'');
    				if(s[i]!='\'')  a[val(s[i],s[i+1])].push_back(ans);
    			}
    		}
    	}
    	cout<<ans<<endl;
    	if(type==1)
    	{
    		for(i=1;i<=4;i++)
    		{
    			cnt=0;
    			ans=0;
    			for(j=0;j<a[i].size();j++)
    			{
    				if(j==0)  cnt=1;
    				else  cnt=(a[i][j-1]+1==a[i][j])?cnt+1:1;
    				ans=max(ans,cnt);
    			}
    			cout<<ans<<" ";
    		}
    	}
    	return 0;
    }
    

luogu B4127 [202501H] 分队平衡

  • 模拟。

    点击查看代码
    ll a[100][100],sum[100],vis[100][100];
    vector<ll>c;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,m,k,maxx,minn,i,j;
    	cin>>n>>m>>k;
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			cin>>a[i][j];
    		}
    	}
    	for(;k>=1;k--)
    	{
    		memset(sum,0,sizeof(sum));
    		memset(vis,0,sizeof(vis));
    		maxx=0;
    		minn=0x7f7f7f7f7f7f7f7f;
    		c.clear();
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=m;j++)
    			{
    				sum[j]+=a[i][j];
    			}
    		}
    		for(i=1;i<=m;i++)
    		{
    			maxx=max(maxx,sum[i]);
    			minn=min(minn,sum[i]);
    		}
    		for(j=1;j<=m;j++)
    		{
    			if(sum[j]==maxx||sum[j]==minn)
    			{
    				for(i=1;i<=n;i++)
    				{
    					vis[i][j]=0;
    					c.push_back(a[i][j]);
    				}
    			}
    			else
    			{
    				for(i=1;i<=n;i++)
    				{
    					vis[i][j]=1;
    				}
    			}
    		}
    		sort(c.begin(),c.end());
    		for(i=1;i<=n;i++)
    		{
    			if(i%2==1)
    			{
    				for(j=1;j<=m;j++)
    				{
    					if(vis[i][j]==0)
    					{
    						a[i][j]=c.back();
    						c.pop_back();
    					}
    				}
    			}
    			else
    			{
    				for(j=m;j>=1;j--)
    				{
    					if(vis[i][j]==0)
    					{
    						a[i][j]=c.back();
    						c.pop_back();
    					}
    				}
    			}
    			
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			cout<<a[i][j]<<" ";
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    
    

牛客小白月赛109 A Onewan的疑惑

  • 顺序结构。

    点击查看代码
    int n;
    cin>>n;
    cout<<n-max(1,n-19260817-114514)+1<<endl;
    

牛客小白月赛109 B 菲菲姐的游戏

  • 每次仅选择一个数一定更优,判下 maxi=1n1{ai}an 的大小。

    点击查看代码
    int a[100010];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,k1,k2,maxx=0,i;
    	cin>>n>>k1>>k2;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		if(i<=n-1)  maxx=max(maxx,a[i]);
    	}
    	cout<<((maxx>a[n])?"Yes":"No")<<endl;
    	return 0;
    }
    

牛客小白月赛109 C 猪猪养成计划1

  • set 模拟。

    点击查看代码
    int ans[100010];
    set<int>s;
    set<int>::iterator it;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,pd,l,r,x,cnt=0,i,j;
    	cin>>n>>m;
    	for(i=1;i<=n;i++)  s.insert(i);
    	for(i=1;i<=m;i++)
    	{
    		cin>>pd;
    		if(pd==1)
    		{
    			cin>>l>>r;
    			for(it=s.lower_bound(l);it!=s.end()&&*it<=r;)
    			{
    				cnt++;
    				ans[*it]=cnt;
    				it=next(it);
    				s.erase(prev(it));
    			}
    		}
    		else
    		{
    			cin>>l;
    			cout<<ans[l]<<endl;
    		}
    	}
    	return 0;
    }
    

牛客小白月赛109 D 猪猪养成计划2

  • DP 记录前缀的答案然后进行统计。

    点击查看代码
    struct node
    {
    	ll a,b,val;
    }a[100010];
    ll sum[100010],f[100010][2];
    bool cmp(node x,node y)
    {
    	return x.a<y.a;
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,m,i,j;
    	cin>>n>>m;
    	for(i=1;i<=n;i++)  cin>>a[i].a;
    	for(i=1;i<=n;i++)  cin>>a[i].b>>a[i].val;
    	sort(a+1,a+1+n,cmp);
    	for(i=1,j=0;i<=n;i++)
    	{
    		sum[i]=sum[i-1]+a[i].val;
    		for(;a[j+1].a+m-1<a[i].a;j++);
    		f[i][0]=min(f[i-1][0],f[i-1][1])+a[i].val;
    		f[i][1]=min(f[j][0],f[j][1])+a[i].b+sum[i-1]-sum[j];
    	}
    	cout<<min(f[n][0],f[n][1])<<endl;
    	return 0;
    }
    

牛客小白月赛109 E min25筛

  • 维护右端点右移对若干个区间的贡献,并更新历史版本和答案。

    点击查看代码
    const ll p=1000000007;
    ll a[100010],s[2];
    ll qpow(ll a,ll b,ll p)
    {
    	ll ans=1;
    	while(b)
    	{
    		if(b&1)  ans=ans*a%p;
    		b>>=1;
    		a=a*a%p;
    	}
    	return ans;
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,ans=0,tmp,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		while(a[i]%25==0)  a[i]/=25;
    	}
    	for(i=1;i<=n;i++)
    	{
    		if(a[i]%5==0)
    		{
    			tmp=s[0];
    			s[0]=s[1]*a[i]%p*qpow(25,p-2,p)%p;
    			s[1]=(tmp+1)*a[i]%p;
    		}
    		else
    		{
    			s[1]=s[1]*a[i]%p;
    			s[0]=(s[0]+1)*a[i]%p;
    		}
    		ans=(ans+s[0]+s[1])%p;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

1.18

闲话

  • 早上 feifei 说借这次武大营的机会给我们讲了下各高校的强基政策:集训队直接报送清北;金/银牌+冬令营的一等约清北的笔试给满分,直接进入面试,视情况决定是否降一本线;对信奥比较友好的高校,金/银牌的笔试给满分,直接进入面试;对信奥不太友好的高校,金/银牌可以破格参加校测的笔试;铜牌、省一对信奥比较友好的高校还可能有点用,举了在香港大学的 @chuxiaoxiao 的例子。然后说这次武大营肯定是为了招生的,我们如果还打算去,就当是去体验了,但也要好好打。
  • 在机房补 whk
  • 因为一些原因,体活被取消了。
  • 晚上 feifei 和我们说因要给公益课的腾机房所以让我们去新机房补 whk ,顺便把机房里的书收拾一下。

做题纪要

luogu P11175 【模板】基于值域预处理的快速离散对数

[ABC389A] 9x9

  • 顺序结构。

    点击查看代码
    char a,b,c;
    cin>>a>>b>>c;
    cout<<(a-'0')*(c-'0')<<endl;
    

[ABC389B] tcaF

  • 循环结构。

    点击查看代码
    ll x,a=1,i;
    cin>>x;
    for(i=1;i<=100000;i++)
    {
    	a=a*i;
    	if(a==x)
    	{
    		cout<<i<<endl;
    		break;
    	}
    }
    

[ABC389C] Snake Queue

  • 维护和第一只蛇头部坐标的差。

    点击查看代码
    deque<pair<ll,ll> >q;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	ll n,pd,x,sum=0,i,j;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>pd;
    		if(pd==1)
    		{
    			cin>>x;
    			if(q.empty()==0)
    			{
    				q.push_back(make_pair(q.back().first+q.back().second,x));
    			}
    			else
    			{
    				q.push_back(make_pair(0,x));
    			}
    		}
    		if(pd==2)
    		{
    			q.pop_front();
    		}
    		if(pd==3)
    		{
    			cin>>x;
    			cout<<q[x-1].first-q.front().first<<endl;
    		}
    	}
    	return 0;
    }
    

[ABC389D] Squares in Circle

  • 双指针枚举某个方向。

    点击查看代码
    double work(double x,double y)
    {
    	return sqrt(x*x+y*y);
    }
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	double r;
    	ll ans=0;
    	cin>>r;
    	for(ll i=1,j=r;i<=r;i++)
    	{
    		while(j>=1&&work(i+0.5,j+0.5)>r)  
    		{
    			j--;
    		}
    		ans+=j;
    	}
    	ans=ans*4+4*(r-1)+1;
    	cout<<ans<<endl;
    	return 0;
    }
    

1.19

闲话

  • 早上体活正常。吃完早饭后就直接来新机房了。
    • 简记下新机房状况:双系统中只有 Win11 能用,有磁盘保护, VMwareWord,Excel,PPT 均需要激活,没有 WPS ,不确定虚拟机是否已经装好,没有 VsCode ,只有 DevC++ ;显示器可升降调节高度和角度;键盘略小(怀疑买成笔记本键盘了),空格长度正常, Windows 键旁边有 Fnpause 右上方有锁定按钮;惠普的鼠标、显示器、网线的 USB 接口较之前电脑有较大变化;两台教师机,投影仪卸了改成了和 HS 教室一样的 Win10 多媒体,需要外接键盘和鼠标。
  • 上午补课的时候 miaomiao 问了下补课进度,说等晚上再告诉我们具体考不考期末。
  • 下午 miaomiao 过来后跟我们说不用考期末了,但需要继续补 whk ,而且每考完半天需要去考场拿试卷,可能会让我们等补完课后 VP ,其中不 VP 语文和英语。听 feifeimiaomiao 说打算给零基础和初三的用。
  • 晚上回去收拾了下教室,因上次“考了但不算分”所以都在滏阳楼后面几个考场。

做题纪要

[ABC389F] Rated Range

  • 考虑将询问的 x 离线下来在升序排序后一起处理。

  • 观察到每次操作只有 +1,即其之间的相对大小关系不会发生变化,此时就只需要支持将值在 [l,r] 内的数加一,可以记录懒惰标记。

  • 线段树上二分找到端点或直接 FHQ-Treap 分裂出合法区间即可。

    点击查看代码
    int ans[300010],l[300010],r[300010];
    struct BST
    {
    	int root,rt_sum=0;
    	struct FHQ_Treap
    	{
    		int son[2],val,id,rnd,cnt,siz,lazy;
    	}tree[300010];
    	#define lson(rt) (tree[rt].son[0])
    	#define rson(rt) (tree[rt].son[1])
    	BST()
    	{
    		rt_sum=0;
    		srand(time(0));
    	}
    	int build_rt(int val,int id)
    	{
    		rt_sum++;
    		lson(rt_sum)=rson(rt_sum)=tree[rt_sum].lazy=0;
    		tree[rt_sum].val=val;
    		tree[rt_sum].id=id;
    		tree[rt_sum].rnd=rand();
    		tree[rt_sum].cnt=tree[rt_sum].siz=1;
    		return rt_sum;
    	}
    	void pushup(int rt)
    	{
    		tree[rt].siz=tree[lson(rt)].siz+tree[rson(rt)].siz+tree[rt].cnt;
    	}
    	void pushlazy(int rt,int lazy)
    	{
    		tree[rt].lazy+=lazy;
    		tree[rt].val+=lazy;
    	}
    	void pushdown(int rt)
    	{
    		pushlazy(lson(rt),tree[rt].lazy);
    		pushlazy(rson(rt),tree[rt].lazy);
    		tree[rt].lazy=0;
    	}
    	void split(int rt,int val,int &x,int &y)
    	{
    		if(rt==0) 
    		{
    			x=y=0;
    			return;
    		}
    		pushdown(rt);
    		if(tree[rt].val<=val)
    		{
    			x=rt;
    			split(rson(rt),val,rson(x),y);
    		}
    		else
    		{
    			y=rt;
    			split(lson(rt),val,x,lson(y));
    		}
    		pushup(rt);
    	}
    	int merge(int rt1,int rt2)
    	{
    		if(rt1==0||rt2==0)  return rt1+rt2;
    		pushdown(rt1);
    		pushdown(rt2);
    		if(tree[rt1].rnd<tree[rt2].rnd)
    		{
    			rson(rt1)=merge(rson(rt1),rt2);
    			pushup(rt1);
    			return rt1;
    		}
    		else
    		{
    			lson(rt2)=merge(rt1,lson(rt2));
    			pushup(rt2);
    			return rt2;
    		}
    	}
    	void insert(int val,int id)
    	{
    		int x,y;
    		split(root,val,x,y);
    		root=merge(merge(x,build_rt(val,id)),y);
    	}
    	void update(int l,int r)
    	{
    		int x,y,rt;
    		split(root,r,x,y);
    		split(x,l-1,x,rt);
    		pushlazy(rt,1);
    		root=merge(merge(x,rt),y);
    	}
    	void dfs(int rt)
    	{
    		if(rt==0)  return;
    		pushdown(rt);
    		ans[tree[rt].id]=tree[rt].val;
    		dfs(lson(rt));
    		dfs(rson(rt));
    	}
    }T;
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,m,x,i;
    	cin>>n;
    	for(i=1;i<=n;i++)  cin>>l[i]>>r[i];
    	cin>>m;
    	for(i=1;i<=m;i++)
    	{
    		cin>>x;
    		T.insert(x,i);
    	}
    	for(i=1;i<=n;i++)  T.update(l[i],r[i]);
    	T.dfs(T.root);
    	for(i=1;i<=m;i++)  cout<<ans[i]<<endl;
    	return 0;
    }
    

1.20

闲话

  • 翘掉了期末考试,仍去新机房补 whk
  • 众教练在商讨给新机房装灯和将旁边改造成他们的办公室的相关事宜,其中办公室的隔板是从 FY 搬来的。
  • 下午 miaomiao 说明天我们最多再补一上午课,因为下午要装灯,要是补不完课就去旁边的信息课机房接着补。
  • 吃完晚饭回机房的路上,碰见 huge 刚出来,跟我们说因为晚上只有他一个人值班,不方便来回转悠,遂让我们回到 505 补课,明天再搬回去。
  • 临下课时 huge 来转,问我们有没有在好好补课。

做题纪要

luogu P4306 [JSOI2010] 连通数

  • bitset 优化传递闭包。

    点击查看代码
    bitset<2010>f[2010];
    int main()
    {
    // #define Isaac
    #ifdef Isaac
    	freopen("in.in","r",stdin);
    	freopen("out.out","w",stdout);
    #endif
    	int n,ans=0,i,j,k;
    	char c;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			scanf(" %c",&c);
    			f[i][j]=c-'0';
    		}
    		f[i][i]=1;
    	}
    	for(k=1;k<=n;k++)
    	{
    		for(i=1;i<=n;i++)
    		{
    			if(f[i][k]==1)
    			{
    				f[i]|=f[k];
    			}
    		}
    	}
    	for(i=1;i<=n;i++)  ans+=f[i].count();
    	printf("%d\n",ans);
    	return 0;
    }
    
    
posted @   hzoi_Shadow  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
扩大
缩小
点击右上角即可分享
微信分享提示