首页 > 其他分享 >2023杭电多校第一场

2023杭电多校第一场

时间:2023-07-18 22:34:01浏览次数:55  
标签:杭电多校 int long 第一场 2023 Now SG mx dp

手还是有点生(

随便写点东西.jpg

1001

实际上把链找出来之后就可以把树扔了(

然后在某个位置上出现的点它的出现位置就可以表示为$k*dis+b$,$b$是位置

对于$S$的每个数字,找它在$T$的位置,能拿到两个同余方程,形如$x = t_1(mod n)$和$x = t_2 (mod m)$找最小正整数解即可。

代码是学弟写的,摸了(

1002

$f[i][0/1/2]$表示当前点不选且被覆盖/选了/不选且不被覆盖

转移挺好写的

#include <bits/stdc++.h>
#define int long long
using namespace std;
int T;
const int inf = 1e9+7;
const int mx = 2e5+5;
int a[mx];
vector<int> G[mx];
int dp[mx][3];
void dfs(int Now,int fa){
    dp[Now][1] = a[Now];
    dp[Now][0] = dp[Now][2] = 0;
    bool flag = false;
    int chg = inf;
    for (auto v : G[Now]){
        if (v == fa) continue;
        dfs(v,Now);
        dp[Now][1] += min(dp[v][0],min(dp[v][1],dp[v][2]));
        dp[Now][2] += min(dp[v][1],dp[v][0]);
        if (dp[v][1]  > dp[v][0]){
            dp[Now][0] += dp[v][0];
            chg = min(chg,dp[v][1]-dp[v][0]);    
        }else{
            flag = true;
            dp[Now][0] += dp[v][1];
        }
    }
    if (!flag)
        dp[Now][0] += chg;
}
signed main(){
    scanf("%lld",&T);
    while (T--){
        int N;
        scanf("%lld",&N);
        for (int i = 1 ; i <= N ; i ++){
            scanf("%lld",&a[i]);
            G[i].clear();
            dp[i][0] = dp[i][1] = dp[i][2] = 0;
        }
        for (int i = 1 ; i < N ; i ++){
            int x,y;
            scanf("%lld%lld",&x,&y);
            G[x].push_back(y);
            G[y].push_back(x); 
        }
        dfs(1,1);
        printf("%lld\n",min(dp[1][1],dp[1][0]));
    }
    return 0;
}

1005

把串二倍延长一下,实际上枚举$M$个位置就可以把所有的可能串给枚举上

字符串哈希一下,存一下最小的$hash$值,最后直接比较即可。

*998244353被卡了,差评

#include<bits/stdc++.h>
using namespace std;
const int mx = 2e5+10;
const unsigned long long P = 429496729;
int N,M;
int T;
unsigned long long tt[mx]; 
unsigned long long p[mx];
unsigned long long pref[mx];
unsigned long long GetHash(int l, int r) {
    return pref[r] - pref[l - 1] * p[r - l + 1];
}
unsigned long long Hash[mx];
int main(){
    p[0] = 1;
    for (int i = 1 ; i <= mx - 10 ; i ++)
        p[i] = p[i-1] * P;
    cin >> T;
    while (T--){
        scanf("%d%d",&N,&M);
        for (int i = 1 ; i <= N ; i ++){
            Hash[i] = 0;
        }
        for (int i = 1 ; i <= N ; i ++){
            string ss;
            cin >> ss;
            ss = ss + ss;
            ss = ' ' + ss;
            int Len = ss.length();
            pref[0] = 0;
            for (int j = 1 ; j <= Len ; j ++){
                pref[j] = pref[j-1] * P + ss[j];
            }
            Hash[i] = pref[M];
            unsigned long long mn = Hash[i];
            for (int j = 1 ; j <= M ; j ++){
                unsigned long long x = GetHash(j,j+M-1); 
                mn = min(mn,x);
            }
            tt[i] = mn;
        }
        int Q;
        cin >> Q;
        while (Q--){
            int x,y;
            scanf("%d%d",&x,&y);
            if (tt[x] == tt[y]) printf("Yes");
            else printf("No");
            if (T!=0 || Q != 0) printf("\n"); 
        }
    }
} 

1008

签到,跳过.jpg

1012

根据树删边博弈,SG[x] = (SG[v]+1)的xor和

$v$是$x$的所有儿子

SG[root]如果是0先手赢

然后暴力换个根就好了,看有多少点的SG不是0

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int cnt = 0;
int read(){
    int f=1,k=0;
    char c=getchar();
    while(c<'0'||c>'9'){
        c=getchar(); 
    }
    while(c>='0'&&c<='9'){
        k=k*10+c-'0';
        c=getchar();
    }
    return f*k;
}
const int mx = 2e5+10;
const int MOD =1e9+7;
vector<int> G[mx]; 
int T;
int N;
ll SG[mx];
int Fa[mx];
ll Pow(int x,int y){
    ll ans = 1;
    for (;y;y>>=1){
        if (y&1) ans = (ans * 1ll * x) %MOD;
        x = 1ll*x * x %MOD;
    }
    return ans;
}
void dfs(int Now,int fa){
    Fa[Now] = fa;
    SG[Now] = 0;
    for (auto v:G[Now]){
        if (v == fa) continue;
        dfs(v,Now);
        SG[Now] ^= (SG[v]+1);
    }
}
void dfs1(int Now,int fa){
    if (Now != 1){
        SG[fa] ^= (SG[Now]+1);
        SG[Now] = SG[Now] ^ (SG[fa] + 1);
    }
    if (SG[Now] != 0) cnt ++;
    for (auto v : G[Now]){
        if (v == fa) continue;
        dfs1(v,Now);
    }
    if (Now != 1){
        SG[Now] ^= (SG[fa]+1);
        SG[fa]^=(SG[Now] + 1);
    }
}
signed main(){
    T=read();
    while (T--){
        N = read(); 
        for (int i = 1 ; i <= N ; i ++){
            Fa[i] = 0;
            SG[i] = 0;
            G[i].clear();
        }
        for (int i = 1 ; i < N ; i ++){
            int x,y;
            x=read(),y=read();
            G[x].push_back(y);
            G[y].push_back(x);
        }
        dfs(1,1);
        cnt = 0;
        dfs1(1,1);
        ll inv = Pow(N,MOD-2);
        printf("%lld\n",1ll*inv*cnt%MOD);
    }
    return 0;
}

 

标签:杭电多校,int,long,第一场,2023,Now,SG,mx,dp
From: https://www.cnblogs.com/si--nian/p/17564308.html

相关文章

  • Camtasia 2023.0.0 Mac中文解锁版含camtasia2023激活密钥
    随着网络科技的迅速发展,所以对于电脑的使用率也就越来越高了!然而,也可能跟这有关系,目前各种类型的软件层出不穷,当然也就包括了电脑录屏软件。这给我们造成了一些困难,究竟哪一款适合自己呢?Camtasia2023是TechSmith公司出品的一款屏幕录像和编辑的软件,可轻松录制和分享高质量的截屏视......
  • 2023杭电多校第一场
    目录1002CityUpgrading1005CyclicallyIsomorphic1009Assertion比赛地址:传送门1002CityUpgrading思路:树形DP类似题:洛谷P2458保安站岗1005CyclicallyIsomorphic思路:最小表示法+判断最小表示法模板:洛谷P1368【模板】最小表示法1009Assertion鸽巢原理,不记......
  • 2023-07-18:给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空), 使得剩余元素的 和
    2023-07-18:给你一个正整数数组nums,请你移除最短子数组(可以为空),使得剩余元素的和能被p整除。不允许将整个数组都移除。请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回-1。子数组定义为原数组中连续的一组元素。输入:nums=[3,1,4,2],p=6。输......
  • 2023.7.18打卡
    2023.7.18(1)、今天早上去练了车,练到中午才回来,记了单词,学了Java,看了《大道至简》,看了辩论赛。(2)、明天还要去练车,然后得回家一趟,我爷爷要我回去有点事,所以可能学不了Java,我打算带着《大道至简》一起回去,回家也能看看,记记单词,看一步电影。(3)、今天没遇到什么问题。......
  • stm32片上资源(2023/7/18)
     *NVIC &SysTick为片内资源 *NVIC:内核里面用于管理中断的设备,比如配置中断优先级这些东西 *SysTick:内核里面是一个定时器,主要用来给操作系统提供定时服务的。STM32可以加入操作系统的,比如FreeRTOS、UCOS等,如果用了这些操作系统,就需要用SysTick提供定时来进行任务切换功......
  • 2023.7.18 周二:Arrays类
    1importjava.sql.SQLOutput;2importjava.util.Arrays;3importjava.util.Scanner;4//Arrays类5publicclasstest{6publicstaticvoidmain(String[]args){7int[]a={5,4,6,8,9,1,7,2,3};8//打印数组元素9Arrays.t......
  • 20230718巴蜀暑期集训测试总结
    T1做了\(3h\),时间复杂度不对,小样例都还有一个没过。考虑容斥,不连通的情况枚举\(1\)号点所在连通块。设\(f_{S,i}\)表示\(S\)连通且选了\(i\)条边的方案数。设\(inb_s\)表示\(S\)内部的边数。那么有转移:\[f_{S,i}=\binom{inb_S}i-\sum_{T\subsetneqqS,1\inT}......
  • 2023冲刺国赛模拟 38.1
    又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又又垫......
  • Day11(2023.07.18)
    行程8:45    到达上海市信息安全测评认证中心(黄浦区陆家浜路1308号)9:00  改文件11:30--13:00   吃饭休息13:00 创建项目,熟悉软件,生成报告等..17:00      下班......
  • 2023HWS_RE复现
    2023HWS_RE复现参考wp:https://oacia.cc/hws-2023/Android参考这篇文章:https://www.52pojie.cn/thread-1680984-1-1.html360加固去掉利用gg修改器+lua脚本去掉360加固后然后就ok了,但是dex文件直接丢尽jadx会报错把多余的数据删了就行然后可以正常看到so里面看,sm4加......