QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#344786#7736. Red Black TreeTMM233AC ✓248ms44972kbC++144.2kb2024-03-05 12:08:482024-03-05 12:08:48

Judging History

你现在查看的是最新测评结果

  • [2024-03-05 12:08:48]
  • 评测
  • 测评结果:AC
  • 用时:248ms
  • 内存:44972kb
  • [2024-03-05 12:08:48]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define IOS ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll; 
typedef pair<ll,ll> p;
const int N=2e5+5;
ll n;
string col;//颜色
vector<ll> e[N];
vector<ll> dp[N];// dp[x][i] 表示我到我的叶子距离都变成i的最小花费
ll ed[N];// 每一个节点到自己叶片的最短长度
p lian[N];// 如果我只有一个儿子那我就会继承我儿子的dp 
// 然后用lian数组对dp做懒修改[1数目,0数目]
ll ans[N];// 统计答案
void dfs(ll x,ll fa)
{
    lian[x]=p{0,0};// 只有我有一个儿子的时候 lian 才有值
    if(e[x].empty())
    {
        ed[x]=0;
    }
    else
    ed[x]=1e18;
    for(auto v:e[x])
    {
        if(v==fa) continue;
        dfs(v,x);
        ed[x]=min(ed[x],ed[v]);// 统计出 ed[x]
    }
    ed[x]++;

    if(e[x].empty())// 如果我是叶子了 那么答案显然可得
    {
        dp[x].resize(2,0);
        if(col[x]=='1')
        dp[x][0]=1,dp[x][1]=0;
        else
        dp[x][1]=1,dp[x][0]=0;
    }
    else if(e[x].size()==1)// 如果我只有一个儿子 那我就先继承儿子的dp 然后修改lian[x]
    {
        lian[x]=lian[e[x][0]];
        if(col[x]=='1')
        lian[x].first++;
        else
        lian[x].second++;
        swap(dp[x],dp[e[x][0]]);
    }
    else if(e[x].size()>=2)// 要处理 lian
    {
        dp[x].resize(ed[x]+1);
        vector<ll> ton(ed[x]+1,0);
        for(auto v:e[x])
        {
            if(v==fa) continue;
            vector<ll> tp_ton(ed[x]+1,1e18);
            if(e[v].size()==1)// 直接 lian内num * dp[v].size暴力搞(最多 nlogn)
            {
                // 枚举我链状部分的黑色节点数(1) 然后暴力得到最小值
                for(int i=0;i<=lian[v].first;i++)
                {
                    for(int j=0;j<dp[v].size()&&i+j<ed[x];j++)
                    {
                        tp_ton[i+j]=min(tp_ton[i+j],dp[v][j]+(lian[v].first-i));
                    }
                }
                // 枚举我链状部分的黑色节点数(1) 然后暴力得到最小值
                for(int i=lian[v].first+1;i<=lian[v].first+lian[v].second;i++)
                {
                    for(int j=0;j<dp[v].size()&&i+j<ed[x];j++)
                    {
                        tp_ton[i+j]=min(tp_ton[i+j],dp[v][j]+(i-lian[v].first));
                    }
                }
                for(int i=0;i<ed[x];i++)
                ton[i]+=tp_ton[i];
            }
            else// 如果是正常的儿子 那就直接加上就可以了
            {
                for(int i=0;i<ed[x];i++)
                {
                    ton[i]+=dp[v][i];
                }
            }
        }
        if(col[x]=='1')// 把我自己弄上去
        {
            for(int i=0;i<=ed[x];i++)
            {
                if(i!=0&&i!=ed[x])
                dp[x][i]=min(ton[i-1],ton[i]+1);
                else if(i==0)
                dp[x][i]=ton[i]+1;
                else if(i==ed[x])
                dp[x][i]=ton[i-1];
            }
        }
        else
        {
            for(int i=0;i<=ed[x];i++)
            {
                if(i!=0&&i!=ed[x])
                dp[x][i]=min(ton[i],ton[i-1]+1);
                else if(i==0)
                dp[x][i]=ton[i];
                else if(i==ed[x])
                dp[x][i]=ton[i-1]+1;
            }
        }
    }
    if(e[x].size()!=1)// 如果我不是一个儿子 那我明确统计出了答案遍历一下
    {
        ans[x]=1e18;
        for(auto v:dp[x])
        {
            ans[x]=min(ans[x],v);
        }
    }
    else// 如果我只有一个儿子 那我儿子的答案就是我的 因为我自己这个点影响不了答案
    {
        ans[x]=ans[e[x][0]];
    }
}
int main()
{
    IOS;
    ll t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cin>>col;
        col=' '+col;
        for(int i=1;i<=n;i++) e[i].clear(),dp[i].clear();
        for(int i=2;i<=n;i++)
        {
            ll tp;cin>>tp;
            e[tp].push_back(i);
        }
        dfs(1,0);
        for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
        cout<<'\n';
    }
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 15604kb

input:

2
9
101011110
1 1 3 3 3 6 2 2
4
1011
1 1 3

output:

4 1 2 0 0 0 0 0 0 
2 0 0 0 

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 162ms
memory: 44972kb

input:

6107
12
000000001000
1 2 3 2 5 4 4 7 3 8 11
19
1100111101111011110
1 2 1 1 4 5 2 4 3 2 2 7 10 2 11 3 15 5
7
0111110
1 1 2 2 1 5
3
000
1 1
7
1000011
1 2 3 3 5 4
7
0001001
1 1 1 3 5 3
8
00111000
1 1 3 2 5 2 7
11
11111110111
1 1 1 4 5 4 5 2 5 1
15
110101101000010
1 2 3 2 1 5 2 5 6 5 8 7 9 14
10
0101000...

