高一上十月中旬日记

10.11

闲话

  • @Estelle_N@5k_sync_closer@int_R@K8He 搬来我们机房了。
  • 上午 \(7:30 \sim 11:30\) 打 accoders NOI 的模拟赛。
  • 下午到机房后放 @xyin 的每日一歌《沉溺》,然后听多校的讲题。讲完题后被 \(huge\) \(D\) 了下昨天晚上讲题后半段太乱了,让我们(尤指高一的)不要聚堆聊天。
  • 详见 2024 CSP-S 游记 10.11
  • 开完动员会就让我们回来了。回来后 \(miaomiao\) 提议让我们也跟着下去活动活动,在得知我们一周只有一节体育课且还在周三上午(另外一节被艺术课占了)后说那就周六体活时间增长至 \(17:00 \sim 19:00\) ,让我们活动活动。在 \(miaomiao\)\(CSP-S\) 二轮的缴费后,又说自初三下学期开始他没有严格要求我们模拟赛改题和专题进度的问题,让我们自己合理规划,而隔壁 \(huge\) 在召开“小班会”。

做题纪要

CF573B Bear and Blocks

P359. 好数(number)

P360. SOS字符串(sos)

P361. 集训营的气球(balloon)

P362. 连通子树与树的重心(tree)

10.12

闲话

  • 侯操时得知了明天下午第八、九节课是高校校园行活动,晚上我们 \(18:00\) 吃饭, \(18:25\) 在操场指定位置集合进行给来做报告的老师进行团体操表演。
  • 上午 \(7:30 \sim 11:30\) 打 accoders NOI 的模拟赛。
  • 下午放 @lxyt_415x 的每日一歌《动物世界》,然后听多校的讲题。讲题的时候 \(huge\) 坐在前面盯着我们, \(feifei\) 坐在后面盯着我们。讲完题后 \(huge\) 让我们找隔壁班问问我们什么时候上体育课,貌似几个教练之间的沟通不太具有时效性。
  • 体活 \(miaomiao\) 本来是让我们 \(17:00\) 开始上的,但因为其他高一的 \(17:25\) 才开始上体活,遂 \(feifei,field\)\(miaomiao\) 问我们什么时候开始上,得到的回复是让 \(17:25\) 开始上。体活开始后先去了趟书店买书,回来时在机房楼下碰见 @APJifengc@Estelle_N 在聊天,简单唠了几句关于运动会的事情,然后就上楼把 @int_R 拉下来一起聊天了。吃完晚饭众人又跟着 @APJifengc 在校园里乱逛、聊天。
  • 晚上回宿舍后得知我们不用考一调了,赢麻了。

做题纪要

牛客 NC277168 连分数

  • \(f(n)\)\(f(n-1)\) 来说在分母处多了个 \(\frac{1}{a}\) 。在 \(x\) 趋近于无穷的情况下,这个影响可以忽略不计,故有 \(x=a+\frac{1}{x}\) ,解得 \(x=\frac{a \pm \sqrt{a^{2}+4}}{2}\)

    点击查看代码
    int main()
    {
    	int t,i;
    	double a;
    	cin>>t;
    	for(i=1;i<=t;i++)
    	{
    		cin>>a;
    		printf("%.12lf\n",(a+sqrt(a*a+4))/2);
    	}
    	return 0;
    }
    

P363. 小 Z 的手套(gloves)

