結果
| 問題 |
No.743 Segments on a Polygon
|
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2018-10-06 13:22:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,107 ms / 2,000 ms |
| コード長 | 1,948 bytes |
| コンパイル時間 | 2,064 ms |
| コンパイル使用メモリ | 184,504 KB |
| 実行使用メモリ | 65,664 KB |
| 最終ジャッジ日時 | 2024-11-14 12:40:01 |
| 合計ジャッジ時間 | 13,942 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T>
struct RangeCount{
struct BIT{
vector<T> dat;
BIT(){}
BIT(int n){dat.assign(++n,0);}
T sum(int k){
T res=0;
for(;k;k-=k&-k) res+=dat[k];
return res;
}
void add(int k,T v){
for(++k;k<(int)dat.size();k+=k&-k) dat[k]+=v;
}
};
int n;
vector<vector<int> > val;
vector<BIT> dat;
RangeCount(){}
RangeCount(int n_){
n=1;
while(n<n_) n<<=1;
val.assign(n<<1,vector<int>());
dat.reserve(n<<1);
}
void preupdate(int a,int x){
a+=n;
while(a){
val[a].emplace_back(x);
a>>=1;
}
}
void build(){
for(int i=0;i<n*2;i++){
auto &v=val[i];
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
dat.emplace_back(v.size());
}
}
void update(int a,int x,int z){
a+=n;
while(a){
auto &v=val[a];
int k=lower_bound(v.begin(),v.end(),x)-v.begin();
dat[a].add(k,z);
a>>=1;
}
}
T calc(int k,int x,int y){
auto &v=val[k];
int p=lower_bound(v.begin(),v.end(),x)-v.begin();
int q=lower_bound(v.begin(),v.end(),y)-v.begin();
return dat[k].sum(q)-dat[k].sum(p);
}
// [a, b) * [x, y)
T query(int a,int b,int x,int y){
T res=0;
for(int l=a+n,r=b+n;l<r;l>>=1,r>>=1){
if(l&1) res+=calc(l++,x,y);
if(r&1) res+=calc(--r,x,y);
}
return res;
}
};
//INSERT ABOVE HERE
signed main(){
int n,m;
scanf("%d %d",&n,&m);
vector<int> a(n),b(n);
for(int i=0;i<n;i++) scanf("%d %d",&a[i],&b[i]);
RangeCount<int> seg(m);
for(int i=0;i<n;i++){
if(a[i]>b[i]) swap(a[i],b[i]);
seg.preupdate(a[i],b[i]);
}
seg.build();
long long ans=0;
for(int i=0;i<n;i++){
ans+=seg.query(0,a[i],a[i],b[i]);
ans+=seg.query(a[i],b[i],b[i],m);
seg.update(a[i],b[i],1);
}
printf("%lld\n",ans);
return 0;
}
beet