首页 > 其他分享 >Playoff Tournament

Playoff Tournament

时间:2024-10-10 08:54:48浏览次数:1  
标签:int pows Tournament State Son MAXLEN Playoff Result

算法

暴力思路显然
观察到更改操作最多只影响一条链
于是显然

代码

#include <bits/stdc++.h>
const int MAXLEN = 263000;


int k;
std::string Result;

int q;
int Match;
char New_Result;

int pows[20] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288};

int State[MAXLEN];


int Left_Son[MAXLEN];
int Right_Son[MAXLEN];
int Fa[MAXLEN];
void solve1_init()
{
    for (int i = 1; i <= pows[k] - 2; i++)
    {
        if (i % 2)
            Left_Son[i + pows[k - 1] - i / 2] = i, Fa[i] = i + pows[k - 1] - i / 2;
        else
            Right_Son[i + pows[k - 1] - i / 2] = i, Fa[i] = i + pows[k - 1] - i / 2;
    }

    Fa[pows[k] - 1] = -1;
    for (int i = 1; i <= pows[k - 1]; i++)
    {
        Left_Son[i] = -1;
        Right_Son[i] = -1;
    }

    for (int i = 1; i <= pows[k - 1]; i++)
    {
        if (Result[i] == '0' || Result[i] == '1')
        {
            State[i] = 1;
        }
        else
        {
            State[i] = 2;
        }
    }

    for (int i = pows[k - 1] + 1; i <= pows[k] - 1; i++)
    {
        if (Result[i] == '0')
        {
            State[i] = State[Left_Son[i]];
        }
        else if (Result[i] == '1')
        {
            State[i] = State[Right_Son[i]];
        }
        else
        {
            State[i] = State[Left_Son[i]] + State[Right_Son[i]];
        }
    }
}


void solve1()
{
    Result[Match] = New_Result;

    for (int i = Match; ~i; i = Fa[i])
    {
        if(Result[i] == '0' && i > pows[k - 1])
        {
            State[i] = State[Left_Son[i]];
        }
        else if (Result[i] == '1' && i > pows[k - 1])
        {
            State[i] = State[Right_Son[i]];
        }else if (i > pows[k - 1]){
            State[i] = State[Left_Son[i]] + State[Right_Son[i]];
        }else{
            State[i] = (Result[i] == '0' || Result[i] == '1') ? 1 : 2;
        }
    }

    printf("%d\n", State[pows[k] - 1]);
}

int main()
{

    //freopen("tournament.in", "r", stdin);
    //freopen("tournament.out", "w", stdout);

    scanf("%d", &k);
    std::cin >> Result;
    Result = ' ' + Result;

    scanf("%d", &q);
    solve1_init();
    for (int i = 1; i <= q; i++)
    {
        scanf("%d", &Match);
        getchar();
        scanf("%c", &New_Result);


        if(q <= 100 && k <= 6)
            solve1();
        else
            solve1();
    }

    return 0;
}

/*
3
0110?11
6
5 1
6 ?
7 ?
1 ?
5 ?
1 1

1
2
3
3
5
4
*/

总结

树型结构常见优化套路题
以前也没见过啊

标签:int,pows,Tournament,State,Son,MAXLEN,Playoff,Result
From: https://www.cnblogs.com/YzaCsp/p/18455524

相关文章

  • [题解]AT_abc263_f [ABC263F] Tournament
    先为大家毙掉一个错解思路首先不难发现,如果将整棵比赛的对战图画出来,一定是一个满二叉树。不妨将令一个节点\(u\)的左右儿子编号分别为\(2u\)和\(2u+1\)。然后定义\(dp_{u,d}\)表示将\(u\)为根的子树内的选手全部比赛完,并且\(u\)已经赢了\(d\)场的最大结果。发......
  • Kinetic Tournament Tree
    考虑这样一个问题:\(n\)个一次函数\(k_ix_i+b_i\),每个一次函数初始有\(x_i=0\);区间对\(x_i\)加正数\(x\),区间查询\(\max\limits_{i=l}^rk_ix_i+b_i\)。考虑每个点维护当\(x_i=0\)时值最大的函数,然后额外维护一个阈值\(t\),表示当\(x\)增大到\(t\)时这个......
  • AT_abc263_f [ABC263F] Tournament 题解
    分析一眼DP。定义状态函数$f_{i,j}$表示在第$i$此比赛中,获胜者为$j$时的最大奖学金。把比赛过程看成一棵倒着的满二叉树,就能发现:第$i$场比赛只会是其左儿子为根的子树中叶子节点的某一个与其右儿子为根的子树中叶子节点的某一个进行比赛。然后就可以得到转移方程:$f_{i,......
  • AtCoder Grand Contest 046 F Forbidden Tournament
    洛谷传送门AtCoder传送门太厉害了!!!!!!首先竞赛图有个性质,若存在环则一定存在三元环。先把DAG的情况(一条链)特判了。然后缩点。发现非链底的部分不能存在大小\(>1\)的SCC。所以枚举非链底的部分有多少点,转化为SCC的情况。发现对于任意点(设为\(1\)号点),它的前驱连成一条链......
  • [CF1268D] Invertation in Tournament
    InvertationinTournament题面翻译给定一张\(n\)个点的竞赛图,定义一次操作为选取一个顶点\(v\)并翻转所有以\(v\)为顶点的边的方向。请你判断是否存在一种操作方案使得操作完成后,这个图是强连通的。如果存在,求出最小的操作次数,以及使得操作次数达到最小的操作方案数。其......
  • [Codeforces] CF1719C Fighting Tournament
    题目传送门另:多测不清空,WA两行泪题意Burenka正准备去观看一年中最有趣的体育活动——她朋友Tonya组织的格斗锦标赛。有n名运动员参加了大赛,标号分别为为1,2,...,n。第i名运动员的实力是\(a_i(1\lea_i\len)\)。每个运动员的实力是不同的,也就是说,数组a是n的一种......
  • CF1719C Fighting Tournament
    FightingTournament题目传送门另:多测不清空,WA两行泪题意Burenka正准备去观看一年中最有趣的体育活动——她朋友Tonya组织的格斗锦标赛。有n名运动员参加了大赛,标号分别为为1,2,...,n。第i名运动员的实力是$a_i(1\lea_i\len)$。每个运动员的实力是不同的,也就是说,数......
  • [AGC009B] Tournament 题解
    思路考虑树形\(\text{dp}\)。我们将每个人与把自己淘汰的人连边。得到一颗以一为根的树。由于我们需要求出必须赢的场数最多的那位选手,至少要赢多少场。考虑最多的限制。可以使用树型动态规划。每一次两个人比赛的代价为:\[dp_i=\max(dp_i,dp_j)+1\]这样就达成了最多的限......
  • CF323B - Tournament-Graph
    题意:构造一个\(n\)大小的锦标赛图,即每两点之间恰有一条有向边,满足任意点对\((u,v)\),都存在一条从\(u\)到\(v\),长度不超过\(2\)的路径。方法一考虑奇数情况,假设我们的点是在环上排列的,那么我们对任意的跨越不超过半个环的边都连上,也就是说,我们把点看成圆上的若干个等分点......
  • CF1260E Tournament 题解
    妙妙题,但是感觉评不到紫。题目链接。题意luogu题意。有\(n\)个人,贿赂第\(i\)个人的代价为\(a_i\)。这些人中,贿赂代价为\(-1\)的是你的朋友。现在,你可以两两配对,使得编号小的被淘汰,但是,如果你贿赂了编号大的,那么编号大的被淘汰,而编号小的留下。问:使得你朋友夺得冠军的......