首页 > 其他分享 >The 2024 ICPC Asia East Continent Online Contest (II)打题+写题笔记

The 2024 ICPC Asia East Continent Online Contest (II)打题+写题笔记

时间:2024-10-18 20:23:54浏览次数:1  
标签:ch Contest int II 打题 Maxn 字符串 不会 gh

前言

方队让我们来打

于是来打。

赛时2h过了AFGIJL,感谢qsq贡献的G。

评价:A:唐,F:唐,G:没看,I:小清新构造,J:国王游戏,L:不做评价。

补题补了C,E

E Escape

链接

题意

给你 \(n\) 个波特和一个人与一张无向联通图,波特有一个共同的活动距离 \(d\)。不能在原地不动。问人在保证不遇到波特的情况下能否走到终点,并输出路径。
起点为 \(1\),终点为 \(n\)。

sol

对于能走到的点考虑奇偶分类(由于不能停留)。
所以只需要对波特跑一遍多源bfs,并且对人在波特的基础上跑,如果当前点当前奇偶性上的波特来的比人早,那么人就不能进入这个点,否则能。

最后判一下无解,通过pre输出就行了

#include<bits/stdc++.h>
#define int long long
#define pb push_back
namespace IO {
    #define gh getchar
    inline int read(){char ch=gh();int x=0;bool t=0;while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();return t?-x:x;}
    inline char getc(){char ch=gh();while(ch<'a'||ch>'z') ch=gh();return ch;}
    inline void write(int x){if(x < 0){putchar('-');x = -x;}if(x > 9){write(x / 10);}putchar((x % 10 + '0'));}
}
using namespace IO;
using namespace std;
const int Maxn = 500010, mod = 1e8;
int pre[Maxn][2]; int pos[Maxn]; int vis[Maxn][2]; int vp[Maxn][2]; int w[Maxn][2];
vector<int> G[Maxn]; struct Node{int o, u;}; //is:0:bot else not
int ds[Maxn][2];
void work(){
    int n, m, d; n = read(), m = read(), d = read(); int u, v; int s = 1, t = n;
    for(int i = 1; i <= n; i++) G[i].clear();
    for(int i = 1; i <= n; i++) pre[i][0] = pre[i][1] = pos[i] = 0, w[i][1] = w[i][0] = ds[i][0] = ds[i][1] = 1e18; 
    for(int i = 1; i <= m; i++) u = read(), v = read(), G[u].pb(v), G[v].pb(u); int c = read(); 
    for(int i = 1; i <= c; i++) pos[i] = read();
    queue<Node> q; 
    for(int i = 1; i <= c; i++) q.push({0,pos[i]}), ds[pos[i]][0] = 0;
    while(!q.empty()){
        auto [o,u] = q.front(); q.pop();
        for(int i : G[u])if(ds[i][o^1] > ds[u][o] + 1){
            ds[i][o^1] = ds[u][o] + 1; q.push({o^1,i}); 
        }
    }    
    for(int i = 1; i <= n; i++) for(int o : {0,1}) if(ds[i][o] > d) ds[i][o] = 1e18;
    w[1][0] = 0; q.push({0,1});
    while(!q.empty()){
        auto [o,u] = q.front(); q.pop(); if(w[u][o] >= ds[u][o]) continue; 
        for(int i : G[u])if(w[i][o ^ 1] > w[u][o] + 1){
            w[i][o ^ 1] = w[u][o] + 1; pre[i][o^1] = u; q.push({o^1,i});
        }
    }
    for(int i = 1; i <= n; i++) for(int o : {0,1}) if(w[i][o] >= ds[i][o]) w[i][o] = 1e18;
    int o=(w[n][0]<w[n][1]?0:1);
    if(w[t][o] >= 1e18) puts("-1");
    else {
        int x = t; vector<int> ans;  
        while(x ^ 1 || o){
            ans.pb(x); x = pre[x][o]; o ^= 1;
        }
        ans.pb(s); reverse(ans.begin(),ans.end());
        cout << ans.size() - 1 << endl;
        for(int i : ans){
            printf("%lld ",i);
        }puts("");
    }
}   
signed main(){
    int t = read(), p = 0;
    while(t--){
        work(); p++;
    }
} 

C Prefix of Suffixes

宇宙超级无敌原神启动字符串题。

不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串
不会字符串不会字符串

转换一下式子整个增量 \(\Delta = A_i\sum\limits_{j=1}^{i}B_j[z_j = i - j + 1]\)。\

然后就是动态维护 \(z\) 数组。然后发现 exkmp 做不了动态。
然而有个题解里说

然后不是很懂为什么这题要强制在线,可能是存在某些神奇做法可以离线秒了吧?

emm。离线跑一下 exkmp 就做完了好吧。

然后发现 \([z_j = i - j + 1]\) 表明这个 \(j\) 其实是 \(1\) ~ \(i\) border 的一部分。

然而这道题就是用 kmp 可以动态来维护 border 的功能来解决的。

