H Z 游 记

Day -inf ~ Day -1

各种模你赛

各种暴毙

死的过程太惨,略

Day 1

某巨佬说过,日期没有第零天

十点五十火车开,十点半我才到/kk

路上追番,《约定的梦幻岛》好评

MTR睡得真香

下午到了衡水,直接开始上课《网络流》。。。

吃饭居然餐具自备……

坑了WCR怒刷50元整/kk

晚上

写。挂。调。烦。睡。

Day 2

早上调dinic,发现tot忘赋初始值了。。。

YS:“ZJJ为什么你随时都在笑啊”

中午:
“要不去小卖铺转转?”

two hours later……

“我*他****,怎么热成个****,******"

下午调dinic,发现加边写挂了。。。

预言:晚上调dinic,发现???

写了两道题就一直颓废,期间YS巨佬刷了2147483647道题。

小游戏与ypj的笑脸,永远一起出现 & & 永远一起消失……

Day 3

上午:构造

思维性强,可能是接下来几天唯一能听懂的

听懂了以后就有 ” 水黑 “ 可做了~~

(心声:怎么还不到吃饭时间啊,都颓废得想颓废了)

去恰饭。。。

没带饭卡,明天请YS吃午饭

晚:树形DP:

没有广播的快乐(

痛苦的回忆:《小胖守皇宫》

Day 4

忘了是day 几

spadeA261:“你可以写《Day ?》啊~~~”

Day ?

继续开始模拟赛暴毙

惨挂,T1少考虑半种情况,挂成10 pts ……

T2数据精心构造,放过了没读题就乱搞的大暴力。
(小样例没过,得分 30 pts)

众所周知,每题得分与做题时间成反比

顺一嘴,T2神题:分层图同余最短路

Day ?+1

终于有一天是赛后AK的了。。。

三道题两道都是玄学

T1:各种各样奇奇怪怪的算法都能获得 70~80 pts……

考场写的\(n ^{2} \ log\ n\),估分60~100,实际35……读错题了……出分后1分钟改成75……

T3:奇奇怪怪的不加任何优化的暴力,通过随机数列性质直接就可以A掉……加了个排序反而挂(?)成70……

T2:考场暴搜……一看排行榜人均20……

关于正解:

T1:\(meet \ in \ the \ middle\)
简直是模拟赛的宠儿……

\(2^{\frac{n}{2}}\)枚举并计算左子集,将(并不为零的)两两的差存入map 。

再来一个 \(2^{\frac{n}{2}}\) 枚举右子集,和左边的map配对即可。

记得加 vis 标记子集的并,重复的只算一次。

T2:题意转化很关键……

转化为DAG上拓扑序计数

但千万别往图论上想

直接简单DP即可,\(f _{i,j}\)表示前i个数,第i个数在前i个数中是第j小的。前缀和优化为 \(O(n^{2})\)

T3:\(random\_shuffle\)。。。拼阳寿。。。

Day ?+2

日常暴毙

好吧今天暴的更惨

T1 忘了 \(ans+1\) ,考场包另,赛后 \(1min\) 45pts。。。

T2 当你在考场上直接看出了正解,却发现不会正解的板子

于是水了个 \(bitset\) ,打算骗分跑路

但是懒得卡常

于是27pts。。。

考后一看我的测评记录:有输出,但没输出完就TLE了

于是cout -> printf
于是27pts -> 45pts

T3属实降智,入门级部分分直接送掉。。。

整场比赛,算上失智的分,一共挂了80

整整80分啊啊啊

Day ?+3

time : 21:32

状态:困死

T1:二分。函虽单峰,零决策优于前段决策。因此只需后段二分。

T2:dfs序。卡线段树。用区修单查的树数。

T3:类扫描线。枚左右。为去重,算贡时统计纵轴段段之间贡。

总结:我困死了,睁不开眼。

晚安。

Day ?+4

四个小时四道题……

心路历程:

开题。

看T1:显然是大贪心。放着完了再搞。
看T2:哇50分好香,一下就推出了 \(k=1\) 的杨辉三角。。。
看T3:弃。
看T4:觉得是扫描线裸题……
此时过去 \(1h\) ……
搞出了 \(T2\) 的暴力加组合数,然后发现模数不保证质数,写了个 \(n^2\) 递推……
然后发现已经过了 \(2h\) ,心态爆炸。
准备一个小时搞 \(T4\) ,一个小时搞 \(T1\)
没想到T4半个小时就弄出来了……
然后觉得手感爆棚,可能会翻盘
至此预估上 \(200pts\)
然后一个半小时搞T1贪心
本来极为精妙的一个想法,渐渐的成为了一个长达 \(3.3k\) 的宏篇巨制……
主要是最后 \(10min\) 发现贪错了。
然后觉得裂开。

出分:

T4挂成 \(10pts\)
T1有 \(60\) ,并不是很惨(不过据老们纷纷AC)……
T2 \(50pts\) 总算没有挂。
T3 果断 \(0pts\)

rk8……
可能大家都有挂分吧,我可能已经拿到了能力范围内的所有分数。
贪心,错了就是错了。
扫描线,不会写就是不会写。

题解:

(被T4卡住的盆友萌!!!这篇绝对好写!!!)
大体思路和 ycx&wcr 据老一致……
只不过好写一万倍。
不用push_down!!!只有两个标记!!!

  1. cv(cover):当前线段树结点被 整个 覆盖过多少次
  2. cl(color):当前结点被 整个 覆盖的颜色

把扫描线转化为三个基础问题求解:

  1. \(ask\),查找联通块并连边
  2. \(add\)
  3. \(del\)

关键在于一个 \(ask\) 函数:

因为只要询问区间与当前被覆盖的区间 有交集 就可以连边(而一般线段树回溯条件是当前区间是询问区间的 子集

所以就可以不用下传cover标记,因为 和大区间相交 等价于 与大区间的某子区间 相交。

具体看代码。

离散化是白给,请读者自行略过。

code
#include<bits/stdc++.h>
#define int LL
#define LL long long
using namespace std;
const int N=100005;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,cnt1,cnt2,qcnt,rcnt,ccnt,ro,co,cnt,ans;

int r1[N],r2[N],c1[N],c2[N];

int r[N<<1],c[N<<1];

int fa[N],vis[N];

int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}

#define rt 1,1,co+1
#define ls pos<<1,l,mid
#define rs pos<<1|1,mid+1,r
#define mid ((l+r)>>1)

int sum[N<<2],lz[N<<2],cl[N<<2],cv[N<<2];

void add(int pos,int l,int r,int ll,int rr,int num){
	if(ll>r||rr<l)return;
	if(ll<=l&&r<=rr){
		cv[pos]++;
		cl[pos]=num;
		return;
	}
	add(ls,ll,rr,num);add(rs,ll,rr,num);
}

void ask(int pos,int l,int r,int ll,int rr,int &num){
	if(ll>r||rr<l)return;
	if(cv[pos]){
		fa[num]=find(cl[pos]);
		num=fa[num];
		return;
	}
	if(l==r)return;
	ask(ls,ll,rr,num);ask(rs,ll,rr,num);
}

void del(int pos,int l,int r,int ll,int rr){
	if(ll>r||rr<l)return;
	if(ll<=l&&r<=rr&&cv[pos]){
		cv[pos]--;
		if(cv[pos]==0)cl[pos]=0;
		return;
	}
	del(ls,ll,rr);del(rs,ll,rr);
}


struct Q{
	int plc,op,l,r;
}q[N<<1];

bool ccc(Q a,Q b){
	if(a.plc==b.plc){
		if(a.op==1)return 1;
		else return 0;
	}
	return a.plc<b.plc;
}

signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		r[++rcnt]=r1[i]=read();c[++ccnt]=c1[i]=read();r[++rcnt]=r2[i]=read();c[++ccnt]=c2[i]=read();
	}
	sort(r+1,r+1+rcnt);sort(c+1,c+1+ccnt);
	ro=unique(r+1,r+1+rcnt)-r-1;co=unique(c+1,c+1+ccnt)-c-1;
	for(int i=1;i<=n;i++){
		r1[i]=lower_bound(r+1,r+1+ro,r1[i])-r;
		r2[i]=lower_bound(r+1,r+1+ro,r2[i])-r;
		c1[i]=lower_bound(c+1,c+1+co,c1[i])-c;
		c2[i]=lower_bound(c+1,c+1+co,c2[i])-c;
		q[++qcnt].plc=r1[i];
		q[qcnt].op=1;
		q[qcnt].l=c1[i];
		q[qcnt].r=c2[i];
		q[++qcnt].plc=r2[i];
		q[qcnt].op=0;
		q[qcnt].l=c1[i];
		q[qcnt].r=c2[i];
	}
	sort(q+1,q+1+qcnt,ccc);
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=qcnt;i++){
		int op=q[i].op,ll=q[i].l,rr=q[i].r;
		if(op){
			int num=++cnt;
			ask(rt,ll,rr,num);
			add(rt,ll,rr,num);
		}else{
			del(rt,ll,rr);
		}
	}
	for(int i=1;i<=cnt;i++){
		if(!vis[find(i)]){
			ans++;
			vis[find(i)]=1;
		}
	}
	cout<<ans<<endl;
	return 0;
}

