結果
| 問題 | No.2160 みたりのDominator |
| コンテスト | |
| ユーザー |
hotman78
|
| 提出日時 | 2022-12-06 23:50:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,129 bytes |
| 記録 | |
| コンパイル時間 | 2,602 ms |
| コンパイル使用メモリ | 213,136 KB |
| 最終ジャッジ日時 | 2025-02-09 05:51:11 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 22 WA * 53 RE * 18 |
ソースコード
#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;
vector<lint>v;
void pre(){
int sz=rectx[2].size();
v.resize(sz);
rep(i,sz-1){
v[i]=(ok[1][rectx[2][i+1]]-ok[1][rectx[2][i]])
*(ok[2][recty[2][i+1]]-ok[2][recty[2][i]]);
}
rep(i,sz-1)v[i+1]+=v[i];
//rep(i,sz){
// cerr<<v[i]<<" \n"[i==sz-1];
//}
}
lint getsum(lint p,lint q,lint r,lint s){
int sz=rectx[2].size();
lint a=lower_bound(all(rectx[2]),p)-rectx[2].begin();
lint b=lower_bound(all(rectx[2]),q)-rectx[2].begin()-1;
lint c=lower_bound(all(recty[2]),r)-recty[2].begin();
lint d=lower_bound(all(recty[2]),s)-recty[2].begin()-1;
//cerr<<p<<" "<<q<<" "<<r<<" "<<s<<endl;
//cerr<<min(b,d)<<" "<<max(a,c)<<endl;
lint ans=0;//(min(b,d)-1>=max(a,c) ? v[min(b,d)-1]-v[max(a,c)] : 0);
assert(min(b,d)>=0);
{
lint i=min(b,d);
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(min(b,d)!=max(a,c)){
lint i=max(a,c);
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;
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;
pre();
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