답안 #801529

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
801529 2023-08-02T06:28:32 Z vjudge1 Long Mansion (JOI17_long_mansion) C++14
10 / 100
3000 ms 73808 KB
#include<iostream>
#include<map>
#include<vector>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std ;
const int N = (1 << 19), NS = 5e3, NSS = (1 << 17) ;
bool flag, us[NS + 1][NS + 1] ;
int n, q, sm, c[N + 1] ;
vector<int> sg[2 * NSS + 1], sg_b[2 * NSS + 1] ;
vector<int> nul, ks[N + 1] ;
map<int, int> ch, null ;
void bfs(int city)
{
    ch = null ;
    bool abu = 1 ;
    int l = city, r = city ;
    for(int i : ks[city])
        ch[i] = 1 ;
    us[city][city] = 1 ;
    while(abu)
    {
        abu ^= 1 ;
        if(l > 1 && ch[c[l - 1]])
        {
            l-- ;
            for(int i : ks[l])
                ch[i] = 1 ;
            us[city][l] = 1 ;
            abu |= 1 ;
        }
        if(r < n && ch[c[r]])
        {
            abu |= 1 ;
            r++ ;
            for(int i : ks[r])
                ch[i] = 1 ;
            us[city][r] = 1 ;
        }
    }
}
vector<int> mrg(vector<int> a, vector<int> b)
{
    if(!a.size() || !b.size())
    {
        if(a.size())
            return a ;
        else
            return b ;
    }
    int uk1 = 0, uk2 = 0 ;
    vector<int> c ;
    while(uk1 < a.size() || uk2 < b.size())
    {
        int mn = 21 ;
        if(uk1 < a.size())
            mn = min(mn, a[uk1]) ;
        if(uk2 < b.size())
            mn = min(mn, b[uk2]) ;
        if(!c.size() || c.back() != mn)
            c.push_back(mn) ;
        if(uk1 < a.size() && a[uk1] == mn)
            uk1++ ;
        else
            uk2++ ;
    }
    return c ;
}
void build()
{
	for(int i = 0 ; i < NSS ; i++)
    {
        if(i + 1 < n)
            sg[i + NSS].push_back(c[i + 1]) ;
        if(i + 1 <= n)
            sg_b[i + NSS] = ks[i + 1] ;
    }
	for(int i = NSS - 1 ; i > 0 ; i--)
    {
        sg[i] = mrg(sg[i * 2], sg[i * 2 + 1]) ;
        sg_b[i] = mrg(sg_b[i * 2], sg_b[i * 2 + 1]) ;
    }
}
vector<int> get_all(int l, int r, int l1, int r1, int v)
{
	l += NSS ;
	r += NSS ;
	vector<int> res ;
	while(l <= r)
    {
		if(l % 2 == 1)
            res = mrg(res, sg[l++]) ;
		if(r % 2 == 0)
            res = mrg(res, sg[r--]) ;
        l >>= 1 ;
        r >>= 1 ;
	}
	return res ;
}
vector<int> get_all_b(int l, int r, int l1, int r1, int v)
{
	l += NSS ;
	r += NSS ;
	vector<int> res ;
	while(l <= r)
    {
		if(l % 2 == 1)
            res = mrg(res, sg_b[l++]) ;
		if(r % 2 == 0)
            res = mrg(res, sg_b[r--]) ;
        l >>= 1 ;
        r >>= 1 ;
	}
	return res ;
}
signed main()
{
    ios_base::sync_with_stdio( 0 ) ;
    cin.tie( 0 ) ;
    cout.tie( 0 ) ;
    cin >> n ;
    for(int i = 1 ; i < n ; i++)
    {
        cin >> c[i] ;
        if(c[i] > 20)flag = 1 ;
    }
    for(int i = 1 ; i <= n ; i++)
    {
        int b ;
        cin >> b ;
        sm += b ;
        for(int j = 1 ; j <= b ; j++)
        {
            int a ;
            cin >> a ;
            if(a > 20)flag = 1 ;
            ks[i].push_back(a) ;
        }
    }
    cin >> q ;
    if(n <= 5000 && sm <= 5000)
    {
        for(int i = 1 ; i <= n ; i++)
            bfs(i) ;
        for(int i = 1 ; i <= q ; i++)
        {
            int x, y ;
            cin >> x >> y ;
            if(us[x][y])
                cout << "YES\n" ;
            else
                cout << "NO\n" ;
        }
        return 0 ;
    }
    if(n <= 1e5 && !flag)
    {
        build() ;
        while(q--)
        {
            bool abu[21] = {} ;
            bool fl = 1 ;
            int x, y ;
            cin >> x >> y ;
            int lf = x, rg = x ;
            for(int j : ks[x])
                abu[j] = 1 ;
            while(fl)
            {
                fl ^= 1 ;
                vector<int> vl, vr ;
                int l = 0, r = lf ;
                while(l + 1 < r)
                {
                    bool check = 0 ;
                    int mid = (l + r) >> 1 ;
                    vl = get_all(1, NSS, mid, lf - 1, 1) ;
                    for(int j : vl)
                        if(!abu[j])check = 1 ;
                    if(check)
                        l = mid ;
                    else
                        r = mid ;
                }
                if(r < lf)
                {
                    vl = get_all_b(1, NSS, r, lf - 1, 1) ;
                    for(int j : vl)
                        abu[j] = 1 ;
                    lf = r ;
                    fl = 1 ;
                }
                l = rg - 1, r = n ;
                while(l + 1 < r)
                {
                    bool check = 0 ;
                    int mid = (l + r) >> 1 ;
                    vr = get_all(1, NSS, rg, mid, 1) ;
                    for(int j : vr)
                        if(!abu[j])check = 1 ;
                    if(check)
                        r = mid ;
                    else
                        l = mid ;
                }
                if(l >= rg)
                {
                    vr = get_all_b(1, NSS, rg + 1, l + 1, 1) ;
                    for(int j : vr)
                        abu[j] = 1 ;
                    fl = 1 ;
                    rg = l + 1 ;
                }
            }
            if(lf <= y && y <= rg)
                cout << "YES\n" ;
            else
                cout << "NO\n" ;
        }
        return 0 ;
    }
    return 0 ;
}

