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. LeetCode:175.组合两个表

    题目链接:https://leetcode-cn.com/problems/combine-two-tables/ 题目 表1: Person +-------------+---------+ | ...

  2. logback替换log4j

    1.新建logback.xml放在src目录下(放在src下会自动加载,不需要再web.xml配置) 2.引入必要的jar包:

  3. javascript框架(库)

    javascript框架(库)高级JavaScript编程,尤其是复杂的浏览器差异处理,通常是困难和耗时的.为了响应这些调整,出现了许多javascript(helper)库.这些JavaScript ...

  4. 微信小程序下拉刷新

    <config> { enablePullDownRefresh: true, navigationBarTitleText: "消息中心", } </confi ...

  5. 如何从git上批量拉取本地当前分支的所有代码

    1 我本地有一个文件_netrc文件里面存储这git的相关信息,包括用户名和密码 你可以根据自己的git相关信息配置自己的信息 2 我当前的分支是dev,我要拉取当前分支下的所有代码,编写shell脚 ...

  6. Nginx作为代理服务之反向代理

    Nginx作为代理服务之反向代理 需求:我们需要访问一个服务,但是服务端只接受8080端口,所以需要在nginx中配置反向代理,帮助客户端代理实现. 1. 创建一个html放入到一个文件夹中 2. 在 ...

  7. tftp client命令示例

    tftp 192.168.1.1 -c put myfile theirfile tftp 192.168.1.1 -m binary -c put myfile theirfile The tftp ...

  8. 第八章· Redis API 开发

    Redis 开发 1.源码安装Python环境 Python官网:https://www.python.org/ #下载Python3.6.4安装包 [root@db03 ~]# wget https ...

  9. Nginx中虚拟主机配置

    一.Nginx中虚拟主机配置 1.基于域名的虚拟主机配置 1.修改宿主机的hosts文件(系统盘/windows/system32/driver/etc/HOSTS) linux : vim /etc ...

  10. windows环境下备份与恢复,与文件拷贝

    mySQL数据库在windows环境下备份与恢复 解压版需进入数据库安装目录.安装版可以忽略本步骤: 1.先在运行中输入CMD,启动命令行2.进入Mysql的Bin目录:E:\Program File ...