晚上:

众望所归之下,终于迎来了颓废时间!!!!!!!!!!!!!!!!!!!!!!!

许久未见tarraria,再见时仿佛已经历了岁月的轮回。但却是如此熟悉的亲切……

许久未见hollow knight,再见是仿佛……

kao,还说什么说,操起键盘干就完事!!!

入坑星际II。

8、11

考场怒送60分。
\(T1\) max 初始值 && long long 80pts -> 20pts。。。

想起前几天一件事,忘了Day ?了……

episode 1:

wcr滑稽地走过来 : “zjj,写道《游戏》不?二项式繁衍。”
我 : “o。”
(打开洛谷,搜索“游戏”)
我(回头大喊):“WCR!哪个游戏了!!”
cyh经过,笑:“要颓也小声点……”
我:(无辜)“不是不是,我是说哪道题……”

episode 2:

wcr滑稽地走过来 : “zjj,游戏写完没~”
我 : (故作高深地)“wcr,我跟你讲,”
“我这个游戏啊,从\(20\%\)完成度到\(100\%\)完成度,就只加了一个 \(Mod\) 。 ”
指:从 \(\color{red}{WA\ 20pts}\)\(\color{green}{AC\ 100pts}\) ,只多写了一句%=mod

8/12

阳寿爆棚,怒拿 \(rk5\)