Compilation message

long_mansion.cpp: In function 'std::vector<int> mrg(std::vector<int>, std::vector<int>)':
long_mansion.cpp:53:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     while(uk1 < a.size() || uk2 < b.size())
      |           ~~~~^~~~~~~~~~
long_mansion.cpp:53:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     while(uk1 < a.size() || uk2 < b.size())
      |                             ~~~~^~~~~~~~~~
long_mansion.cpp:56:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         if(uk1 < a.size())
      |            ~~~~^~~~~~~~~~
long_mansion.cpp:58:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |         if(uk2 < b.size())
      |            ~~~~^~~~~~~~~~
long_mansion.cpp:62:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |         if(uk1 < a.size() && a[uk1] == mn)
      |            ~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 33044 KB Output is correct
2 Correct 116 ms 38216 KB Output is correct
3 Correct 232 ms 48412 KB Output is correct
4 Correct 35 ms 33148 KB Output is correct
5 Correct 365 ms 34724 KB Output is correct
6 Correct 152 ms 33696 KB Output is correct
7 Correct 98 ms 33472 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 33044 KB Output is correct
2 Correct 116 ms 38216 KB Output is correct
3 Correct 232 ms 48412 KB Output is correct
4 Correct 35 ms 33148 KB Output is correct
5 Correct 365 ms 34724 KB Output is correct
6 Correct 152 ms 33696 KB Output is correct
7 Correct 98 ms 33472 KB Output is correct
8 Correct 144 ms 35016 KB Output is correct
9 Correct 101 ms 34836 KB Output is correct
10 Correct 232 ms 40124 KB Output is correct
11 Correct 391 ms 50440 KB Output is correct
12 Correct 138 ms 31388 KB Output is correct
13 Correct 101 ms 34988 KB Output is correct
14 Correct 127 ms 35024 KB Output is correct
15 Correct 274 ms 35832 KB Output is correct
16 Correct 446 ms 36996 KB Output is correct
17 Correct 96 ms 35028 KB Output is correct
18 Correct 137 ms 35132 KB Output is correct
19 Correct 149 ms 35312 KB Output is correct
20 Correct 436 ms 36600 KB Output is correct
21 Correct 431 ms 37008 KB Output is correct
22 Correct 390 ms 36436 KB Output is correct
23 Correct 211 ms 35320 KB Output is correct
24 Correct 201 ms 35216 KB Output is correct
25 Correct 157 ms 35252 KB Output is correct
26 Correct 115 ms 35012 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3038 ms 73808 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 33044 KB Output is correct
2 Correct 116 ms 38216 KB Output is correct
3 Correct 232 ms 48412 KB Output is correct
4 Correct 35 ms 33148 KB Output is correct
5 Correct 365 ms 34724 KB Output is correct
6 Correct 152 ms 33696 KB Output is correct
7 Correct 98 ms 33472 KB Output is correct
8 Correct 144 ms 35016 KB Output is correct
9 Correct 101 ms 34836 KB Output is correct
10 Correct 232 ms 40124 KB Output is correct
11 Correct 391 ms 50440 KB Output is correct
12 Correct 138 ms 31388 KB Output is correct
13 Correct 101 ms 34988 KB Output is correct
14 Correct 127 ms 35024 KB Output is correct
15 Correct 274 ms 35832 KB Output is correct
16 Correct 446 ms 36996 KB Output is correct
17 Correct 96 ms 35028 KB Output is correct
18 Correct 137 ms 35132 KB Output is correct
19 Correct 149 ms 35312 KB Output is correct
20 Correct 436 ms 36600 KB Output is correct
21 Correct 431 ms 37008 KB Output is correct
22 Correct 390 ms 36436 KB Output is correct
23 Correct 211 ms 35320 KB Output is correct
24 Correct 201 ms 35216 KB Output is correct
25 Correct 157 ms 35252 KB Output is correct
26 Correct 115 ms 35012 KB Output is correct
27 Execution timed out 3038 ms 73808 KB Time limit exceeded
28 Halted 0 ms 0 KB -