結果
| 問題 | No.2160 みたりのDominator |
| コンテスト | |
| ユーザー |
hotman78
|
| 提出日時 | 2022-12-08 15:14:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,933 bytes |
| 記録 | |
| コンパイル時間 | 2,714 ms |
| コンパイル使用メモリ | 222,524 KB |
| 最終ジャッジ日時 | 2025-02-09 06:25:08 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 55 WA * 38 |
ソースコード
#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;
vector<lint>v;
void pre(){
int sz=rectx[2].size();
v.resize(sz);
rep(i,sz-1){
if(ok2[2][i]){
v[i+1]=max(0LL,ok[1][rectx[2][i+1]]-ok[1][rectx[2][i]])
*max(0LL,ok[2][recty[2][i+1]]-ok[2][recty[2][i]]);
}
}
rep(i,sz-1)v[i+1]+=v[i];
}
lint get(lint l,lint r){
if(r<=l)return 0LL;
return v[r]-v[l];
}
lint getsum(lint p,lint q,lint r,lint s){
int sz=rectx[2].size();
lint ans=0;
auto a=upper_bound(all(rectx[2]),p)-rectx[2].begin()-1;
auto b=lower_bound(all(rectx[2]),q)-rectx[2].begin();
auto c=upper_bound(all(recty[2]),r)-recty[2].begin()-1;
auto d=lower_bound(all(recty[2]),s)-recty[2].begin();
lint left=max(a,c),right=min(b,d);
//cerr<<left<<" "<<right<<endl;
{
lint i=left;
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])]);
}
}
if(left<right){
lint i=right;
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])]);
}
}
ans+=get(left+1,right);
return ans;
}
int main(){
array<lint,3>n;
lint m;
rep(i,3)cin>>n[i];
cin>>m;
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;
pre();
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