結果
| 問題 | No.2160 みたりのDominator |
| コンテスト | |
| ユーザー |
hotman78
|
| 提出日時 | 2022-12-07 15:11:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,985 bytes |
| 記録 | |
| コンパイル時間 | 2,278 ms |
| コンパイル使用メモリ | 221,304 KB |
| 最終ジャッジ日時 | 2025-02-09 06:14:05 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 RE * 54 |
ソースコード
#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>ok2;
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){
int sz=rectx[2].size();
lint ans=0;
rep(i,sz-1){
if(ok2[2][i]){
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<lint,3>n;
lint 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]=0;
}else if(v[i]==n3+1){
t[i]=s[i];
b[i]=n[s[i]]+1;
}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)ok2[i].resize(rectx[i].size()-1,0);
rep(i,3){
ok2[i][0]=1;
map<lint,lint>tmp;
rep(j,judgex[i].size()){
tmp[judgex[i][j].second]++;
tmp[judgey[i][j].second]--;
if(tmp[judgex[i][j].second]==0)tmp.erase(judgex[i][j].second);
if(tmp[judgey[i][j].second]==0)tmp.erase(judgey[i][j].second);
if(tmp.size()==0){
ok2[i][j+1]=1;
}
//cerr<<tmp.size()<<endl;
}
}
//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,ok[i].size()){
// cout<<ok[i][j]<<" \n"[j==ok[i].size()-1];
//}
//cout<<endl;;
//rep(i,3)rep(j,ok2[i].size()){
// cout<<ok2[i][j]<<" \n"[j==ok2[i].size()-1];
//}
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++;
if(!ok2[0][id1]||!ok2[1][id2])continue;
ans+=getsum(recty[0][id1],recty[0][id1+1],recty[1][id2],recty[1][id2+1]);
//cerr<<ans<<endl;
}
cout<<ans<<endl;
/**/}
hotman78