寒假训练日记

12.4

杭州站,不在学校,没报上qwq

白马湖组队打了,竟然打不过钱学森,老学长从棺材里气起来了!

但苏中三个菜鸡连白马湖都打不过。。。。

12.?

没想到今年NOIP分这么低,好吧,混了个省一

可以安心滚去期末考了

另外Orz CXY 335

Orz Little09 267

Orz 5ab 220

12.15

突发疫情,回家

期末考延后到下学期初,与开学考合并

12.16

上网课了,vp了2022icpc西安站

woc这个J怎么这么快有人过

Emmmm?看起来不是很好做啊?

En,确实我傻逼了,切了

woc这个C不是更傻逼吗,切了

woc这个F不是更傻逼吗,切了

woc这个E不是也傻逼吗,可是我选了一种非常傻逼的写法,然后罚了N发

woc这个G很好写啊我为啥不先开,我是傻逼,切了

woc,我怎么不会做这个L啊啊啊啊

woc,我怎么会做这个B啊啊啊啊

woc这个B怎么调不出来啊啊啊啊

单挑,没带板子,打铁,自闭

L题解:

如果只有2操作,那答案就是深度最大值

事实上,把所有长链拉出来,相同深度的点显然没有祖先关系,那答案就是最长长链的长度

1操作实际上就是拉出前i长的链

ans=min(ans,(i-1)+Pi) Pi表示第i条的链长

(话说感觉长剖在icpc里也挺常见的)

B题解:

套路题,在第k轮增广中,i->j流一次表示(i,j)被填上k这个数字

好像是一整年没练了吧,调不出来也正常

但reginal里的流题确实都是简单的

A题解:

LCT板子题,但是没开qwq

写作业 背单词

过几天又要上网课了,可能XCPC的vp要停一段时间

过段时间就vp高考题好了。

从2021浙江卷开始,一天数学一天物理,vp过程也会发在这里

12.17

过几天又要上网课了,可能XCPC的vp要停一段时间

所以今天先再vp一场,v个CCPC吧

绵阳站,打得太差自闭了,在这里就不放了

多考虑一些等价情况,不要瞎猜结论贪心啊

感觉CCPC分站赛难度高一点,思维能力还是不够啊

多做点CF吧

https://www.bilibili.com/video/BV1P14y1n73z/

如果抛开冗长的英文题面,题目质量还是挺高的,只不过对我这种还没适应XCPC签到题的傻逼来说参赛体验不太好

12.18

人生第三场XCPC正式比赛,南京站,rp++

然后另外俩菜鸡又是拿了块铜,气死!

心情很差,颓了一个上午,

下午收拾了一下心情,vp ZJ 2021 数学卷

明天开始

周一到周四 做物理五三和数竞模拟题

周五写作业

周六CCPC

周日ICPC

如果身体允许,两周之内这个计划一天都不能停

直至12.31我生日那天,会有新的安排

(upd on 12.29:结果这个计划一天都没执行)

woc怎么选择T10都不会啊啊啊

选填还是要行云流水的,不然做最后一小题真的没时间

12.19

阳了,网课咕掉了

vp延期

12.20-12.27

全是网课

12.28

学习各种上下界网络流

12.29

学习SAM

假期里要疯狂vp CCPC

尽量在九点钟能坐在电脑前面开始vp吧

做五个小时,到14点结束,17点左右要把题解看懂、把有价值的题补掉

然后晚上做物理五三+背单词

12.30

12.31

生快!

SAM,终于。。。大概。。。应该。。。可能。。。也许。。。看懂了吧

写的蛮详细的:

https://zhuanlan.zhihu.com/p/410131141

1.1

学AC自动机,感觉理解深了一些

还学了SG函数

1.2-1.5

学算法,见B站

1.6

搞语文作业

还搞了研究性学习,但没搞完

1.7

回了趟杭州,补研究性学习

1.8

研究性学习基本完成,告一段落

1.9

补动量能量综合提高练习

任务很重,加油!

没补完

1.10

终于tm补完了

打了CF,脑子不灵清,自闭了

这里写一下题解:

C: 只有logn种可能,第cnt个可能的x是n进行while(cnt--)n-=lowbit(n)后的,按位考虑即可,细节有点多,建议草稿纸上弄清楚再写上去