luogu P7230 [COCI2015-2016#3] NEKAMELEONI

P364. 小 Z 的字符串(string)

[ABC375A] Seats

[ABC375B] Traveling Takahashi Problem

[ABC375D] ABA

[ABC375E] 3 Team Division

10.13

闲话

  • 因为是考试周,所以早上没有体活,要求 \(6:20\) 到班准备公共早读,起床后遂直接去机房了。隔壁高二的早上有体活,所以没有教练来盯班。
  • 上午 \(feifei\) 说今天多校的安排是写 数学1(容斥、组合数学、期望) ,明天打完学校模拟赛后会在晚上进行讲题。
  • 下午到机房后 \(4\) 台教师机仅有 \(miaomiao\) 的开着显示屏,误认为剩下的都关机了,而且 \(feifei\) 到位到的比我都晚,因“社恐”没去找 \(feifei\) 放我的每日一歌《回到奥奇》。
  • 高校校园行安排在了第八、九节课, \(feifei\) 说让我们自愿参加,且仅能在第八节课去听,但估计他自己都不知道第八、九节课什么时候上/下课,毕竟 \(15:35\) 校园里人就开始四处乱跑了,他还让我们 \(15:45\) 才下去。跟着 @K8He@jijidawang@5k_sync_closer 去西扩听复旦的宣讲去了,在教室里遇见了 @Flandres 。到教室旁的时候里面人已经很多了,但后门还有点位置,遂挤了进去,然后发现位置太靠后了且前面的人有点高,过了一会儿发现 @DanhengYinyue@AqrDAD 从前门挤了进来。做宣讲的老师讲了下复旦校名由来,部分校史,国家给予的政策和任务,学生培养理念(以“自由”为主,包括但不限于医学系和非医学系在内的自由转专业),优秀的师资、场馆、伙食和丰富的课外生活,地理位置优越(距离多家网络公司本部较近,方便学生实习),部分高精尖专业给予的政策和条件。因时间有点紧张遂招生政策只是略微提了一嘴,纯 \(whk\)\(670+\) ,结束后得知通过 @DanhengYinyue@AqrDAD 与他的交谈感觉不太像招生办的老师,至少不是计算机专业。
  • 临吃晚饭的时候 \(feifei\) 重复了下昨天早操时的通知,让我们 \(18:00\) 去吃饭,需要跳团体操的同学 \(18:25\) 到操作指定地点跳操然后回教室收拾考场,其他人直接回教室收拾考场。吃完晚饭往操场走的路上发现他们 \(18:00\) 左右已经开始跳了,我们到的时候基本已经跳完了,遂直接回教室收拾了趟书。我的桌子上有一摊不知道谁的资料且成分复杂,而且近几天发的学案、自助、作业啥都没有。不想考完一调再回来收拾考场故把除杂课、政史地外的书搬到机房了。
  • 晚上 \(feifei\)\(ftp\) 里放了几篇读物,懒得挂链接了。

做题纪要

[ABC375G] Road Blocked 2

[ABC375F] Road Blocked

[ABC375C] Spiral Rotation

CF665E Beautiful Subarrays

  • 考虑固定右端点 \(r\) ,统计 \(l \in [1,n]\) 中满足 \(sum_{r} \bigoplus sum_{l-1} \ge k\) 的数量。

  • 设当前二进制表示下 \(k\) 的第 \(i\) 位为 \(k_{i}\)\(sum_{r}\) 的第 \(i\) 位为 \(sum_{r,i}\)

  • \(k_{i}=1\) 则必须走向 \(sum_{r,i} \bigoplus 1\) 方向的子树。否则, \(sum_{r,i} \bigoplus 1\) 方向的子树内的所有节点都合法可以直接加上,另一方向上的子树内的节点大小关系不确定需要继续往下走。

  • 当走到叶子节点时需要加上异或和 \(=k\) 的情况。

    点击查看代码
    struct Trie
    {
    	int son[32000010][2],cnt[32000010],rt_sum;
    	void insert(int s)
    	{
    		int x=0;
    		for(int i=30;i>=0;i--)
    		{
    			if(son[x][(s>>i)&1]==0)
    			{
    				rt_sum++;
    				son[x][(s>>i)&1]=rt_sum;
    			}
    			x=son[x][(s>>i)&1];
    			cnt[x]++;
    		}
    	}
    	ll query(int s,int k)
    	{
    		ll ans=0;
    		int x=0;
    		for(int i=30;i>=0;i--)
    		{
    			if((k>>i)&1)
    			{
    				x=son[x][((s>>i)&1)^1];
    			}
    			else
    			{
    				ans+=cnt[son[x][((s>>i)&1)^1]];
    				x=son[x][(s>>i)&1];
    			}
    			if(x==0)
    			{
    				break;
    			}
    		}
    		return ans+cnt[x];//加上等于 k 的贡献
    	}
    }T;
    int main()
    {
    	int n,k,sum=0,x,i;
    	ll ans=0;
    	cin>>n>>k;
    	T.insert(0);
    	for(i=1;i<=n;i++)
    	{
    		cin>>x;
    		sum^=x;
    		ans+=T.query(sum,k);
    		T.insert(sum);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

P366. 异或区间(xor)

luogu P4755 Beautiful Pair

  • \(a_{l}a_{r} \le \max\limits_{i=l}^{r} \{ a_{i} \}\) 转化为 \(a_{l} \le \frac{\max\limits_{i=l}^{r} \{ a_{i} \}}{a_{r}}\)

  • 后面的做法基本同 P366. 异或区间(xor) ,原可持久化 \(01Trie\) 换成主席树即可。

    点击查看代码
    int a[100010],l[100010],r[100010];
    stack<int>s;
    struct PDS_SMT
    {
    	int root[100010],rt_sum=0;
    	struct SegmentTree
    	{
    		int ls,rs,sum;
    	}tree[100010<<5];
    	#define lson(rt) (tree[rt].ls)
    	#define rson(rt) (tree[rt].rs)
    	int build_rt()
    	{
    		rt_sum++;
    		lson(rt_sum)=rson(rt_sum)=tree[rt_sum].sum=0;
    		return rt_sum;
    	}
    	void update(int pre,int &rt,int l,int r,int pos)
    	{
    		rt=build_rt();
    		tree[rt]=tree[pre];
    		tree[rt].sum++;
    		if(l==r)
    		{
    			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);
    		}
    	}
    	int query(int rt1,int rt2,int l,int r,int x,int y)
    	{
    		if(x<=l&&r<=y)
    		{
    			return tree[rt2].sum-tree[rt1].sum;
    		}
    		int mid=(l+r)/2,ans=0;
    		if(x<=mid)
    		{
    			ans+=query(lson(rt1),lson(rt2),l,mid,x,y);
    		}
    		if(y>mid)
    		{
    			ans+=query(rson(rt1),rson(rt2),mid+1,r,x,y);
    		}
    		return ans;
    	}
    }T;
    int main()
    {
    	int n,pos,i,j;
    	ll ans=0;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		T.update(T.root[i-1],T.root[i],1,1000000000,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);
    	}
    	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);
    	}
    	for(i=1;i<=n;i++)
    	{
    		if(i-l[i]+1<r[i]-i+1)
    		{
    			for(j=l[i];j<=i;j++)
    			{
    				ans+=T.query(T.root[i-1],T.root[r[i]],1,1000000000,1,a[i]/a[j]);
    			}
    		}
    		else
    		{
    			for(j=i;j<=r[i];j++)
    			{
    				ans+=T.query(T.root[l[i]-1],T.root[i],1,1000000000,1,a[i]/a[j]);
    			}
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

luogu P11188 「KDOI-10」商店砍价

  • 手摸一下发现至多一次性删 \(6\) 个数。

  • 将操作 \(2\) 按位拆贡献后做 \(01\) 背包 \(DP\) 即可。

  • 正着处理比反着处理多带一个 \(6\) 的常数。

    点击查看代码
    ll v[20],cnt[20],f[2][15],pw[15];
    char s[100010];
    int main()
    {
    	ll c,t,n,ans,i,j,k,h;
    	scanf("%lld%lld",&c,&t);
    	for(i=0;i<=8;i++)
    	{
    		pw[i]=(i==0)?1:pw[i-1]*10;
    	}
    	for(h=1;h<=t;h++)
    	{
    		ans=0x7f7f7f7f7f7f7f7f;
    		scanf("%s",s+1);
    		n=strlen(s+1);
    		for(i=1;i<=9;i++)
    		{
    			cnt[i]=0;
    			scanf("%lld",&v[i]);
    		}
    		for(i=1;i<=n;i++)
    		{
    			cnt[s[i]-'0']++;
    		}
    		for(k=0;k<=min(n,8ll);k++)
    		{
    			memset(f,0x3f,sizeof(f));
    			f[0][0]=0;
    			for(i=1;i<=n;i++)
    			{
    				for(j=0;j<=min(i,k);j++)
    				{
    					f[i&1][j]=f[(i-1)&1][j]+v[s[i]-'0'];
    					if(j-1>=0)
    					{
    						f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j-1]+(s[i]-'0')*pw[k-j]);
    					}
    				}
    			}
    			ans=min(ans,f[n&1][k]);
    		}
    		printf("%lld\n",ans);
    	}
    	return 0;
    }
    

