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. 【原创】大数据基础之Logstash(6)mongo input

    logstash input插件之mongodb是第三方的,配置如下: input { mongodb { uri => 'mongodb://mongo_server:27017/db' pl ...

  2. cube打包后css顺序错误

    先说下解决办法: 把import {...} from cube-ui放在 import App from './App.vue'的前面 不然会产生如下错误 正确的顺序

  3. textarea回填数据显示自适应高度

    queryTextArea(){ var textAll = document.getElementById('templaInner').querySelectorAll("textare ...

  4. IIS出现Server Error in '/' Application 错误的解决办法

    C:\Windows\Temp"文件夹加上 IIS_IUSRS的权限

  5. angular实现对百度天气api跨域请求

    申请秘钥:http://lbsyun.baidu.com/apiconsole/key  ,有个百度账号就行ak=开发者秘钥 url地址  :http://api.map.baidu.com/tele ...

  6. deep_learning_凹凸函数

    什么是凸函数及如何判断一个函数是否是凸函数 t元j 一.什么是凸函数 对于一元函数f(xf(x),如果对于任意tϵ[0,1]tϵ[0,1]均满足:f(tx1+(1−t)x2)≤tf(x1)+(1−t) ...

  7. python面向编程:类的组合、封装、property装饰器、多态

    一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 ...

  8. shell脚本基础和grep文本处理工具企业应用3

    文本处理工具:    linux上文本处理三剑客        grep,egrep,fgrep:文本过滤工具(模式:pattern)工具            grep:默认支持的是基本正则表达式: ...

  9. JAVA 从打包成jar到导入到IntelliJ IDEA使用

    一. 使用常用命令打包: jar -cvf 目标jar包名称 待打包路径 例:jar -cvf myjar.jar com/dn/Demo 二. 打开IntelliJ IDEA (2017.2版本) ...

  10. AIX文件系统/var空间100%的问题

    一.问题说明/var/spool/mqueue目录下出现了多个df打头的文件,导致/var空间最终100% EBANK_P570_MAIN/var/spool/mqueue#ls -l total 8 ...