D:太套路了,又是每个点连质因数跑爆搜,ChineseRound,可惜没时间

E:太套路了,又是转前缀和,然后正负数分开考虑,做NOIP2018D1T1

F:心情不好,懒得看

C题写了一个多小时,太不应该了!

以后打XCPC,这种比较烦的数学题都丢给fyc好了

掉了10rating,气死

1.11

vpCCPC2022广州站

I:

树形DP,总结一下套路:

void dfs(int u,int fa){
	int i,j,k;sz[u]=1;
	//f:不考虑初始点时的贡献
	// g:考虑初始点时的贡献 
	f[u][1]=p[u];g[u][1]=a[u]*iS%mod; 
	for(i=h[u];i;i=nxt[i]){
		int v=to[i];
		if(v!=fa){
			dfs(v,u);
			for(j=sz[u];j>=0;j--)f1[u][j]=f[u][j],g1[u][j]=g[u][j],f[u][j]=g[u][j]=0;
			for(j=sz[u];j>=0;j--){
				for(k=sz[v];k>=0;k--){
					if(!j&&!k)continue;
					f[u][j+k]+=f1[u][j]*f[v][k]%mod;
					g[u][j+k]+=g1[u][j]*f[v][k]%mod;
					if(k)g[u][j+k]+=g[v][k]*f1[u][j]%mod; 
					f[u][j+k]%=mod;
					g[u][j+k]%=mod;
				}
			}
			sz[u]+=sz[v];
		}
	}
	f[u][0]=g[u][0]=(mod+1-p[u])%mod;//u的父亲拿不到u这个点 
	for(i=1;i<=sz[u];i++)ans[i]=(ans[i]+g[u][i]*(mod+1-p[fa])%mod)%mod;
}

C:

把图分层是个好办法,我只看最短路dis[u]

For all u->v ,dis[v]必须相等,并查集到一块,缩点

缩完点后重新跑一遍bfs,求出Dis,对于边(x,y),其边权赋成(Dis[y]-Dis[x])即可

const int N = 5e5 + 10;
int n,m,f[N],d[N],dp[N];
vector <int> G[N],buc[N];
vector <pii> edg;

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

void solve() {
    read(n,m);
    for (int i = 1;i <= n;++i) f[i] = i,G[i].clear(),buc[i].clear(),d[i] = dp[i] = 0;
    edg.clear();
    for (int i = 1;i <= m;++i) {
        int x,y;read(x,y);edg.push_back(mp(x,y));
        G[y].push_back(x);
    }
    for (int x = 1;x <= n;++x) {
        for (auto y : G[x]) {
            f[find(y)] = find(G[x][0]);
        }
    }
    for (auto e : edg) {
        int x = e.first,y = e.second;
        buc[find(x)].emplace_back(find(y));
        d[find(y)]++;
    }
    int cnt = 0;
    queue <int> q;
    for (int i = 1;i <= n;++i) {
        //printf("%d %d\n",find(i),i);
        if (find(i) == i) {
            ++cnt;
            if (!d[i]) {
                q.push(i);dp[i] = 1;
            }
        }
    }
    while (!q.empty()) {
        int x = q.front();q.pop();
        --cnt;
        for (auto y : buc[x]) {
            dp[y] = max(dp[y],dp[x] + 1);
            if (!--d[y]) {
                q.push(y);
            }
        }
    }
    if (cnt) puts("No");
    else {
        puts("Yes");
        for (int i = 1;i <= n;++i) {
            int ans = dp[find(i)];
            if (i != 1) ans -= dp[find(G[i][0])];
            printf("%d ",ans);
        }
        puts("");
    }
}

M:

奇特的数位dp,其实就是记搜+剪枝

从高位往低位填

dp(i,s,cnt) 表示第i位,当前已经有s个数达到了上界,还要至少cnt个当前位才能达到n(不考虑低位的余数)

加个剪枝:如果后面全填1都达不到n,就退出

为啥这样就过了呢?

因为每位只能取81个,这么剪完之后,相当于如果剩了多于162个当前位就肯定达不到n了。

所以实际上只有162klogn种状态,转移是k^2的,刚好能过

