답안 #815280

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
815280 2023-08-08T13:53:19 Z minhcool Ancient Machine 2 (JOI23_ancient2) C++17
0 / 100
6 ms 336 KB
//#define local
#ifndef local
#include "ancient2.h"
#endif
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
 
//#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
 
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;
 
const int N = 3e5 + 5;
 
const int oo = 1e18 + 7, mod = 1e9 + 7;
 
mt19937 rng(1);
 
int rnd(int l, int r){
	int temp = rng() % (r - l + 1);
	return abs(temp) + l;
}
 
int n;
 
bitset<1005> basis[1005];
bool vis[1005];
bool ck[1005];

string cor;

#ifdef local
int Query(int m, vector<int> a, vector<int> b){
    int itr = 0;
    for(int i = 0; i < 1000; i++){
        if(cor[i] == '0') itr = a[itr];
        else itr = b[itr];
    }
}
#endif
 
bool ckk(int p, int q){
    assert(p > q);
    int m = 2 * p;
    vector<int> vc1(m), vc2(m);
    for(int i = 0; i < m; i++) vc1[i] = i + 1;
    vc1[2 * p - 1] = p, vc1[p - 1] = 0;
    vc2 = vc1;
    vc2[q] += p, vc2[q + p] -= p;
    //for(auto it : vc1) assert(it >= 0 && it < m);
    //for(auto it : vc2) assert(it >= 0 && it < m);
    int temp = Query(m, vc1, vc2);
    return (temp >= p);
}
 
int in(bitset<1005> bts){
    bool temp = 0;
    for(int i = 0; i < 1000; i++){
        if(!bts[i]) continue;
        if(!vis[i]){
            vis[i] = 1;
            ck[i] = temp;
            basis[i] = bts;
            return i;
        }
        bts ^= basis[i];
        temp ^= ck[i];
    }
    return -1;
}
 
int cal(bitset<1005> bts){
    bool ans = 0;
    for(int i = 0; i < 1000; i++){
        if(!bts[i]) continue;
        bts ^= basis[i];
        ans ^= ck[i];
    }
    assert(ans == 0 || ans == 1);
    return ans;
}
 
string s;
 
string Solve(int N){
    n = N;
    s.resize(n);
    int p = 55;
    for(int itr = 0; itr < 100; itr++){
        vector<int> a(itr + 3), b(itr + 3);
        for(int i = 0; i < itr; i++) a[i] = b[i] = i + 1;
        a[itr] = itr + 1;
        b[itr] = itr + 2;
        a[itr + 1] = b[itr + 1] = itr + 1;
        a[itr + 2] = b[itr + 2] = itr + 2;
        int temp = Query(itr + 3, a, b);
        if(temp == itr + 1) s[itr] = '0';
        else s[itr] = '1';
    }
    //return "";
    for(int itr = 100; itr < 200; itr++){
        vector<int> a(101), b(101);
        for(int i = 0; i < 99; i++) a[i] = b[i] = i + 1;
        a[99] = b[99] = 0;
        if(s[itr - 100] == '0') b[itr - 100] = 100;
        else a[itr - 100] = 100;
        a[100] = b[100] = 100;
        int temp = Query(101, a, b);
        if(temp == 100) s[itr] = char(97 - s[itr - 100]);
        else s[itr] = s[itr - 100];
    }
    //return "";
    for(int itr = 0; itr < 200; itr++){
        bitset<1005> bts;
        for(int i = 0; i <= 1000; i++) bts[i] = 0;
        bts[itr] = 1;
        int pos = in(bts);
        if(pos < 0) continue;
        if(s[itr] == '1') ck[itr] ^= 1;
    }
    //return "";
    int cnt = 0;
    for(int l = 1; l <= 55; l++){
        for(int r = 0; r < l; r++){
            bitset<1005> bts;
            for(int i = 0; i <= 1000; i++) bts[i] = 0;
            for(int i = r; i <= 1000; i += l) bts[i] = 1;
            int temp = in(bts);
            if(temp < 0) continue;
            //cout << l << " " << r << "\n";
            cnt++;
            bool temp2 = ckk(l, r);
            ck[temp] ^= temp2;
            if(cnt == 800) break;
        }
        cout << l << " " << cnt << "\n";
        if(cnt == 800) break;
    }
    cout << cnt << "\n";
    for(int i = 200; i < 1000; i++){
        bitset<1005> bts;
        bts[i] = 1;
        s[i] = char(48 + cal(bts));
    }
    //for(int i = 0; i < 200; i++) assert(s[i] >= '0' && s[i] <= '1');
    return s;
}
 
#ifdef local
void process(){
    for(int i = 1; i <= 1000; i++) cor += char(48 + rnd(0, 1));
    cout << cor << "\n";
    cout << Solve(1000) << "\n";
}
 
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	process();
}
#endif

Compilation message

ancient2.cpp:22:21: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   22 | const int oo = 1e18 + 7, mod = 1e9 + 7;
      |                ~~~~~^~~
ancient2.cpp: In function 'std::string Solve(int)':
ancient2.cpp:95:9: warning: unused variable 'p' [-Wunused-variable]
   95 |     int p = 55;
      |         ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 336 KB Wrong Answer [1]
2 Halted 0 ms 0 KB -