不过分数是 \(rk1\)\(\frac{1}{2}\) ……

考场

开题迟到。
又是四题同堂……
看T1:哦,数学题,再见。
看T2:哦,原题。

!!!???原题???!!!直接闭眼一通乱打搞上了队长快跑的未优化版。
轻松过掉小样例。
大样例就挂了。

调了半年,一读题: 任意顺序
再次崩掉,打了个 \(random\_shuffle\) 跑路(后来竟然有十分)

看T3:哦,原题。

!!!???又是原题???!!!

当年邓姐姐(还是G_keng?)讲的。

忘了一部分,一看题稍稍一想就弄懂了。
于是就切了。

看T4:应该不难。推了推,发现如果把“$”看做隔板,每一段区间都是确定的两种情况。

所以我们就有了一个 \(O(2^{n})\) 的做法。

所以我们考虑预处理加分别判断的形式 \(O(n)\) 处理。

然后写着写着不会了,就写了 \(O(n^2)\) 。。。

另,为了卡常,把 \(cin\) 改成了 \(read()\)\(getchar()\),又调了 \(10 min\)

然后搞T1,忘了 恶心gcd exgcd 怎么写。
考虑 \(n^2\) 求扩欧。 为什么会有人考虑这玩意儿

出分。

\(160pts\)
T4 直接抱灵!!!
一看,输入挂了。复制下来测试点,本地是对的。
离谱,测试点里有空行。。。
把cin版代码一交,果然 \(65pts\)

T3切了。T1 \(50pts\)。T2 骗了十分。

。。。。。要是没有原题,直接炸开了好吧。。。。。。

而且T4是真的有毒。。。

下午改题倒是很轻松,主要还是因为有网。

有网才会有心情改题嘛。。。

然后发现 B站 上不去。百度图片也上不去(好像前几天还可以)。
求问读到这里的HZ据老:
封网是从多会开始的……

又困了,沽。

8、13?~8、15

三场模拟赛,懒得详细说,瞎写一些东西吧

这两天改题状态很差。\(\color{white}{主要是太颓了23333}\)

也许这两天模拟赛稍有进步?但是这不能说明实力上有了多大的长进。

码力还是不行,多刷刷数据结构题练手。

至于思路,也许确实拓宽了许多,不过还是要见更多的题。

更何况有的时候可以拿码力硬换思维题。。。可是我做不到啊。。。

8、16&&8、17

状态越来越差了。。。

完全不想改题,考试的时候还啥都不会。。。

可能是变懒了吧。。。

希望心情好的时候能高效地改题,低效的时候能干点啥也不好说。。。只要不被gan就好吧。。。

传说中的呼吸回血

8、18

WCR出品的3A大作

历时四个小时良心打造

《双人对战五子棋》,等你来玩!

8、21

吃麻辣烫。
差点吃不了,多亏了“正好下饭”的jc ~~~ :)

关于T2《蛇》的样例点:

zjjjjjjzzjjjjjjzzzzzzzzzjjjjjzzzzzzjjjzzzjjjzzjjzzjjjzzzzjzzzzzjjjjzzjjjjj
不愧是我

8、22

分块和莫队和tetris的一天。
根号算法,不愧是“优雅的暴力”
众所周知,一份暴力可以调一下午

颓,不想改题……
记得luogu上有个帖子,说颓的不行能干点啥
回答有一个是“学习新算法”
嗯,算是把这段时间充分地浪费了……