(其实写记搜算复杂度就用正常dp方式算一遍就行了,甚至很多时候你不用管复杂度和常数,因为出题人就是这么做的)

int a[105];
int n, m, k;
map<int, int>dp[105][105];
int dfs(int cur, int s, int lv) {
    if (lv < 0)return 0;
    if (cur < 0)return lv == 0;
    int s1 = k / 2, s0 = k - s1;
    if (((1ll << cur + 1) - 1) * s0 * s1 < lv)return 0;
    if (dp[cur][s].count(lv))return dp[cur][s][lv];
    int res = 0;
    if (a[cur] == 1) {
        for (int i = 0; i <= s; i++) {
            for (int j = 0; j <= k - s; j++) {
                int val = 1ll * (k - i - j) * (i + j) * (1ll << cur);
                int t = c[s][i] * c[k - s][j] % mod;
                res += t * dfs(cur - 1, i, lv - val) % mod;
                res %= mod;
            }
        }
    }
    else {
        for (int i = 0; i <= 0; i++) {
            for (int j = 0; j <= k - s; j++) {
                int val = 1ll * (k - i - j) * (i + j) * (1ll << cur);
                int t = c[s][i] * c[k - s][j] % mod;
                res += t * dfs(cur - 1, s, lv - val) % mod;
                res %= mod;
            }
        }
    }
    return dp[cur][s][lv] = res;
}
void slove() {
    c[0][0] = 1;
    c[1][0] = c[1][1] = 1;
    for (int i = 2; i <= 100; i++) {
        c[i][0] = 1;
        for (int j = 1; j <= 100; j++) {
            c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
        }
    }
    cin >> n >> m >> k;
    int t = m, id = 0;
    while (t)a[id++] = t % 2, t /= 2;
    id--;
    cout << dfs(id, k, n) << endl;
}

1.12

CCPC威海,打得好累qwq

数论找规律能力有待加强

博弈题总结一下,把我和对手想象成一个人,这个人不断用尽可能苟住的方式操作,答案是操作次数的奇偶性。

怎么我思维题这么屑啊,而且CCPC都把思维题放签到,一定要好好练思维啊!!!

看完题解发现其实也没啥,就是不要想得太复杂了,很多能够秒出结论就行了不用那么严谨,多罚几次不要紧

1.13

whk

1.14

CCPC桂林,全程划水,以后养好精神

感觉越往以前做越简单了?

构造题还是有待加强,题16号补

1.15

whk

回杭一天

CF还是打了,贪心还是要多考虑几种情况,给多少,够or不够?

套路题都很简单啊

1.16

补CF和桂林题

桂林J题:

设在 DAG 上存在一条从u 到 v 的边数为k 的路径,若 Val[v] 已知而 Val[u] 未知,则可以推出 Val[u] ≥ Val[v] +k;若 val[v] 未知而 val[u] 已知,则可以推出 val[v] ≤ val[u] − k。

首先我们通过上述规则拓扑一遍算出所有位置的取值范围 [Lu
, Ru],可以用拓扑排序。

于是转化为如下问题:给定 k 个区间和 k 个互不相同的数,我们需要给每个数匹配一个包含它的区间,此外每个区间匹配的数还要满足一些拓扑关系。如果暂时不考虑拓扑关系的话是一个经典问题,存在一个简单的贪心做法:从小到大枚举所有数,当枚举到 i 时,从所有左端点 ≤ i 且还没被匹配的区间中,选择右端点最小的那个匹配给 i,这个过程用优先队列优化。(CSP2021)

然后分析一下区间的性质:如果存在边 (u, v),根据转移方程可得 L[v] + 1 ≤ L[u],R[v] + 1 ≤ R[u],按
照上述贪心做法,[L[v], R[v]] 一定比 [L[u], R[u]] 更早被匹配到,即一定满足 val[v] < val[u]。所以直接贪心求出
来的就是原问题的合法解,如果贪心无解则原问题一定无解。

1.17

又回了趟杭州

看了wc题,不会做,摆了,搞whk

恭喜wxw进IOI,希望他AK

hg那群人大概率都是Cu

1.18-开学

whk

posted @ 2023-07-12 16:38  Anticipator  阅读(44)  评论(0)    收藏  举报