結果
| 問題 | No.2160 みたりのDominator |
| コンテスト | |
| ユーザー |
hotman78
|
| 提出日時 | 2022-12-06 23:52:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,338 bytes |
| 記録 | |
| コンパイル時間 | 2,536 ms |
| コンパイル使用メモリ | 212,176 KB |
| 最終ジャッジ日時 | 2025-02-09 05:51:32 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 WA * 13 RE * 52 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<int(n);++i)
#define all(n) (n).begin(),(n).end()
using lint=long long;
array<vector<lint>,3>ng;
array<vector<lint>,3>ok;
array<vector<lint>,3>rectx;
array<vector<lint>,3>recty;
array<vector<pair<lint,lint>>,3>judgex;
array<vector<pair<lint,lint>>,3>judgey;
lint getsum(lint p,lint q,lint r,lint s){
//cerr<<p<<" "<<q<<" "<<r<<" "<<s<<endl;
//cerr<<lid<<" "<<rid<<endl;
int sz=rectx[2].size();
lint ans=0;
rep(i,sz-1){
//cerr<<ans<<endl;
ans+=max(0LL,ok[1][min(q,rectx[2][i+1])]-ok[1][max(p,rectx[2][i])])
*max(0LL,ok[2][min(s,recty[2][i+1])]-ok[2][max(r,recty[2][i])]);
}
return ans;
}
int main(){
array<int,3>n;
int m;
rep(i,3)cin>>n[i];
cin>>m;
assert(m*m<1000000);
vector<lint>s(m),t(m),a(m),b(m),u(m),v(m);
lint n1=n[0],n2=n[0]+n[1],n3=n[0]+n[1]+n[2];
rep(i,m){
cin>>u[i]>>v[i];
u[i]--;v[i]--;
if(u[i]>v[i])swap(u[i],v[i]);
if(u[i]==n3){
cout<<0<<endl;
return 0;
}
if(u[i]<n1){
a[i]=u[i]+1;
s[i]=0;
}else if(u[i]<n2){
a[i]=u[i]-n1+1;
s[i]=1;
}else{
a[i]=u[i]-n2+1;
s[i]=2;
}
if(v[i]==n3){
t[i]=s[i];
b[i]=n[a[i]]+1;
}else if(v[i]==n3+1){
t[i]=s[i];
b[i]=0;
}else if(v[i]<n1){
t[i]=0;
b[i]=v[i]+1;
}else if(v[i]<n2){
t[i]=1;
b[i]=v[i]-n1+1;
}else{
t[i]=2;
b[i]=v[i]-n2+1;
}
}
rep(i,3)n[i]++;
//rep(i,3)cerr<<n[i]<<" \n"[i==2];
//rep(i,m)cerr<<s[i]<<" "<<t[i]<<" "<<a[i]<<" "<<b[i]<<endl;
rep(i,3)ng[i].resize(n[i]+1);
rep(i,3)ok[i].resize(n[i]+1);
rep(i,3)rectx[i].emplace_back(0);
rep(i,3)rectx[i].emplace_back(n[i==2]);
rep(i,3)recty[i].emplace_back(0);
rep(i,3)recty[i].emplace_back(n[2-(i==0)]);
rep(i,m){
//cerr<<s[i]<<" "<<t[i]<<endl;
if(s[i]==t[i]){
if(a[i]>b[i])swap(a[i],b[i]);
ng[s[i]][a[i]]++;
ng[t[i]][b[i]]--;
}else{
if(s[i]>t[i]){
swap(s[i],t[i]);
swap(a[i],b[i]);
}
int idx=s[i]+t[i]-1;
rectx[idx].emplace_back(a[i]);
recty[idx].emplace_back(b[i]);
judgex[idx].emplace_back(a[i],i);
judgey[idx].emplace_back(b[i],i);
}
}
rep(i,3)rep(j,n[i])ng[i][j+1]+=ng[i][j];
rep(i,3)rep(j,n[i])ok[i][j+1]=(ng[i][j]==0);
rep(i,3)rep(j,n[i])ok[i][j+1]+=ok[i][j];
rep(i,3)sort(all(rectx[i]));
rep(i,3)sort(all(recty[i]));
rep(i,3)sort(all(judgex[i]));
rep(i,3)sort(all(judgey[i]));
//rep(i,3)cout<<rectx[i].size()<<" \n"[i==2];
// rep(i,3)assert(rectx[i].size()==recty[i].size());
//rep(i,3)rep(j,n[i]+1){
// cout<<ok[i][j]<<" \n"[j==n[i]];
//}
int id1=0,id2=0;
lint ans=0;
rep(i,n[0]){
if(ng[0][i])continue;
while(i>=rectx[0][id1+1])id1++;
while(i>=rectx[1][id2+1])id2++;
ans+=getsum(recty[0][id1],recty[0][id1+1],recty[1][id2],recty[1][id2+1]);
//cerr<<ans<<endl;
}
cout<<ans<<endl;
/**/}
hotman78