답안 #494595

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
494595 2021-12-15T19:41:49 Z inksamurai Checker (COCI19_checker) C++17
110 / 110
1850 ms 130464 KB
#include <bits/stdc++.h>
// cut here
#ifdef _MSC_VER
#include <intrin.h>
#endif
 
namespace atcoder {
 
namespace internal {
 
int ceil_pow2(int n) {
    int x = 0;
    while ((1U << x) < (unsigned int)(n)) x++;
    return x;
}
 
int bsf(unsigned int n) {
#ifdef _MSC_VER
    unsigned long index;
    _BitScanForward(&index, n);
    return index;
#else
    return __builtin_ctz(n);
#endif
}
 
}  // namespace internal
 
}  // namespace atcoder
 
 
namespace atcoder {
 
template <class S, S (*op)(S, S), S (*e)()> struct segtree {
  public:
    segtree() : segtree(0) {}
    segtree(int n) : segtree(std::vector<S>(n, e())) {}
    segtree(const std::vector<S>& v) : _n(int(v.size())) {
        log = internal::ceil_pow2(_n);
        size = 1 << log;
        d = std::vector<S>(2 * size, e());
        for (int i = 0; i < _n; i++) d[size + i] = v[i];
        for (int i = size - 1; i >= 1; i--) {
            update(i);
        }
    }
 
    void set(int p, S x) {
        assert(0 <= p && p < _n);
        p += size;
        d[p] = x;
        for (int i = 1; i <= log; i++) update(p >> i);
    }
 
    S get(int p) {
        assert(0 <= p && p < _n);
        return d[p + size];
    }
 
    S prod(int l, int r) {
        assert(0 <= l && l <= r && r <= _n);
        S sml = e(), smr = e();
        l += size;
        r += size;
 
        while (l < r) {
            if (l & 1) sml = op(sml, d[l++]);
            if (r & 1) smr = op(d[--r], smr);
            l >>= 1;
            r >>= 1;
        }
        return op(sml, smr);
    }
 
    S all_prod() { return d[1]; }
 
    template <bool (*f)(S)> int max_right(int l) {
        return max_right(l, [](S x) { return f(x); });
    }
    template <class F> int max_right(int l, F f) {
        assert(0 <= l && l <= _n);
        assert(f(e()));
        if (l == _n) return _n;
        l += size;
        S sm = e();
        do {
            while (l % 2 == 0) l >>= 1;
            if (!f(op(sm, d[l]))) {
                while (l < size) {
                    l = (2 * l);
                    if (f(op(sm, d[l]))) {
                        sm = op(sm, d[l]);
                        l++;
                    }
                }
                return l - size;
            }
            sm = op(sm, d[l]);
            l++;
        } while ((l & -l) != l);
        return _n;
    }
 
    template <bool (*f)(S)> int min_left(int r) {
        return min_left(r, [](S x) { return f(x); });
    }
    template <class F> int min_left(int r, F f) {
        assert(0 <= r && r <= _n);
        assert(f(e()));
        if (r == 0) return 0;
        r += size;
        S sm = e();
        do {
            r--;
            while (r > 1 && (r % 2)) r >>= 1;
            if (!f(op(d[r], sm))) {
                while (r < size) {
                    r = (2 * r + 1);
                    if (f(op(d[r], sm))) {
                        sm = op(d[r], sm);
                        r--;
                    }
                }
                return r + 1 - size;
            }
            sm = op(d[r], sm);
        } while ((r & -r) != r);
        return 0;
    }
 
  private:
    int _n, size, log;
    std::vector<S> d;
 
    void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
};
 
}  // namespace atcoder
// cut here 
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define rep(i,n) for(int i=0;i<n;i++)
#define crep(i,x,n) for(int i=x;i<n;i++)
#define drep(i,n) for(int i=n-1;i>=0;i--)
#define vec(...) vector<__VA_ARGS__>
#define _3oKjziw ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
typedef long double ld;
using pii=pair<int,int>;
using vi=vector<int>;

pii op(pii l,pii r){
	return {min(l.fi,r.fi),max(l.se,r.se)};
}
pii e(){
	return {1e9,-1};
}

