結果
| 問題 |
No.728 ギブ and テイク
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-08-07 04:10:27 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 101 ms / 3,000 ms |
| コード長 | 1,103 bytes |
| コンパイル時間 | 430 ms |
| コンパイル使用メモリ | 51,404 KB |
| 実行使用メモリ | 10,856 KB |
| 最終ジャッジ日時 | 2024-09-19 18:24:47 |
| 合計ジャッジ時間 | 2,663 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
typedef pair<int,int>P;
#define getchar getchar_unlocked
inline int in() {
int n, c;
while ((c = getchar()) < '0') if (c == EOF) return -1;
n = c - '0';
while ((c = getchar()) >= '0') n = n * 10 + c - '0';
return n;
}
const int MAX_N = 300001;
int i,n,q;
ll ans = 0;
int bt[MAX_N], a[MAX_N], l[MAX_N], r[MAX_N];
P p[2*MAX_N];
inline void add(int i, int x){
while(i < n+1) bt[i] += x, i += i & -i;
}
inline int sum(int i){
int s = 0;
while(i > 0) s += bt[i], i -= i & -i;
return s;
}
int main()
{
n = in();
for(i = 0; i < n; i++){
a[i] = in();
}
for(i = 0; i < n; i++){
l[i] = in(), r[i] = in();
p[i] = P(a[i], n+i);
p[n+i] = P(a[i]-l[i], i);
}
sort(p, p+2*n);
for(i = 0; i < 2*n; i++){
q = p[i].second;
if(q >= n){
q -= n;
ans += sum(upper_bound(a, a+n, a[q]+r[q]) - a) - sum(q+1);
}else{
add(q+1,1);
}
}
printf("%lld\n",ans);
return 0;
}