Submission #1153699

#TimeUsernameProblemLanguageResultExecution timeMemory
1153699danglayloi1Ancient Machine (JOI21_ancient_machine)C++20
5 / 100
27 ms6216 KiB
#include "Anna.h"
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
void Anna(int n, vector<char> s)
{
    for(int i = 0; i < n; i++)  
        if(s[i]=='X') Send(0), Send(0);
        else if(s[i]=='Y') Send(0), Send(1);
        else Send(1), Send(0);
}
#include "Bruno.h"
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
void Bruno(int n, int l, vector<int> a)
{
    vector<char> s;
    for(int i = 0; i < n; i++)
    {
        int x=0;
        if(a[i*2]) x+=2;
        if(a[i*2+1]) x++;
        if(x==0) s.emplace_back('X');
        else if(x==1) s.emplace_back('Y');
        else s.emplace_back('Z');
    }
    int dp[1<<19], trace[1<<19];
    for(int i = 0; i < (1<<n); i++)
        dp[i]=-inf;
    dp[0]=0;
    for(int mask = 0; mask < (1<<n); mask++)
    {
        for(int i = 0; i < n; i++)
        {
            if(mask>>i&1) continue;
            int l=-1, r=n;
            for(int j = i-1; j >= 0; j--)
                if(!(mask>>j&1))
                {
                    l=j;
                    break;
                }
            for(int j = i+1; j < n; j++)
                if(!(mask>>j&1))
                {
                    r=j;
                    break;
                }
            int cost=0;
            if(l>=0 && r<n && s[i]=='Y' && s[l]=='X' && s[r]=='Z')
                cost=1;
            if(dp[mask]+cost>dp[mask|(1<<i)])
                dp[mask|(1<<i)]=dp[mask]+cost, trace[mask|(1<<i)]=mask;
        }
    }
    int mask=(1<<n)-1;
    vector<int> path;
    path.clear();
    while(mask!=0)
    {
        int nxt=trace[mask];
        int sus=(nxt^mask), pos;
        for(int i = 0; i < n; i++)
            if((1<<i)==sus)
                pos=i;
        path.emplace_back(pos);
        mask=nxt;
    }
    reverse(path.begin(), path.end());
    for(int c:path) Remove(c);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...