然后处理一下,理解一下,做完了。 (等会写。

复杂度 \(\operatorname{O}(n)\)。

#include<bits/stdc++.h>
#define int long long
#define pb push_back
namespace IO {
    #define int long long 
    #define gh getchar
    inline int read(){char ch=gh();int x=0;bool t=0;while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();return t?-x:x;}
    inline char getc(){char ch=gh();while(ch<'a'||ch>'z') ch=gh();return ch;}
    inline void write(int x){if(x < 0){putchar('-');x = -x;}if(x > 9){write(x / 10);}putchar((x % 10 + '0'));}
}
using namespace IO;
using namespace std;
const int Maxn = 300010, mod = 1e8;
int s[Maxn], a[Maxn], b[Maxn], z[Maxn];
vector<int> f[Maxn];
void solve() {
    int n = read();
    int ans = 0, res = 0;
    for(int i = 1; i <= n; i++){            
        s[i] = (read() + ans) % n; a[i] = read(), b[i] = read();
        res += b[i];
        if(i != 1){
            int j = z[i - 1];
            while(j > 0 and s[j + 1] != s[i]) f[i].pb(j), j = z[j];
            if(s[j + 1] == s[i]){ 
                for(int k : f[j + 1]) f[i].pb(k);
                j++;         
            }else f[i].pb(j);
            z[i] = j;
            for(int k : f[i]) res -= b[i - k];
        } ans += res * a[i];
        cout << ans << endl;
    }
}
signed main(){
    solve();
}

其他题太抽象了,不补了。

标签:ch,Contest,int,II,打题,Maxn,字符串,不会,gh
From: https://www.cnblogs.com/theshumo/p/18474987

相关文章

  • AtCoder Beginner Contest 371 - VP记录
    总体发挥还算正常A-Jiro呵呵呵,有人像我这么做的吗?点击查看代码#include<cstdio>usingnamespacestd;intmain(){ charab,ac,bc; scanf("%c%c%c",&ab,&ac,&bc); if(ab=='<'&&ac=='<'&&bc=='<')......
  • C - Word Ladder (Toyota Programming Contest 2024#9 (AtCoder Beginner Contest 370)
    题目链接:C-WordLadder题目:样例:分析:不要被题目所吓到,一切长题目都是纸老虎。题目大意就是给你两个字符串s和t,一次只能更换一个字母,求s变到t更换的次数,并输出每次更换一个字母后的最小字典序字符串。题意好理解,可以直接暴力,大力出奇迹。但是有没有更好的方法呢?既然问了......
  • 【做题记录】ds合集 Part III
    ds合集的Part3,此合集包含贪心问题。贪心问题CF30E题目链接考虑对一个\(a'\)找到其对于的\(a\),肯定是越前越优,那么拿\(S\)的反串做个kmp即可得到每个\(a\)的第一次出现位置。然后就是在区间中找最长的奇回文串,manacher预处理,然后二分半径\(len\),看看\([l+len-1,......
  • 【做题记录】ds合集 Part II
    ds合集的Part2,此合集包含分治问题和位问题。分治问题CF452F题目链接枚举\(i\),考虑差为\(k\),即\(a_i-k,a+k\)是否在不同的两侧。把在\(i\)前面的\(a_j\)设为\(1\),就是要找以\(i\)为中心半径在\(\min(a_i,n-a_i+1)\)的串是否是回文串。线段树维护即可。复杂......
  • 力扣142.环形链表II
    题目链接:142.环形链表II-力扣(LeetCode)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示......
  • 又是毕业季II
    原题链接\(非常简单的一道预处理题\)\(通过小学知识我们可以知道1-1e6内的数平均因数个数为13.6\)\(所以我们通过枚举每个数的所有质因子再通过对质因子dfs求出其所有的因子最坏复杂度为O(n*sqrt(inf))\)\(在通过一个后缀处理掉所有的因子数\)\(通过后缀往前更新答案\)\(c......
  • The 2024 CCPC National Invitational Contest (Northeast) ADEJ
    The2024CCPCNationalInvitationalContest(Northeast)ADEJA.PaperWatering思路:有两种类型的操作,对一个数开根号或平方。平方没有什么问题,开根号由于是向下取整再平方就会产生不一样的数。那么做法也很简单了。对于一个数\(x\),\(k\)步,首先它能平方往后变\(k\)步,往前能......
  • 基于IO模拟IIC与SPI驱动实现
        最近项目上,由于一些变更问题,导致硬件设计上未考虑到相关GPIO是否支持硬件驱动,考虑到这两个驱动的应用场景并不普遍,基本上只有在下电与Boot升级时才可以会被应用(相信有经验的朋友以及猜出来是什么功能了),具体功能就不详说了,我们直接讲解关于IIC与SPI的模拟驱动吧。1......
  • IIC通信配置时,其GPIO应处于何种工作模式?为何这样做?及IIC总线上为何需增加上拉电阻?其
        直奔主题,以下是以下关于IIC总线应用中所需要理解的特性:1、GPIO应处于何种工作模式?    解:IIC总线通信使用两根新,分别是SDA和SCL,其IO工作模式通常需要配置为开漏输出。因为IIC总线是允许多个设备共享同一总线的,所以所有设备都可以将总线拉低,但不会相互冲突......
  • IIS配置——关于WebApi部署在IIS长时间不连接后第一次连接响应慢的问题
    0.服务器信息WindowsServer2019StandardIIS:Version:10.0第一次请求响应慢的原因:默认情况下,应用程序池在不活动情况下(无请求操作),一段时间后,将被IIS自动回收掉。1.修改IIS的下述配置应该程序池-->右键,高级设置-->进程模型,闲置超时(分钟)-->默认是20,设置为0......