CF932E Team Work

10.14

闲话

  • 侯操时德育主任说了下今天考试的时间安排,中午延迟到了 \(12:05\) 吃饭。因为即将起雾,所以跑操取消了,让直接去教室。
  • 到机房后发现隔壁在上早读。过了一会儿 \(huge\) 进来了问我们怎么现在就来机房了,我们说 \(miaomiao\) 让跑完操就来机房。
  • 上午 \(7:30 \sim 11:30\) 打学校 \(OJ\) 的模拟赛。
  • 午饭到 \(12:00\) 就直接走了,到食堂发现高二的提前下来吃饭了。
  • 下午放 @oceans_of_stars 的每人一歌《我们会像风》。开始讲题的时候已经快 \(16:00\) 了。
  • 打晚饭铃时我们正打算跟着高二的一起去吃饭, \(huge\) 问我们高一正常几点吃饭,我们说 \(18:28\) 去吃饭,然后 \(huge\) 就让我们也跟着去吃饭了。
  • 晚上 \(huge\) 盯班时强调了下讨论时间和做题时间的界限,声称要打印张时间表贴在墙上但没有落实;多校没有组织讲题,可能是因为写题的人太少了(?)

做题纪要

luogu P3648 [APIO2014] 序列分割

  • 在切割方案确定的情况,切割顺序无关。

  • \(sum_{i}=\sum\limits_{j=1}^{i}a_{j}\)

  • \(f_{i,j}\) 表示前 \(i\) 个数中切割成了 \(j\) 个块的最大得分,状态转移方程为 \(f_{i,j}=\max\limits_{k=0}^{i-1} \{ f_{k,j-1}+sum_{k}(sum_{i}-sum_{k}) \}\) ,边界为 \(f_{0,0}=0\)

    • 对于某个块内的单个元素恰好只会与其他块内的任何一个元素恰好乘一次。
  • 去掉 \(\max\) ,有 \(\begin{cases} x=sum_{k} \\ y=f_{k,j-1}-sum_{k}^{2} \\ k=-sum_{i} \\ b=f_{i,j} \end{cases}\) ,其中横坐标 \(x\) 和斜率 \(k\) 都是单调递增的。

  • 交换 \(i,j\) 两维后进行斜率优化 \(DP\) 即可。

    点击查看代码
    ll a[100010],sum[100010],f[2][100010];
    int opt[210][100010];
    deque<ll>q;
    ll x(ll i)
    {
    	return sum[i];
    }
    ll y(ll i,ll j)
    {
    	return f[j&1][i]-sum[i]*sum[i];
    }
    void print(int x,int k)
    {
    	if(k==0)
    	{
    		return;
    	}
    	print(opt[k][x],k-1);
    	cout<<opt[k][x]<<" ";
    }
    int main()
    {
    	ll n,k,i,j;
    	cin>>n>>k;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		sum[i]=sum[i-1]+a[i];
    	}
    	for(j=1;j<=k;j++)
    	{
    		q.clear();
    		q.push_back(0);
    		f[j&1][0]=0;
    		for(i=1;i<=n;i++)
    		{
    			while(q.size()>=2&&(y(q[1],j-1)-y(q.front(),j-1))>=-sum[i]*(x(q[1])-x(q.front())))
    			{
    				q.pop_front();
    			}
    			opt[j][i]=q.front();
    			f[j&1][i]=f[(j-1)&1][q.front()]+sum[q.front()]*(sum[i]-sum[q.front()]);
    			while(q.size()>=2&&(y(q.back(),j-1)-y(q[q.size()-2],j-1))*(x(i)-x(q.back()))<=(y(i,j-1)-y(q.back(),j-1))*(x(q.back())-x(q[q.size()-2])))
    			{
    				q.pop_back();
    			}
    			q.push_back(i);
    		}
    	}
    	cout<<f[k&1][n]<<endl;
    	print(n,k);
    	return 0;
    }
    

