提出 #72198169
ソースコード 拡げる
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops,fast-math")
using namespace std;
typedef long long ll;
const int mod=1000000007;
int n,t,b[1000010];
pair<int,int> a[1000010];
struct Node {
int val,cnt;
Node() {
val=0; cnt=0;
}
Node(int v, int c) {
val=v; cnt=c;
}
};
Node tree[2000001];
Node merge(Node a, Node b) {
if(a.val>b.val) return a;
if(a.val<b.val) return b;
return Node(a.val, (a.cnt+b.cnt)%mod);
}
void init() {
for(int i=n-1;i;i--) tree[i]=merge(tree[i<<1],tree[i<<1^1]);
}
Node sum(int l, int r) {
if(l>r) return {0,1};
Node ret; l+=n-1; r+=n-1;
for(;l<=r;l>>=1,r>>=1) {
if(l&1) ret=merge(tree[l++],ret); if(~r&1) ret=merge(ret,tree[r--]);
}
return ret;
}
void upd(int ind, Node val) {
ind+=n-1; tree[ind]=val;
for(;ind;ind>>=1) tree[ind>>1]=merge(tree[ind],tree[ind^1]);
}
int x,y;
pair<int,int> pa[202020];
queue<pair<int,Node>> updq;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=1;i<=n;i++) {
cin >> x >> y;
pa[i]={x,y};
}
sort(pa+1,pa+1+n);
for(int i=1;i<=n;i++) {
a[i]={pa[i].second,i}; b[i]=pa[i].second;
}
sort(a+1, a+1+n);
vector<int> q(n+1);
for(int i=1;i<=n;i++) q[a[i].second]=i;
updq.push({q[1],{1,1}});
for(int i=2;i<=n;i++) {
if(pa[i].first!=pa[i-1].first) {
while(!updq.empty()) {
auto j=updq.front(); updq.pop();
upd(j.first,j.second);
}
}
int yes=0,no=q[i],mid=(yes+no)/2;
while(yes+1<no) {
if(a[mid].first<b[i]) yes=mid;
else no=mid;
mid=(yes+no)/2;
}
auto res=sum(1,yes);
if(!res.val && !res.cnt) res.cnt=1;
updq.push({q[i],{res.val+1, res.cnt}});
//upd(q[i],{res.val+1, res.cnt});
}
while(!updq.empty()) {
auto j=updq.front(); updq.pop();
upd(j.first,j.second);
}
auto res=sum(1,n);
cout << res.val;
}
提出情報
提出日時
2026-01-03 21:41:49+0900
問題
E - Kite
ユーザ
Hakuaa_2
言語
C++23 (GCC 15.2.0)
得点
450
コード長
2122 Byte
結果
AC
実行時間
95 ms
メモリ
26056 KiB
コンパイルエラー
./Main.cpp: In function 'Node sum(int, int)':
./Main.cpp:30:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
30 | if(l&1) ret=merge(tree[l++],ret); if(~r&1) ret=merge(ret,tree[r--]);
| ^~
./Main.cpp:30:43: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
30 | if(l&1) ret=merge(tree[l++],ret); if(~r&1) ret=merge(ret,tree[r--]);
| ^~
ジャッジ結果
セット名
Sample
All
得点 / 配点
0 / 0
450 / 450
結果
セット名
テストケース
Sample
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_1_00.txt, 01_random_1_01.txt, 01_random_1_02.txt, 01_random_1_03.txt, 01_random_1_04.txt, 01_random_1_05.txt, 02_random_2_00.txt, 02_random_2_01.txt, 02_random_2_02.txt, 02_random_2_03.txt, 02_random_2_04.txt, 02_random_2_05.txt, 03_sorted_00.txt, 03_sorted_01.txt, 03_sorted_02.txt, 03_sorted_03.txt, 03_sorted_04.txt, 03_sorted_05.txt, 04_same_coord_00.txt, 04_same_coord_01.txt, 04_same_coord_02.txt
ケース名
結果
実行時間
メモリ
00_sample_00.txt
AC
7 ms
19328 KiB
00_sample_01.txt
AC
7 ms
19184 KiB
00_sample_02.txt
AC
6 ms
19384 KiB
01_random_1_00.txt
AC
57 ms
21696 KiB
01_random_1_01.txt
AC
95 ms
23624 KiB
01_random_1_02.txt
AC
78 ms
22888 KiB
01_random_1_03.txt
AC
94 ms
23624 KiB
01_random_1_04.txt
AC
93 ms
23656 KiB
01_random_1_05.txt
AC
94 ms
23660 KiB
02_random_2_00.txt
AC
58 ms
23660 KiB
02_random_2_01.txt
AC
60 ms
23612 KiB
02_random_2_02.txt
AC
64 ms
23732 KiB
02_random_2_03.txt
AC
67 ms
23604 KiB
02_random_2_04.txt
AC
67 ms
23636 KiB
02_random_2_05.txt
AC
75 ms
23632 KiB
03_sorted_00.txt
AC
57 ms
23632 KiB
03_sorted_01.txt
AC
74 ms
23548 KiB
03_sorted_02.txt
AC
59 ms
23632 KiB
03_sorted_03.txt
AC
58 ms
23656 KiB
03_sorted_04.txt
AC
73 ms
23612 KiB
03_sorted_05.txt
AC
57 ms
23596 KiB
04_same_coord_00.txt
AC
72 ms
26056 KiB
04_same_coord_01.txt
AC
59 ms
23616 KiB
04_same_coord_02.txt
AC
46 ms
26044 KiB