https://codeforces.com/contest/1181/problem/E2

想到了划分的方法跟题解一样,但是没理清楚复杂度,很难受。

看了题解觉得很有道理,还是自己太菜了。

然后直接开始写,四个if写的太难受了180+行。

ac之后看了红名大佬的代码,简直woc,好短,四个sort我分开写了,但是红名大佬写的很巧妙,借鉴了一下代码长度缩短到110行左右,红名大佬np,特此记录。

使用静态链表,复杂度计算 T(n) = T(a1)+T(a2)+T(a3) ... + O(nlogn)   ( ai<=n/2)

傻逼版

#include<bits/stdc++.h>
#include<ext/rope>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define mst(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x&(-x))
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<int,int> pii;
const int mod = 1e9+;
ll qpow(ll a,ll b){ll res=;for(;b;b>>=,a=a*a%mod)if(b&)res=res*a%mod;return res; }
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2e5+;
void co(){
cout<<"NO";exit();
}
int x1[maxn],x2[maxn],y1[maxn],y2[maxn];
bool cmp0(const int&le,const int&ri){
return x1[le]<x1[ri];
}
bool cmp1(const int&le,const int&ri){
return y1[le]<y1[ri];
}
bool cmp2(const int&le,const int&ri){
return x2[le]>x2[ri];
}
bool cmp3(const int&le,const int&ri){
return y2[le]>y2[ri];
}
int pre[][maxn],nx[][maxn];
void store(int *f){
for(int i=;i<;++i)
f[i]=nx[i][];
}
void read(int *f){
for(int i=;i<;++i)
nx[i][]=f[i];
}
void init(vector<int>&use){
sort(use.begin(),use.end(),cmp0);
int p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp1);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp2);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp3);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
}
void del(int p){
for(int i=;i<;++i){
int a=pre[i][p],b=nx[i][p];
nx[i][a]=b;pre[i][b]=a;
}
}
void solve(vector<int>&use){
if(use.size()<=)return;
init(use);
// for(int i=0;i<4;++i){
// int p=nx[i][0];
// while(p!=0){
// cout<<p<<" ";
// p=nx[i][p];
// }
// cout<<endl;
// }
// exit(0);
int sz=use.size();
while(sz>){
int now[];
store(now);
int v[]={x2[now[]],y2[now[]],x1[now[]],y1[now[]]};
bool ok=false;
for(int i=;i<sz;++i){
for(int d=;d<;++d)
now[d]=nx[d][now[d]];
if(x1[now[]]>=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=max(v[],x2[now[]]);
if(y1[now[]]>=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=max(v[],y2[now[]]);
if(x2[now[]]<=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=min(v[],x1[now[]]);
if(y2[now[]]<=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=min(v[],y1[now[]]);
}
if(!ok)co();
}
}
vector<int>a;
int main() {
#ifdef local
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n;
cin>>n;
for(int i=;i<=n;++i)
cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
for(int i=;i<=n;++i)
a.push_back(i);
solve(a);
cout<<"YES"; return ;
}

借鉴大佬代码改良版

#include<bits/stdc++.h>
#include<ext/rope>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define mst(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x&(-x))
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<int,int> pii;
const int mod = 1e9+;
ll qpow(ll a,ll b){ll res=;for(;b;b>>=,a=a*a%mod)if(b&)res=res*a%mod;return res; }
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2e5+;
void co(){
cout<<"NO";exit();
}
pii a[][maxn];
int pre[][maxn],nx[][maxn];
void store(int *f){
for(int i=;i<;++i)
f[i]=nx[i][];
}
void read(int *f){
for(int i=;i<;++i)
nx[i][]=f[i];
}
void init(vector<int>&use){
for(int i=;i<;++i){
sort(use.begin(),use.end(),[&](const int &le,const int&ri){
return a[i][le]<a[i][ri];
});
int p=;
for(int v:use){
nx[i][p]=v;
pre[i][v]=p;
p=v;
}
nx[i][p]=;
}
}
void del(int p){
for(int i=;i<;++i){
int a=pre[i][p],b=nx[i][p];
nx[i][a]=b;pre[i][b]=a;
}
}
void solve(vector<int>&use){
if(use.size()<=)return;
init(use);
int sz=use.size();
while(sz>){
int now[],v[];
store(now);
for(int i=;i<;++i)
v[i]=a[i][now[i]].second;
bool ok=false;
for(int i=;i<sz and !ok;++i){
for(int d=;d< and !ok;++d){
now[d]=nx[d][now[d]];
if(a[d][now[d]].first>=v[d]){
vector<int>son;
for(int j=nx[d][];j!=now[d];j=nx[d][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
}else v[d]=max(v[d],a[d][now[d]].second);
}
}
if(!ok)co();
}
}
vector<int>uu;
int main() {
#ifdef local
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n;
cin>>n;
for(int i=;i<=n;++i){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
a[][i]=pii(x1,x2);
a[][i]=pii(y1,y2);
a[][i]=pii(-x2,-x1);
a[][i]=pii(-y2,-y1);
}
for(int i=;i<=n;++i)
uu.push_back(i);
solve(uu);
cout<<"YES"; return ;
}

Codeforces Round #567 (Div. 2) E2 A Story of One Country (Hard)的更多相关文章

  1. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

    传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...

  2. CodeForces -Codeforces Round #496 (Div. 3) E2. Median on Segments (General Case Edition)

    参考:http://www.cnblogs.com/widsom/p/9290269.html 传送门:http://codeforces.com/contest/1005/problem/E2 题意 ...

  3. Codeforces Round #567 (Div. 2)自闭记

    嘿嘿嘿,第一篇文章,感觉代码可以缩起来简直不要太爽 打个div2发挥都这么差... 平均一题fail一次,还调不出错,自闭了 又一次跳A开B,又一次B傻逼错误调不出来 罚时上天,E还傻逼了..本来这场 ...

  4. Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...

  5. Codeforces Round #567 (Div. 2)A

    A. Chunga-Changa 题目链接:http://codeforces.com/contest/1181/problem/A 题目 Soon after the Chunga-Changa i ...

  6. Codeforces Round #567 Div. 2

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  7. Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)

    B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...

  8. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)

    Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...

  9. Codeforces Round #567 (Div. 2) A.Chunga-Changa

    原文链接:传送 #include"algorithm" #include"iostream" #include"cmath" using n ...

随机推荐

  1. java自定义excel

    文件下载 本文主要介绍spring boot环境下,利用Apache POI操作Excel,实现Excel文件的在线下载. 首先,我们在这里介绍一下关于ApachePOI中关于HSSF,XSSF和SX ...

  2. (二)创建基于maven的javaFX项目

    首先使用IDEA创建一个javaFX项目 点击finish,这就创建完成了JavaFX项目,只有将其转换为maven项目即可,如图:

  3. linux系统编程相关

    基本的概念:程序,进程,并发,单道程序设计,多道程序设计,时钟中断. 存储介质:寄存器(操作系统的位数是针对寄存器而言的,32位识字节,64位就是8字节).缓存cache.内存,硬盘,网络. cpu的 ...

  4. webpack的postcss的基本应用

    PostCss是什么? PostCSS在webpack中的基本应用 一.PostCss是什么? 如果有深入学习PostCss需求的话可以参考大漠的资料:https://www.w3cplus.com/ ...

  5. postgres 索引

    索引是一种特殊的查询表,可以使用搜索引擎的数据库以加快数据检索.简单地说,索引是表中的数据的一个指针,在一个数据库中的索引是非常相似,如:一本书的目录. 例如,如果想在一本书中引用的所有页面讨论某个话 ...

  6. DNS负载均衡与NGINX负载均衡策略

    负载均衡是指的是把请求均匀的分摊到多个服务器上处理.一般常见的负载均衡有两种:①客户端与反向代理服务器之间的DNS负载均衡②反向代理服务器与应用服务器之间的负载均衡(这种负载均衡有很多,可以是webl ...

  7. kubernetes之requests和limits

    说明 1.当集群中的计算资源不很充足, 如果集群中的pod负载突然加大, 就会使某个node的资源严重不足, 为了避免系统挂掉, 该node会选择清理某些pod来释放资源, 此时每个pod都可能成为牺 ...

  8. python网络编程:TCP通讯模板、粘包及解决方案、自定义报头

    一.TCP通讯模板 二.远程CMD程序 三.解决粘包问题 四.解决粘包问题2 一.TCP通讯模板 TCP客户端 import socket c = socket.socket() # 连接服务器 c. ...

  9. java线程基础巩固---同步代码块以及同步方法之间的区别和关系

    在上一次中[http://www.cnblogs.com/webor2006/p/8040369.html]采用同步代码块的方式来实现对线程的同步,如下: 对于同步方法我想都知道,就是将同步关键字声明 ...

  10. kylin实战(一)

    kylin适用场景 OLAP 它适合数据量大,查询维度多,但是业务改动不频繁的场景.因为业务多,则kylin的cube很多.每次业务变更,kylin修改的工作量大,且每次全量跑数据耗费时间比较长. 它 ...