T2203. 玩水 (water)

T2212. AVL 树

T2211. 暴雨

10.15

闲话

  • \(7:00\) 去吃饭,所以在 \(7:15\) 左右就回到了机房,然后发现下载下发文件需要下 \(5 \min\) 。然后 \(miaomiao\) 进来了说我们等 \(7:30\) 再开始打,学校 \(OJ\) 的下载速度还快点。
  • 上午 \(7:30 \sim 11:30\) 打 accoders NOI 的模拟赛。
  • 下午放 @hypixel_zhb666 的每日一歌《王妃》;然后听多校的讲题,讲完题 \(huge\) 就让隔壁高二的去上体育课了。
  • 下午 \(huge\) 说让我们明天做 数学1(容斥、组合数学、期望)搜索、模拟
  • 等高一正常考完一调后, \(miaomiao\) 跟我们说让回班收拾下考场,另外本周五、六我们教室被“征用”作为成人高考的考场了,所以不用收拾太多东西。回班后找寻了下自己的桌子但无果,椅子还是原来的的椅子,位置没变,但同桌变成了 @wang54321
  • 晚上有虫子在机房乱飞, \(miaomiao\) 让我们别管它,然后就掉在了 \(miaomiao\) 机箱后面。

做题纪要

luogu P5337 [TJOI2019] 甲苯先生的字符串

  • 多倍经验: CF222E Decoding Genome

  • \(f_{i,j}\) 表示处理到第 \(i\) 位时,第 \(i\) 位为字符 \(j\) 的方案数,状态转移方程为 \(f_{i,j}=\sum\limits_{k=1}^{26}[j,k 不相邻] \times f_{i-1,k}\)

  • 矩阵优化 \(DP\) 即可。

    点击查看代码
    const ll p=1000000007;
    char s[100010];
    struct Matrix
    {
    	ll ma[30][30];
    	Matrix()
    	{
    		memset(ma,0,sizeof(ma));
    	}
    }f,a;
    Matrix mul(Matrix a,Matrix b,ll n,ll m,ll k,ll p)
    {
    	Matrix c;
    	for(ll i=1;i<=n;i++)
    	{
    		for(ll j=1;j<=k;j++)
    		{
    			for(ll h=1;h<=m;h++)
    			{
    				c.ma[i][j]=(c.ma[i][j]+a.ma[i][h]*b.ma[h][j]%p)%p;
    			}
    		}
    	}
    	return c;
    }
    Matrix qpow(Matrix a,ll b,ll p,ll n)
    {
    	Matrix ans;
    	for(ll i=1;i<=n;i++)
    	{
    		ans.ma[i][i]=1;
    	}
    	while(b)
    	{
    		if(b&1)
    		{
    			ans=mul(ans,a,n,n,n,p);
    		}
    		b>>=1;
    		a=mul(a,a,n,n,n,p);
    	}
    	return ans;
    }
    int main()
    {
    	ll b,len,n=1,m=26,k=26,ans=0,i,j;
    	cin>>b>>(s+1);
    	len=strlen(s+1);
    	for(i=1;i<=26;i++)
    	{
    		f.ma[1][i]=1;
    		for(j=1;j<=26;j++)
    		{
    			a.ma[i][j]=1;
    		}
    	}
    	for(i=1;i<=len-1;i++)
    	{
    		a.ma[s[i]-'a'+1][s[i+1]-'a'+1]=0;
    	}
    	f=mul(f,qpow(a,b-1,p,m),n,m,k,p);
    	for(i=1;i<=26;i++)
    	{
    		ans=(ans+f.ma[1][i])%p;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

P374. 限速(speed)

P376. 距离(distance)

P375. 酒鬼 (drunkard)

10.16

闲话

  • 早操又被加圈了。
  • 跑完操到机房后 \(field\) 问我们是哪科早读,说我们整天都待在机房不上早读会不会不好,但并没有做出一些实质性措施(隔壁已经被要求上早读了)。
  • 下午放 @xrlong 的每日一歌《恋のうた(恋之歌)》。
  • 晚上听多校的讲 数学1(容斥、组合数学、期望)

做题纪要

luogu P11184 带余除法

  • 容易有 \(\begin{cases} kq \le kq+r=n \\ (k+1)q>n \end{cases}\) 得到 \(\left\lfloor \frac{n}{k+1} \right\rfloor < q=\frac{n-r}{k} \le \left\lfloor \frac{n}{k} \right\rfloor\) 。又因为 \(q\)\(r\) 一一对应,所以输出 \(\left\lfloor \frac{n}{k} \right\rfloor-\left\lfloor \frac{n}{k+1} \right\rfloor\) 即可。

  • 特判 \(k=0\) 时有 \(r=n\) ,故输出 \(1\)

    点击查看代码
    int main()
    {
    	ll t,n,k,i;
    	cin>>t;
    	for(i=1;i<=t;i++)
    	{
    		cin>>n>>k;
    		if(k==0)
    		{
    			cout<<1<<endl;
    		}
    		else
    		{
    			cout<<n/k-n/(k+1)<<endl;
    		}
    	}
    	return 0;
    }
    

luogu P11187 配对序列

  • \(f_{i,0/1}\) 表示以 \(a_{i}\) 结w尾且 \(a_{i}\) 出现在偶数/奇数个位置上的子序列最大长度。状态转移方程为 \(\begin{cases} f_{i,0}=\max\limits_{j=1}^{i-1}\{ [a_{j}=a_{i}] \times (f_{j,1}+1) \} \\ f_{i,1}=\max\limits_{j=1}^{i-1}\{ [a_{j} \ne a_{i}] \times (f_{j,0}+1) \}\end{cases}\)

  • 对着值域冲线段树优化 \(DP\) 即可。

  • 最终有 \(\max\limits_{i=1}^{n}\{ f_{i,0} \}\) 即为所求。

    点击查看代码
    int a[500010],f[500010][2],g[500010];
    struct SMT
    {
    	struct SegmentTree
    	{
    		int maxx;
    	}tree[2000010];
    	int lson(int x)
    	{
    		return x*2;
    	}
    	int rson(int x)
    	{
    		return x*2+1;
    	}
    	void pushup(int rt)
    	{
    		tree[rt].maxx=max(tree[lson(rt)].maxx,tree[rson(rt)].maxx);
    	}
    	void build(int rt,int l,int r)
    	{
    		if(l==r)
    		{
    			tree[r].maxx=0;
    			return;
    		}
    		int mid=(l+r)/2;
    		build(lson(rt),l,mid);
    		build(rson(rt),mid+1,r);
    		pushup(rt);
    	}
    	void update(int rt,int l,int r,int pos,int val)
    	{
    		if(l==r)
    		{
    			tree[rt].maxx=max(tree[rt].maxx,val);
    			return;
    		}
    		int mid=(l+r)/2;
    		if(pos<=mid)
    		{
    			update(lson(rt),l,mid,pos,val);
    		}
    		else
    		{
    			update(rson(rt),mid+1,r,pos,val);
    		}
    		pushup(rt);
    	}
    	int query(int rt,int l,int r,int x,int y)
    	{
    		if(x<=l&&r<=y)
    		{
    			return tree[rt].maxx;
    		}
    		int mid=(l+r)/2,ans=0;
    		if(x<=mid)
    		{
    			ans=max(ans,query(lson(rt),l,mid,x,y));
    		}
    		if(y>mid)
    		{
    			ans=max(ans,query(rson(rt),mid+1,r,x,y));
    		}
    		return ans;
    	}
    }T;
    int main()
    {
    	int n,ans=0,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	memset(g,-0x3f,sizeof(g));
    	T.build(1,1,500000);
    	for(i=1;i<=n;i++)
    	{
    		f[i][0]=max(f[i][0],g[a[i]]+1);
    		if(a[i]-1>=1)
    		{
    			f[i][1]=max(f[i][1],T.query(1,1,500000,1,a[i]-1)+1);
    		}
    		if(a[i]+1<=500000)
    		{
    			f[i][1]=max(f[i][1],T.query(1,1,500000,a[i]+1,500000)+1);
    		}
    		g[a[i]]=max(g[a[i]],f[i][1]);
    		T.update(1,1,500000,a[i],f[i][0]);
    	}
    	for(i=1;i<=n;i++)
    	{
    		ans=max(ans,f[i][0]);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

T2198. 传统题

luogu P3794 签到题IV

  • \(\gcd\)\(\operatorname{or}\) 在固定左端点的情况下至多会变化 \(O(\log V)\) 次。

  • \(\gcd\) 为例,考虑求出所有的四元组 \((l,r,x,val)\) 表示 \(\forall i \in [l,r],\gcd\limits_{j=i}^{x} \{ a_{j} \}=val\)

    • 本题中因为 \(x\) 一维可以“滚”掉,所以省去不写。
  • 具体地,枚举右端点 \(x\) ,类似单调栈的写法(本身是单调的),继承 \(x-1\) 的四元组并及时去重/重构栈。

  • 处理完后判断一下每个值区间是否有交求贡献即可。

    点击查看代码
    struct  node
    {
    	ll val,l,r;
    }g[500010],o[500010];
    ll a[500010],l[500010],r[500010],cnt_g,cnt_o;
    ll gcd(ll a,ll b)
    {
    	return b?gcd(b,a%b):a;
    }
    int main()
    {
    	ll n,k,ans=0,len,i,j;
    	cin>>n>>k;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=cnt_g;j++)
    		{
    			g[j].val=gcd(g[j].val,a[i]);
    		}
    		cnt_g++;
    		g[cnt_g]=(node){a[i],i,i};
    		len=0;
    		for(j=1;j<=cnt_g;j++)
    		{
    			if(g[j].val==g[j-1].val)
    			{
    				g[len].r=g[j].r;
    			}
    			else
    			{
    				len++;
    				g[len]=g[j];
    			}
    		}
    		cnt_g=len;
    		for(j=1;j<=cnt_g;j++)
    		{
    			l[g[j].val]=g[j].l;
    			r[g[j].val]=g[j].r;
    		}
    		for(j=1;j<=cnt_o;j++)
    		{
    			o[j].val|=a[i];
    		}
    		cnt_o++;
    		o[cnt_o]=(node){a[i],i,i};
    		len=0;
    		for(j=1;j<=cnt_o;j++)
    		{
    			if(o[j].val==o[j-1].val)
    			{
    				o[len].r=o[j].r;
    			}
    			else
    			{
    				len++;
    				o[len]=o[j];
    			}
    		}
    		cnt_o=len;
    		for(j=1;j<=cnt_o;j++)
    		{
    			if(l[o[j].val^k]!=0&&min(o[j].r,r[o[j].val^k])>=max(o[j].l,l[o[j].val^k]))
    			{
    				ans+=min(o[j].r,r[o[j].val^k])-max(o[j].l,l[o[j].val^k])+1;
    			}
    		}
    		for(j=1;j<=cnt_g;j++)
    		{
    			l[g[j].val]=r[g[j].val]=0;
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

luogu P5502 [JSOI2015] 最大公约数

  • 多倍经验: luogu P7009 [CERC2013] Magical GCD | UVA1642 魔法GCD Magical GCD

  • 同上题,取左端点更新即可。

    点击查看代码
    struct node
    {
    	ll val,l;
    }g[100010];
    ll a[100010],cnt_g;
    ll gcd(ll a,ll b)
    {
    	return b?gcd(b,a%b):a;
    }
    int main()
    {
    	ll n,ans=0,len=0,i,j;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=cnt_g;j++)
    		{
    			g[j].val=gcd(g[j].val,a[i]);
    		}
    		cnt_g++;
    		g[cnt_g]=(node){a[i],i};
    		len=0;
    		for(j=1;j<=cnt_g;j++)
    		{
    			if(g[j].val==g[j-1].val)
    			{
    				continue;
    			}
    			else
    			{
    				len++;
    				g[len]=g[j];
    				ans=max(ans,(i-g[j].l+1)*g[j].val);
    			}
    		}
    		cnt_g=len;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

CF475D CGCDSSQ

  • map 存下答案和上题一样做即可。

    点击查看代码
    struct node
    {
    	ll val,l,r;
    }g[100010];
    ll a[100010],cnt_g;
    map<ll,ll>ans;
    ll gcd(ll a,ll b)
    {
    	return b?gcd(b,a%b):a;
    }
    int main()	
    {
    	ll n,m,x,len=0,i,j;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=cnt_g;j++)
    		{
    			g[j].val=gcd(g[j].val,a[i]);
    		}
    		cnt_g++;
    		g[cnt_g]=(node){a[i],i,i};
    		len=0;
    		for(j=1;j<=cnt_g;j++)
    		{
    			if(g[j].val==g[j-1].val)
    			{
    				g[len].r=g[j].r;
    			}
    			else
    			{
    				len++;
    				g[len]=g[j];
    			}
    		}
    		cnt_g=len;
    		for(j=1;j<=cnt_g;j++)
    		{
    			ans[g[j].val]+=g[j].r-g[j].l+1;
    		}
    	}
    	cin>>m;
    	for(i=1;i<=m;i++)
    	{
    		cin>>x;
    		cout<<ans[x]<<endl;
    	}
    	return 0;
    }
    

集美大学第十一届校程序设计竞赛(同步赛) H 讨论组

  • 顺序结构。

    点击查看代码
    int main()
    {
    	int n;
    	cin>>n;
    	cout<<n/3<<endl;
    	return 0;
    }
    

集美大学第十一届校程序设计竞赛(同步赛) G 三点共线

  • 循环结构。

    点击查看代码
    int x[110],y[110];
    int main()
    {
    	int n,flag=0,i,j,k;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>x[i]>>y[i];
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=i+1;j<=n;j++)
    		{
    			for(k=j+1;k<=n;k++)
    			{
    				flag|=((y[i]-y[j])*(x[k]-x[j])==(y[k]-y[j])*(x[i]-x[j]));
    			}
    		}
    	}
    	if(flag==1)
    	{
    		cout<<"Yes"<<endl;
    	}
    	else
    	{
    		cout<<"No"<<endl;
    	}
    	return 0;
    }
    

集美大学第十一届校程序设计竞赛(同步赛) C 因子数小于等于4的个数

  • 线性筛筛出 \(d(n)\) 即可。

    点击查看代码
    int prime[1000010],vis[1000010],d[1000010],low[1000010],sum[1000010],len=0;
    void isprime(int n)
    {
    	memset(vis,0,sizeof(vis));
    	d[1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(vis[i]==0)
    		{
    			len++;
    			prime[len]=i;
    			d[i]=2;
    			low[i]=i;
    		}
    		for(int j=1;j<=len&&i*prime[j]<=n;j++)
    		{
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0)
    			{
    				low[i*prime[j]]=low[i]*prime[j];
    				if(i==low[i])
    				{
    					d[i*prime[j]]=d[i]+1;
    				}
    				else
    				{
    					d[i*prime[j]]=d[i/low[i]]*d[low[i*prime[j]]];
    				}
    			}
    			else
    			{
    				low[i*prime[j]]=prime[j];
    				d[i*prime[j]]=d[i]*d[prime[j]];
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		sum[i]=sum[i-1]+(d[i]<=4);
    	}
    }
    int main()
    {
    	int t,i,l,r;
    	cin>>t;
    	isprime(1000000);
    	for(i=1;i<=t;i++)
    	{
    		cin>>l>>r;
    		cout<<sum[r]-sum[l-1]<<endl;
    	}
    	return 0;
    }
    

集美大学第十一届校程序设计竞赛(同步赛) I 市场

  • 模拟。

    点击查看代码
    ll a[100010];
    int main()
    {
    	ll n,sum=0,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		sum+=abs(a[i]-a[i-1]);
    	}
    	sum+=abs(a[n]-0);
    	for(i=1;i<=n;i++)
    	{
    		cout<<sum-abs(a[i]-a[i-1])-abs(a[i+1]-a[i])+abs(a[i-1]-a[i+1])<<" ";
    	}
    	return 0;
    }
    

luogu P7914 [CSP-S 2021] 括号序列

CF908D New Year and Arbitrary Arrangement

10.17

闲话

做题纪要

[ARC185A] mod M Game 2

[ARC185B] +1 and -1

luogu P3345 [ZJOI2015] 幻想乡战略游戏

luogu P5311 [Ynoi2011] 成都七中

[ABC373F] Knapsack with Diminishing Values

  • 暴力
    • 分组背包写个常数小点的加 \(C++20\) 加手动开 \(O3\) 就过了(赛时直接把火车头粘上了),算下来 \(AT\) 神机能跑 \(1e10\)

      点击查看代码
      #include<bits/stdc++.h>
      #pragma GCC optimize(3)
      #pragma GCC target("avx")
      #pragma GCC optimize("Ofast")
      #pragma GCC optimize("inline")
      #pragma GCC optimize("-fgcse")
      #pragma GCC optimize("-fgcse-lm")
      #pragma GCC optimize("-fipa-sra")
      #pragma GCC optimize("-ftree-pre")
      #pragma GCC optimize("-ftree-vrp")
      #pragma GCC optimize("-fpeephole2")
      #pragma GCC optimize("-ffast-math")
      #pragma GCC optimize("-fsched-spec")
      #pragma GCC optimize("unroll-loops")
      #pragma GCC optimize("-falign-jumps")
      #pragma GCC optimize("-falign-loops")
      #pragma GCC optimize("-falign-labels")
      #pragma GCC optimize("-fdevirtualize")
      #pragma GCC optimize("-fcaller-saves")
      #pragma GCC optimize("-fcrossjumping")
      #pragma GCC optimize("-fthread-jumps")
      #pragma GCC optimize("-funroll-loops")
      #pragma GCC optimize("-fwhole-program")
      #pragma GCC optimize("-freorder-blocks")
      #pragma GCC optimize("-fschedule-insns")
      #pragma GCC optimize("inline-functions")
      #pragma GCC optimize("-ftree-tail-merge")
      #pragma GCC optimize("-fschedule-insns2")
      #pragma GCC optimize("-fstrict-aliasing")
      #pragma GCC optimize("-fstrict-overflow")
      #pragma GCC optimize("-falign-functions")
      #pragma GCC optimize("-fcse-skip-blocks")
      #pragma GCC optimize("-fcse-follow-jumps")
      #pragma GCC optimize("-fsched-interblock")
      #pragma GCC optimize("-fpartial-inlining")
      #pragma GCC optimize("no-stack-protector")
      #pragma GCC optimize("-freorder-functions")
      #pragma GCC optimize("-findirect-inlining")
      #pragma GCC optimize("-fhoist-adjacent-loads")
      #pragma GCC optimize("-frerun-cse-after-loop")
      #pragma GCC optimize("inline-small-functions")
      #pragma GCC optimize("-finline-small-functions")
      #pragma GCC optimize("-ftree-switch-conversion")
      #pragma GCC optimize("-foptimize-sibling-calls")
      #pragma GCC optimize("-fexpensive-optimizations")
      #pragma GCC optimize("-funsafe-loop-optimizations")
      #pragma GCC optimize("inline-functions-called-once")
      #pragma GCC optimize("-fdelete-null-pointer-checks")
      using namespace std;
      #define ll long long 
      #define ull unsigned long long
      #define sort stable_sort 
      #define endl '\n'
      ll w[3010],v[3010],f[2][3010];
      int main()
      {
      	ll n,m,ans=0,i,j,k;
      	cin>>n>>m;
      	for(i=1;i<=n;i++)
      	{
      		cin>>w[i]>>v[i];
      	}
      	for(i=1;i<=n;i++)
      	{
      		for(j=1;j<=m;j++)
      		{
      			f[i&1][j]=f[(i-1)&1][j];
      		}
      		for(k=1;k*w[i]<=m;k++)
      		{
      			for(j=k*w[i];j<=m;j++)
      			{
      				f[i&1][j]=max(f[i&1][j],f[(i-1)&1][j-k*w[i]]+k*v[i]-k*k);
      			}
      		}
      	}
      	for(i=1;i<=m;i++)
      	{
      		ans=max(ans,f[n&1][i]);
      	}
      	cout<<ans<<endl;
      	return 0;
      }
      

[ABC366G] XOR Neighbors

CF341D Iahub and Xors

posted @ 2024-10-10 21:40  hzoi_Shadow  阅读(70)  评论(0编辑  收藏  举报
扩大
缩小