output:

1 1 1 1 0 0 0 0 0 0 0 0 
6 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 
0 0 0 
0 0 0 0 0 0 0 
2 0 1 0 0 0 0 
2 1 0 0 0 0 0 0 
4 0 0 2 1 0 0 0 0 0 0 
4 3 0 0 2 0 0 0 0 0 0 0 0 0 0 
2 0 1 0 0 0 0 0 0 0 
6 5 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 
1 1 0 0 0 
5 1 0 1 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0...

result:

ok 6107 lines

Test #3:

score: 0
Accepted
time: 248ms
memory: 27440kb

input:

10
100000
10001010000001100001000100001000010100010101100001001110110001000010000110001000000010000011000001000001010001110100000000000000000010011011100000000000001000000000100100100110000000100001010011000000110000000111010100100001100000100100101001000000010000000011100000000000000010001100011100...

output:

22440 21414 19422 13454 5328 2719 1421 1168 1478 661 4662 5037 418 183 2304 501 2008 1643 692 2211 570 1003 967 950 504 124 894 333 775 523 905 197 12 337 195 310 1325 1016 638 50 907 361 179 336 313 102 309 555 733 871 490 414 375 318 66 625 336 267 276 162 203 25 112 216 252 146 42 233 232 333 27 ...

result:

ok 10 lines

Test #4:

score: 0
Accepted
time: 91ms
memory: 22812kb

input:

10
100000
01010111111101011100011111111010011001111111110001100111111101011111110011101111110110111011010111011011010011111110101111111011111111011101011111011001110101111011011010110100011111001101001011111101111101111111111100101101000111111110111101111111111011111100111011101110110101111010101101...

output:

25019 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 10 lines

Test #5:

score: 0
Accepted
time: 116ms
memory: 38892kb

input:

10
100000
00111110110011111111111010011111011111101010110111111110011110111111111111000110101110110111111101011111111111010101111111011001110110011101111001110111101101110110101000011111110100101110110100111110001111011100111101011010111111011011100011111011110111111110011110111111001111111010011100...

output:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 10 lines

Test #6:

score: 0
Accepted
time: 171ms
memory: 37056kb

input:

10
100000
00111100100100001111011000100000000000111001100000000000100000101001001010010000001000010010111000001011010000000000001000000000010100000010010010000001000010001000000100000001010000000000000000000001000110000010100100000010000011000000000010010000100010100000000100000100100011000000001000...

output:

4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 4415 ...

result:

ok 10 lines

Test #7:

score: 0
Accepted
time: 119ms
memory: 33268kb

input:

10
100000
00111101111001101110101101111110100001010100011011100001011100000110000100100010111010011001111011100010010011111100000011111011001001000110000101101001011110000000011100001010100001000110110101111010000100000111001110001100001001001000101110100111111000101101100000011001110111001111101011...

output:

210 210 210 210 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 10 lines

Test #8:

score: 0
Accepted
time: 137ms
memory: 32012kb

input:

10
100000
00010011111100101111110000110010101110000000001111011110011010011011101011010000111100001001111111111001000110100010001111010111101100101111101100001001100110000011010100110110010101000010111001001010110111011000010100110101110001100110101010101001100010100000100000100101011110000100001001...

output:

6360 6360 4803 4803 1549 1549 1555 1555 1555 1595 1555 1549 1549 1555 1555 1600 1555 1549 1549 1549 1555 1555 1555 1555 1595 1549 1555 1555 1555 1555 1595 1595 1600 1555 1600 1600 1595 1549 1555 1555 1549 1600 1595 1600 1555 1595 1595 1549 1549 1549 1549 1555 1549 1549 1600 1595 1555 1549 1549 1555 ...

result:

ok 10 lines

Test #9:

score: 0
Accepted
time: 115ms
memory: 24648kb

input:

10
100000
11000111101111111101001011010110110111010011000111011111011111110111110000110101111111011101111011111111101110011100011101111111001011111101011111110010011111101111111011101101100110101010011111110111111101100101010011111111111100101111111101111100011100111110111111011111011001111110011101...

output:

18217 12003 6214 6012 5991 3232 2982 3008 3004 2973 3017 1780 1451 1499 1483 1513 1495 1486 1516 1499 1474 1509 1508 1037 743 738 713 722 776 752 731 741 771 759 735 731 755 740 776 733 765 736 738 753 756 739 769 678 359 362 380 364 374 342 370 356 364 393 382 367 385 360 371 370 371 383 387 387 37...

result:

ok 10 lines

Test #10:

score: 0
Accepted
time: 126ms
memory: 32756kb

input:

10
100000
10111111011011110010111111111111110111101110110001011111101110111011111111111101101011111101101001100111011011011101001110110110101010010001010111111111111111111011011011101011011101100001111101111110111110010011011111111011101110111111111110010011110011111011011011111111101111001110111111...

output:

50037 0 50035 0 50034 0 50033 0 50033 0 50032 0 50030 0 50029 0 50029 0 50027 0 50025 0 50024 0 50023 0 50022 0 50021 0 50020 0 50019 0 50019 0 50018 0 50017 0 50015 0 50014 0 50012 0 50012 0 50011 0 50011 0 50010 0 50009 0 50008 0 50006 0 50005 0 50003 0 50002 0 50000 0 49999 0 49998 0 49997 0 4999...

result:

ok 10 lines

Extra Test:

score: 0
Extra Test Passed