結果
問題 | No.2875 What is My Rank? |
ユーザー |
![]() |
提出日時 | 2024-09-06 22:42:18 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,724 bytes |
コンパイル時間 | 2,253 ms |
コンパイル使用メモリ | 205,912 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-06 22:42:23 |
合計ジャッジ時間 | 5,015 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 6 WA * 26 |
ソースコード
//#pragma GCC target("avx2")//#pragma GCC optimize("O3")//#pragma GCC optimize("unroll-loops")#include <bits/stdc++.h>using namespace std;using ll = long long;using pii = pair<int,int>;using pll = pair<ll,ll>;using pli = pair<ll,int>;#define TEST cerr << "TEST" << endl#define AMARI 998244353//#define AMARI 1000000007#define el '\n'#define El '\n'll beki(ll a,ll b){ll temp = a,ans = 1;while(b){if(b % 2){ans *= temp;ans %= AMARI;}temp *= temp;temp %= AMARI;b /= 2;}return ans;}ll gyakugen(ll a){return beki(a,AMARI - 2);}//a + (a + 1) + ... + bll sum(ll a ,ll b){ll ans = (b - a + 1);ans *= (a + b);ans /= 2;ans %= AMARI;return ans;}//0が覆っている時、0が負ける確率ll func1(ll l0,ll r0,ll l1,ll r1){ll ans = l1 - l0; ans *= (r1 - l1 + 1); ans %= AMARI;ans += sum(1,r1 - l1);//cerr << ans << ' ' << r1 - l1 << el;ans *= gyakugen((r0 - l0 + 1) * (r1 - l1 + 1) % AMARI);ans %= AMARI;return ans;}ll func2(ll l0,ll r0,ll l1,ll r1){ll ans = sum(r1 - r0,r1 - l1 + 1);ll temp = r1 - l1 + 1; temp *= (l1 - l0 + 1); temp %= AMARI;ans += temp; ans %= AMARI;ans *= gyakugen((r0 - l0 + 1) * (r1 - l1 + 1) % AMARI);ans %= AMARI;return ans;}#define MULTI_TEST_CASE falsevoid solve(void){//問題を見たらまず「この問題設定から言えること」をいっぱい言う//一個回答に繋がりそうな解法が見えても、実装や細かい詰めに時間がかかりそうなら別の方針を考えてみる//添え字回りで面倒になりそうなときは楽になる言い換えを実装の前にじっくり考える//ある程度考察しても全然取っ掛かりが見えないときは実験をしてみる//よりシンプルな問題に言い換えられたら、言い換えた先の問題を自然言語ではっきりと書くint n;cin >> n;vector<ll> l(n),r(n);for(int i = 0; i < n; i++){cin >> l[i] >> r[i];}ll ans = 1;for(int i = 1; i < n; i++){//絶対に人1が勝つif(l[0] >= r[i]){continue;}//絶対に人1が負けるif(r[0] < l[i]){ans += 1;continue;}//人1が覆っているif(l[0] < l[i] && r[i] <= r[0]){ans += func1(l[0],r[0],l[i],r[i]);continue;}//人1が覆われているif(l[i] <= l[0] && r[0] < r[i]){ll temp2 = func1(l[i],r[i],l[0],r[0]);temp2 = 1 - temp2; temp2 += AMARI;ll temp = gyakugen((r[i] - l[i] + 1) * (r[0] - l[0] + 1) % AMARI);temp *= (r[0] - l[0] + 1); temp %= AMARI;temp2 += temp; if(temp2 < 0)temp2 += AMARI;ans += temp2; ans %= AMARI;continue;}//人1が劣勢if(l[0] < l[i] && r[0] < r[i]){ans += func2(l[0],r[0],l[1],r[1]);continue;}//人1が優勢ll temp2 = func2(l[i],r[i],l[0],r[0]);temp2 = 1 - temp2; temp2 += AMARI;ll temp = gyakugen((r[i] - l[i] + 1) * (r[0] - l[0] + 1) % AMARI);temp *= (r[0] - l[0] + 1); temp %= AMARI;temp2 += temp; if(temp2 < 0)temp2 += AMARI;ans += temp2; ans %= AMARI;}cout << ans << el;return;}void calc(void){return;}signed main(void){cin.tie(nullptr);ios::sync_with_stdio(false);calc();int t = 1;if(MULTI_TEST_CASE)cin >> t;while(t--){solve();}return 0;}