提出 #75902744
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
#define int ll
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
mt19937_64 rng(std::chrono::system_clock::now().time_since_epoch().count());
const int mod = 998244353;
int fix(int x){
x%=mod;
if(x<0)x+=mod;
return x;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
vi x(n+1), y(n+1), z(n+1);
for(int i = 1; i<=n; i++){
cin >> x[i] >> y[i] >> z[i];
}
vi masks(3);
vector<vi>cost(n+1,vi(2,1));
for(int b = 0; b<24; b++){
vi amt(3);
for(int i = 1; i<=n; i++){
int add = (z[i] >> b) & 1;
int L = (x[i] >> b) & 1;
int R = (y[i] >> b) & 1;
if(add)amt[2] += cost[i][0];
else amt[1] += cost[i][0];
if(L == 0 && R == 0)amt[2] += cost[i][1];
if(L == 0 && R == 1)amt[0] += cost[i][1];
if(L == 1 && R == 1)amt[1] += cost[i][1];
}
int mn = min({amt[0],amt[1],amt[2]});
int idx = 0;
if(amt[0] == mn)idx = 0;
else if(amt[1] == mn)idx = 1;
else idx = 2;
masks[idx] ^= 1<<b;
for(int i = 1; i<=n; i++){
int add = (z[i] >> b) & 1;
int L = (x[i] >> b) & 1;
int R = (y[i] >> b) & 1;
if(add && idx == 2)cost[i][0] *= 2;
if(!add && idx == 1)cost[i][0] *= 2;
if(!L && !R && idx == 2)cost[i][1] *= 2;
if(!L && R && idx == 0)cost[i][1] *= 2;
if(L && R && idx == 1)cost[i][1] *= 2;
}
}
vector<int>dp(n+1);
vector<int>res(1<<24);
const int all = (1<<24) - 1;
// cout << masks[0] << ' ' << masks[1] << ' ' << masks[2] << '\n';
for(int i = n; i>=1; i--){
{
dp[i] = 1;
int m00 = (all^x[i]) & (all^y[i]);
int m01 = (all^x[i]) & y[i];
int m11 = x[i] & y[i];
int add = (m11 & masks[0]) ^ (m01 & masks[1]) ^ (m11 & masks[2]);
int ans = 0;
for(int mask1 = masks[0] & m01; mask1 >= 0; mask1 = (mask1 - 1) & masks[0] & m01){
for(int mask2 = masks[1] & m11; mask2 >= 0; mask2 = (mask2 - 1) & masks[1] & m11){
for(int mask3 = masks[2] & m00; mask3 >= 0; mask3 = (mask3 - 1) & masks[2] & m00){
int mult = 1;
int cnt = __builtin_popcount((masks[1] & m11) ^ mask2) + __builtin_popcount(mask3);
if(cnt % 2 == 1)mult = -1;
ans += res[mask1^mask2^mask3^add] * mult; ans = fix(ans);
if(mask3 == 0)break;
}
if(mask2 == 0)break;
}
if(mask1 == 0)break;
}
dp[i] += ans; dp[i] = fix(dp[i]);
}
{
int fixed = (masks[0] & z[i]) ^ (masks[1] & z[i]);
int bigmask = ((z[i] ^ all) & masks[1]) ^ (z[i] & masks[2]);
for(int mask1 = bigmask; mask1 >= 0; mask1 = (mask1 - 1) & bigmask){
res[mask1^fixed] += dp[i]; res[mask1^fixed] %= mod;
if(mask1 == 0)break;
}
}
}
int ans = 0;
for(int i = 1; i<=n; i++){
ans += dp[i] - 1; ans = fix(ans);
}
cout << ans << '\n';
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | R - 3 つ組 |
| ユーザ | kevinyang |
| 言語 | C++23 (GCC 15.2.0) |
| 得点 | 4 |
| コード長 | 3562 Byte |
| 結果 | TLE |
| 実行時間 | > 3500 ms |
| メモリ | 160324 KiB |
ジャッジ結果
| セット名 | Sample | Subtask | All | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 4 / 4 | 0 / 3 | ||||||||
| 結果 |
|
|
|
| セット名 | テストケース |
|---|---|
| Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| Subtask | 00_sample_00.txt, 00_sample_01.txt, 01_subtask_00.txt, 01_subtask_01.txt, 01_subtask_02.txt, 01_subtask_03.txt, 01_subtask_04.txt, 01_subtask_05.txt |
| All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_subtask_00.txt, 01_subtask_01.txt, 01_subtask_02.txt, 01_subtask_03.txt, 01_subtask_04.txt, 01_subtask_05.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt, 02_random_12.txt, 02_random_13.txt, 02_random_14.txt, 02_random_15.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 00_sample_00.txt | AC | 60 ms | 134368 KiB |
| 00_sample_01.txt | AC | 57 ms | 134356 KiB |
| 00_sample_02.txt | AC | 59 ms | 134424 KiB |
| 01_subtask_00.txt | AC | 529 ms | 160236 KiB |
| 01_subtask_01.txt | AC | 334 ms | 160176 KiB |
| 01_subtask_02.txt | AC | 437 ms | 160212 KiB |
| 01_subtask_03.txt | AC | 224 ms | 160248 KiB |
| 01_subtask_04.txt | AC | 240 ms | 160156 KiB |
| 01_subtask_05.txt | AC | 238 ms | 160324 KiB |
| 02_random_00.txt | TLE | > 3500 ms | 160132 KiB |
| 02_random_01.txt | AC | 3468 ms | 160208 KiB |
| 02_random_02.txt | AC | 995 ms | 160176 KiB |
| 02_random_03.txt | AC | 994 ms | 160176 KiB |
| 02_random_04.txt | AC | 2345 ms | 160204 KiB |
| 02_random_05.txt | AC | 2364 ms | 160224 KiB |
| 02_random_06.txt | AC | 1036 ms | 160208 KiB |
| 02_random_07.txt | AC | 930 ms | 160236 KiB |
| 02_random_08.txt | AC | 298 ms | 160248 KiB |
| 02_random_09.txt | TLE | > 3500 ms | 160204 KiB |
| 02_random_10.txt | AC | 741 ms | 160144 KiB |
| 02_random_11.txt | AC | 1671 ms | 160324 KiB |
| 02_random_12.txt | AC | 473 ms | 160204 KiB |
| 02_random_13.txt | AC | 697 ms | 160140 KiB |
| 02_random_14.txt | AC | 2618 ms | 160176 KiB |
| 02_random_15.txt | AC | 1383 ms | 160236 KiB |