結果

問題 No.142 単なる配列の操作に関する実装問題
ユーザー koba-e964koba-e964
提出日時 2015-06-19 21:55:30
言語 C++11
(gcc 11.4.0)
結果
RE  
実行時間 -
コード長 1,416 bytes
コンパイル時間 785 ms
コンパイル使用メモリ 54,280 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-21 09:49:57
合計ジャッジ時間 5,021 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 AC 421 ms
4,376 KB
testcase_04 AC 1,116 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>

#define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++)

using namespace std;
typedef unsigned long long int ull;
const double EPS=1e-9;

const int N = 40000;

const int W = 64;
ull a[N] = {};


int main(void){
  int n,s,x,y,z,q;
  cin >> n >> s >> x >> y >> z >> q;
  ull tmp = s;
  REP(i, 0, n) {
    a[i / W] |= (tmp % 2) << (i % W);
    tmp = tmp * x + y;
    tmp %= z;
  }
  REP(loop_var, 0, q) {
    int s,t,u,v;
    cin >> s >> t >> u >> v;
    s--, u--;
    static ull room[4000];
    int s64 = s % 64;
    if (s / 64 == t / 64) {
      room[0] = a[s/64] >> s64;
      room[1] = 0;
    } else {
      room[0] = a[s/64] >> s64;
      REP(i, s / 64 + 1, t / 64 + 1) {
	room[i - s / 64 - 1] |= s64 ? (a[i] << (64 - s64)) : 0;
	room[i - s / 64] = a[i] >> s64;
      }
      room[v / 64 - s / 64 + 1] = 0;
    }
    int u64 = u % 64;
    int v64 = v % 64;
    if (u / 64 == v / 64) {
      a[u / 64] ^= (room[0] << u64) & ((1ULL << v64) - 1);
    } else {
      a[u / 64] ^= room[0] << u64;
      REP(i, u / 64 + 1, v / 64) {
	a[i] ^= room[i - u / 64] << u64;
	a[i] ^= u64 ? room[i - u / 64 - 1] >> (64 - u64) : 0;
      }
      ull s = room[v / 64 - u / 64] << u64;
      s ^= u64 ? room[v / 64 - u / 64 - 1] >> (64 - u64) : 0;      
      s &= (1ULL << v64) - 1;
      a[v / 64] ^= s;
    }
  }
  REP(i, 0, n) {
    cout << (a[i / 64] & (1ULL << (i % 64)) ? 'O' : 'E');
  }
  cout << endl;
}
0