8、23

发现了新的颓废神器

也许是暑假最后一次模拟赛了……(好吧并不是)

因为懒,就写写题解吧。

T1 署漱

\(0\ pts\) 做法:在100pts做法里加上freopen。点名WCR。

期望得分:\(100\ pts\)
实际得分:\(0\ pts\)

\(100\ pts\)做法:大力贪心。一道大水题我怎么扯这么多

T2 竖恕

容斥题。

经典套路:

  1. 转化为容斥方程形式
  2. 根据容斥后的式子设计dp状态或思考组合数含义
  3. 根据转化后的题意列转移方程
  4. 继续想
  5. 再想
  6. 想nm,下一题。

回到本题。
题目要求“一条都不满足的方案数”,我们就转化成“满足x条的方案数”。

由此设计出dp状态: \(dp_{u,k}\) 表示以u为根的子树內,满足k条边(或不满足k条边)的方案数。

不难发现这是一个树形背包。

然后继续分析题意,突然灵光一闪觉得他不满足的限制之间,是不相交的链的形式

然后感性理解一波,觉得我觉得是对的。

可以根据每条限制的特点,添加一个维度变成类似于插头的玩意儿:

\(dp_{u,k,0}\) 表示u节点不连边
\(dp_{u,k,1}\) 表示u节点连的边向上
\(dp_{u,k,2}\) 表示u节点连的边向下
\(dp_{u,k,3}\) 表示u节点作为一条链的中转点,有连上来的也有连下去的。

然后就可以转移了。

T3 蜀墅
毒瘤题。一堆操作。懒得讲什么的,我又不会。

T4
毒瘤题。一堆式子。懒得讲什么的,我又不会。

8、24

又有比赛。

T1线性筛老是忘记那个保证线性的break条件。。。

if(i%prm[j]==0)break;

T2 dp+前缀和优化+矩阵快速幂优化

(此处和 @yubai 的做法一样)

首先考虑\(O(n)\)求出本质不同子序列的数量

对于每一个字符,接到任意字符串后面都可以构成新的字符串。

但是需要去重,发现当前字符上一次出现位置以前的字符串,再接当前字符都是重复的。

所以列出式子:

\[dp_x=\sum_{i=pre_{x}}^{x-1} dp_i \]

其中\(pre_i\)表示i位置的字符上一次出现的位置。

前缀和优化一下,

\[dp_x=2*dp_{x-1}-dp_{pre_x-1} \]

然后就可以愉快的拿到m=0的部分分。

那么如何构造n+1~m的部分呢?

观察这个式子,可以发现\(pre_i\)越小答案越大。
然后就可以提出一个大胆的猜想:
把k个数按照最后一次出现的位置从小到大排序,从n顺次往后放
通过打表验证,发现是对的。
然后就可以拿到 \(78pts\) 的好成绩。

考虑m=1e18,可能是数学,因为后面\(pre_i\)都等于k。
然后就止步于此了。。。

其实还可能就是递推,不过需要优化成\(\log\)复杂度。
那就矩阵快速幂啊

考虑构造初始矩阵(向量)和转移矩阵。

初始矩阵中需要包含需要转移的全部信息,

\[\begin{bmatrix} f_{i}\\ f_{i-1}\\ ...\\ f_{i-k-1}\\ \end{bmatrix}\]

这个长为k+1的向量足够。

那么如何转移到

\[\begin{bmatrix} f_{i+1}\\ f_{i}\\ ...\\ f_{i-k}\\ \end{bmatrix}\]

呢?
观察递推式,发现\(f_{i+1}\)只和\(f_i\)\(f_{i-k-1}\)有关
于是第一行可以轻松搞定:
\(a_{1,1}=2\)
\(a_{1,k+1}=-1\)
至于之后的部分,直接由下一行转移。
\(a_{i,i+1}=1\)
也就是

\[\begin{bmatrix} 2& 0& 0& -1\\ 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1&0 \end{bmatrix}\]

也就是

\[\begin{bmatrix} f_{i}\\ f_{i-1}\\ ...\\ f_{i-k-1}\\ \end{bmatrix} \times \begin{bmatrix} 2& 0& 0& -1\\ 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1&0 \end{bmatrix} =\begin{bmatrix} f_{i+1}\\ f_{i}\\ ...\\ f_{i-k}\\ \end{bmatrix} \]

然后就可以愉快的RE掉这道题
至今没有发现是哪里挂了

T3咕了,不会
线段树亿生之敌
大概是维护一个\(kx+b\)之类的东西

posted @ 2021-08-08 20:12  大不美列坚  阅读(5643)  评论(7)    收藏  举报