void slv(){
	int n;
	cin>>n;
	string s;
	cin>>s;
	vec(vec(pii)) adj(n);
	rep(i,n-3){
		int u,v,_c;
		cin>>u>>v>>_c;
		u--,v--;
		assert(u>=0 and v>=0);
		adj[u].pb({v,_c});
		adj[v].pb({u,_c});
	}
	atcoder::segtree<pii,op,e> seg(n+1);
	rep(v,n){
		for(auto edge : adj[v]){
			int u=edge.fi;
			seg.set(v,op(seg.get(v),{u,u}));
		}
	}
	bool pok=1;
	rep(v,n){
		for(auto edge : adj[v]){
			int u=edge.fi;
			if(v>u) continue;
			pii p=seg.prod(v+1,u);
			if(p.fi<v or p.se>u){
				pok=0;
			}
		}
	}
	if(not pok){
		cout<<"neispravna triangulacija\n";
		return;
	}
	rep(i,n-1){
		adj[i].pb({i+1,s[i]-'0'});	
		adj[i+1].pb({i,s[i]-'0'});
	}
	adj[n-1].pb({0,s[n-1]-'0'});
	adj[0].pb({n-1,s[n-1]-'0'});
	int m=sqrt(n);
	vi stars;
	vi star(n,0);
	rep(v,n){
		if(sz(adj[v])>m){
			star[v]=1;
			stars.pb(v);
		}
	}
	std::map<pii,int> mp;
	rep(v,n){
		for(auto edge : adj[v]){
			int u=edge.fi;
			mp[{v,u}]=edge.se;
		}
	}
	pok=1;
	rep(v,n){
		if(star[v]==0){
			rep(i,sz(adj[v])){
				int u=adj[v][i].fi;
				crep(j,i+1,sz(adj[v])){
					int u1=adj[v][j].fi;
					if(min({mp[{u,v}],mp[{u,u1}],mp[{v,u1}]})!=0
						and (mp[{v,u}]==mp[{v,u1}] 
							or mp[{v,u1}]==mp[{u,u1}] 
							or mp[{u,u1}]==mp[{v,u}])){
						pok=0;
					}
				}
			}
			rep(i,sz(adj[v])){
				int u=adj[v][i].fi;
				for(auto u1 : stars){
					if(min({mp[{u,v}],mp[{u,u1}],mp[{v,u1}]})!=0
						and (mp[{v,u}]==mp[{v,u1}] 
							or mp[{v,u1}]==mp[{u,u1}]
							or mp[{u,u1}]==mp[{v,u}])){
						pok=0;
					}
				}
			}
		}
	}
	if(not pok){
		cout<<"neispravno bojenje\n";
		return;
	}
	cout<<"tocno\n";
}

int main(){
_3oKjziw;
	int t;
	cin>>t;
	slv();
//	
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 308 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 2 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 308 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 2 ms 332 KB Output is correct
8 Correct 10 ms 1592 KB Output is correct
9 Correct 10 ms 1484 KB Output is correct
10 Correct 2 ms 460 KB Output is correct
11 Correct 1 ms 460 KB Output is correct
12 Correct 9 ms 1484 KB Output is correct
13 Correct 11 ms 1508 KB Output is correct
14 Correct 10 ms 1488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1259 ms 129936 KB Output is correct
2 Correct 1206 ms 130388 KB Output is correct
3 Correct 176 ms 20612 KB Output is correct
4 Correct 158 ms 20616 KB Output is correct
5 Correct 148 ms 20580 KB Output is correct
6 Correct 1638 ms 101028 KB Output is correct
7 Correct 1849 ms 101140 KB Output is correct
8 Correct 137 ms 21816 KB Output is correct
9 Correct 137 ms 21772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1186 ms 129908 KB Output is correct
2 Correct 1194 ms 130236 KB Output is correct
3 Correct 1242 ms 130464 KB Output is correct
4 Correct 1226 ms 130104 KB Output is correct
5 Correct 1215 ms 130184 KB Output is correct
6 Correct 1766 ms 101052 KB Output is correct
7 Correct 1698 ms 101016 KB Output is correct
8 Correct 1496 ms 101116 KB Output is correct
9 Correct 1850 ms 101040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 308 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 2 ms 332 KB Output is correct
8 Correct 10 ms 1592 KB Output is correct
9 Correct 10 ms 1484 KB Output is correct
10 Correct 2 ms 460 KB Output is correct
11 Correct 1 ms 460 KB Output is correct
12 Correct 9 ms 1484 KB Output is correct
13 Correct 11 ms 1508 KB Output is correct
14 Correct 10 ms 1488 KB Output is correct
15 Correct 1259 ms 129936 KB Output is correct
16 Correct 1206 ms 130388 KB Output is correct
17 Correct 176 ms 20612 KB Output is correct
18 Correct 158 ms 20616 KB Output is correct
19 Correct 148 ms 20580 KB Output is correct
20 Correct 1638 ms 101028 KB Output is correct
21 Correct 1849 ms 101140 KB Output is correct
22 Correct 137 ms 21816 KB Output is correct
23 Correct 137 ms 21772 KB Output is correct
24 Correct 1186 ms 129908 KB Output is correct
25 Correct 1194 ms 130236 KB Output is correct
26 Correct 1242 ms 130464 KB Output is correct
27 Correct 1226 ms 130104 KB Output is correct
28 Correct 1215 ms 130184 KB Output is correct
29 Correct 1766 ms 101052 KB Output is correct
30 Correct 1698 ms 101016 KB Output is correct
31 Correct 1496 ms 101116 KB Output is correct
32 Correct 1850 ms 101040 KB Output is correct
33 Correct 1263 ms 130332 KB Output is correct
34 Correct 1236 ms 130176 KB Output is correct
35 Correct 192 ms 20648 KB Output is correct
36 Correct 146 ms 20564 KB Output is correct
37 Correct 1274 ms 130428 KB Output is correct
38 Correct 1275 ms 130464 KB Output is correct
39 Correct 1208 ms 130172 KB Output is correct
40 Correct 1568 ms 101080 KB Output is correct
41 Correct 1705 ms 101132 KB Output is correct
42 Correct 148 ms 21756 KB Output is correct
43 Correct 1698 ms 101140 KB Output is correct