結果
| 問題 |
No.1074 増殖
|
| コンテスト | |
| ユーザー |
kiyoshi0205
|
| 提出日時 | 2020-06-05 22:51:52 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 149 ms / 2,000 ms |
| コード長 | 9,043 bytes |
| コンパイル時間 | 3,699 ms |
| コンパイル使用メモリ | 210,724 KB |
| 実行使用メモリ | 10,632 KB |
| 最終ジャッジ日時 | 2024-12-17 17:05:03 |
| 合計ジャッジ時間 | 5,477 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
// #include<ext/pb_ds/assoc_container.hpp>
// #include<ext/pb_ds/tree_policy.hpp>
// #include<ext/pb_ds/tag_and_trait.hpp>
// using namespace __gnu_pbds;
// #include<boost/multiprecision/cpp_int.hpp>
// namespace multiprecisioninteger = boost::multiprecision;
// using cint=multiprecisioninteger::cpp_int;
using namespace std;
using ll=long long;
#define double long double
using datas=pair<ll,ll>;
using ddatas=pair<double,double>;
using tdata=pair<ll,datas>;
using vec=vector<ll>;
using mat=vector<vec>;
using pvec=vector<datas>;
using pmat=vector<pvec>;
// using llset=tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>;
#define For(i,a,b) for(i=a;i<(ll)b;++i)
#define bFor(i,b,a) for(i=b,--i;i>=(ll)a;--i)
#define rep(i,N) For(i,0,N)
#define rep1(i,N) For(i,1,N)
#define brep(i,N) bFor(i,N,0)
#define brep1(i,N) bFor(i,N,1)
#define all(v) (v).begin(),(v).end()
#define allr(v) (v).rbegin(),(v).rend()
#define vsort(v) sort(all(v))
#define vrsort(v) sort(allr(v))
#define endl "\n"
#define eb emplace_back
#define print(v) cout<<v<<endl
#define printyes cout<<"Yes"<<endl
#define printno cout<<"No"<<endl
#define printYES cout<<"YES"<<endl
#define printNO cout<<"NO"<<endl
#define output(v) do{bool f=0;for(auto outi:v){cout<<(f?" ":"")<<outi;f=1;}cout<<endl;}while(0)
#define matoutput(v) do{for(auto outimat:v)output(outimat);}while(0)
const ll mod=1000000007;
// const ll mod=998244353;
const ll inf=1LL<<60;
const double PI = acos(-1);
const double eps = 1e-9;
template<class T> inline bool chmax(T& a,T b){bool x=a<b;if(x)a=b;return x;}
template<class T> inline bool chmin(T& a,T b){bool x=a>b;if(x)a=b;return x;}
void startupcpp(){
cin.tie(0);
ios::sync_with_stdio(false);
cout<<fixed<<setprecision(15);
}
double distance(ddatas x,ddatas y){
double a=x.first-y.first,b=x.second-y.second;
return sqrt(a*a+b*b);
}
ll modinv(ll a) {
ll b=mod,u=1,v=0,t;
while(b){
t=a/b;
a-=t*b; swap(a,b);
u-=t*v; swap(u,v);
}
return (u+mod)%mod;
}
ll moddevide(ll a,ll b){return (a*modinv(b))%mod;}
vec modncrlistp,modncrlistm;
ll modncr(ll n,ll r){
if(n<r)return 0;
ll i,size=modncrlistp.size();
if(size<=n){
modncrlistp.resize(n+1);
modncrlistm.resize(n+1);
if(!size){
modncrlistp[0]=modncrlistm[0]=1;
size++;
}
For(i,size,n+1){
modncrlistp[i]=modncrlistp[i-1]*i%mod;
modncrlistm[i]=modinv(modncrlistp[i]);
}
}
return modncrlistp[n]*modncrlistm[r]%mod*modncrlistm[n-r]%mod;
}
ll modpow(ll a,ll n){
ll res=1;
while(n>0){
if(n&1)res=res*a%mod;
a=a*a%mod;
n>>=1;
}
return res;
}
ll gcd(ll a,ll b){if(!b)return abs(a);return (a%b==0)?abs(b):gcd(b,a%b);}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll countdigits(ll n){
ll ans=0;
while(n){n/=10;ans++;}
return ans;
}
ll sumdigits(ll n){
ll ans=0;
while(n){ans+=n%10;n/=10;}
return ans;
}
void topcoder(vector<int>& v){
string s;
while(1){
cin>>s;
int i=s[0]=='{',x=0;
while(s[i]>='0'&&s[i]<='9'){
x=x*10+s[i]-'0';
++i;
}
v.eb(x);
if(s[i]=='}')break;
}
}
void topcoder(string& s){
string t;
cin>>t;
int i=1;
while(t[i]!='"'){
s+=t[i++];
}
}
struct segment_tree_chminmaxadd_rsq {
using T = ll;
const T ide = 0;
static const T INF = std::numeric_limits<T>::max();
static const T NINF = std::numeric_limits<T>::min();
struct node {
T sum;
T gst1, gst2, gcnt;
T lst1, lst2, lcnt;
ll len;
ll add;
node(): gst2(NINF), gcnt(1), lst2(INF), lcnt(1), len(1), add(0) {}
};
std::vector<node> v;
ll n;
ll h;
inline void fix(int k) {
node& p = v[k];
node& l = v[k * 2 + 0];
node& r = v[k * 2 + 1];
p.sum = l.sum + r.sum;
if(r.gst1 < l.gst1) {
p.gst1 = l.gst1;
p.gcnt = l.gcnt;
p.gst2 = std::max(l.gst2, r.gst1);
}
else if(l.gst1 < r.gst1) {
p.gst1 = r.gst1;
p.gcnt = r.gcnt;
p.gst2 = std::max(l.gst1, r.gst2);
}
else {
p.gst1 = l.gst1;
p.gcnt = l.gcnt + r.gcnt;
p.gst2 = std::max(l.gst2, r.gst2);
}
if(r.lst1 > l.lst1) {
p.lst1 = l.lst1;
p.lcnt = l.lcnt;
p.lst2 = std::min(l.lst2, r.lst1);
}
else if(l.lst1 > r.lst1) {
p.lst1 = r.lst1;
p.lcnt = r.lcnt;
p.lst2 = std::min(l.lst1, r.lst2);
}
else {
p.lst1 = l.lst1;
p.lcnt = l.lcnt + r.lcnt;
p.lst2 = std::min(l.lst2, r.lst2);
}
}
segment_tree_chminmaxadd_rsq() {}
segment_tree_chminmaxadd_rsq(const std::vector<ll>& vec) {
n = 1;
h = 1;
while(n < vec.size()) n <<= 1, h++;
v.resize(2 * n);
for(ll i = 0;i < vec.size();i++) {
v[i + n].sum = vec[i];
v[i + n].gst1 = vec[i];
v[i + n].lst1 = vec[i];
}
for(ll i = n; i --> 1;) {
fix(i);
v[i].len = v[i * 2 + 0].len + v[i * 2 + 1].len;
}
}
inline void eff_add(int k, T x) {
auto& p = v[k];
p.sum += x * p.len;
p.gst1 += x;
p.lst1 += x;
p.add += x;
if(p.gst2 != NINF) p.gst2 += x;
if(p.lst2 != INF) p.lst2 += x;
}
inline void eff_chmin(int k, T x) {
auto& p = v[k];
p.sum += (x - p.gst1) * p.gcnt;
if(p.gst1 == p.lst1) {
p.gst1 = p.lst1 = x;
}
else if(p.gst1 == p.lst2) {
p.gst1 = p.lst2 = x;
}
else {
p.gst1 = x;
}
}
inline void eff_chmax(int k, T x) {
auto& p = v[k];
p.sum += (x - p.lst1) * p.lcnt;
if(p.lst1 == p.gst1) {
p.lst1 = p.gst1 = x;
}
else if(p.lst1 == p.gst2) {
p.lst1 = p.gst2 = x;
}
else {
p.lst1 = x;
}
}
inline void push(int k) {
if(k >= n) return;
auto& p = v[k];
if(p.add != 0) {
eff_add(k * 2 + 0, p.add);
eff_add(k * 2 + 1, p.add);
p.add = 0;
}
if(p.gst1 < v[k * 2 + 0].gst1) eff_chmin(k * 2 + 0, p.gst1);
if(p.gst1 < v[k * 2 + 1].gst1) eff_chmin(k * 2 + 1, p.gst1);
if(p.lst1 > v[k * 2 + 0].lst1) eff_chmax(k * 2 + 0, p.lst1);
if(p.lst1 > v[k * 2 + 1].lst1) eff_chmax(k * 2 + 1, p.lst1);
}
inline void infuse(int k) {
k = k >> __builtin_ctz(k);
while(k >>= 1) fix(k);
}
inline void infiltrate(int k) {
if(k == n << 1) return;
int kc = __builtin_ctz(k);
for(int i = h; i --> kc;) push(k >> i);
}
inline void infiltrate(int l, int r) {
if(r == n << 1) infiltrate(l);
else {
int hh = h;
int x = l ^ r;
for(; !(x >> --hh) && hh;) push(l >> hh);
int lc = __builtin_ctz(l);
for(int i = hh + 1; i --> lc;) push(l >> i);
int rc = __builtin_ctz(r);
for(int i = hh + 1; i --> rc;) push(r >> i);
}
}
void subtree_chmin(int k, T x) {
if(v[k].gst1 <= x) return;
if(v[k].gst2 < x) {
eff_chmin(k, x);
return;
}
push(k);
subtree_chmin(k * 2 + 0, x);
subtree_chmin(k * 2 + 1, x);
fix(k);
}
void subtree_chmax(int k, T x) {
if(x <= v[k].lst1) return;
if(x < v[k].lst2) {
eff_chmax(k, x);
return;
}
push(k);
subtree_chmax(k * 2 + 0, x);
subtree_chmax(k * 2 + 1, x);
fix(k);
}
void range_chmin(int a, int b, T x) {
int l = a + n;
int r = b + n;
infiltrate(l, r);
while(l < r) {
if(l & 1) subtree_chmin(l++, x);
if(r & 1) subtree_chmin(--r, x);
l >>= 1;
r >>= 1;
}
infuse(a + n);
infuse(b + n);
}
void range_chmax(int a, int b, T x) {
int l = a + n;
int r = b + n;
infiltrate(l, r);
while(l < r) {
if(l & 1) subtree_chmax(l++, x);
if(r & 1) subtree_chmax(--r, x);
l >>= 1;
r >>= 1;
}
infuse(a + n);
infuse(b + n);
}
void range_add(int a, int b, T x) {
int l = a + n;
int r = b + n;
infiltrate(l, r);
while(l < r) {
if(l & 1) eff_add(l++, x);
if(r & 1) eff_add(--r, x);
l >>= 1;
r >>= 1;
}
infuse(a + n);
infuse(b + n);
}
T range_sum(int l, int r) {
l += n;
r += n;
infiltrate(l, r);
T lx = ide;
T rx = ide;
while(l < r) {
if(l & 1) lx = lx + v[l++].sum;
if(r & 1) rx = v[--r].sum + rx;
l >>= 1;
r >>= 1;
}
return lx + rx;
}
};
int N;
vec init(20001,0);
vec solve(vector<pair<int,int>>& v){
vec res(N,0);
segment_tree_chminmaxadd_rsq tree(init);
ll i,bf=0,now;
rep(i,N){
tree.range_chmax(0,v[i].first,v[i].second);
now=tree.range_sum(0,20001);
res[i]=now-bf;
bf=now;
}
return res;
}
int main(){
// startupcpp();
// int codeforces;cin>>codeforces;while(codeforces--){
int i;
cin>>N;
vector<pair<int,int>> a(N),b(N),c(N),d(N);
rep(i,N){
cin>>a[i].first>>a[i].second>>b[i].first>>b[i].second;
a[i]=pair<int,int>(-a[i].first,-a[i].second);
c[i]=pair<int,int>(a[i].first,b[i].second);
d[i]=pair<int,int>(b[i].first,a[i].second);
}
vec ansa=solve(a),ansb=solve(b),ansc=solve(c),ansd=solve(d);
rep(i,N)print(ansa[i]+ansb[i]+ansc[i]+ansd[i]);
}
kiyoshi0205