bzoj4411 [Usaco2016 Feb]Load balancing

news/2024/11/26 4:37:33/

http://www.elijahqi.win/archives/3059
Description

给出N个平面上的点。保证每一个点的坐标都是正奇数。
你要在平面上画两条线,一条是x=a,一条是y=b,且a和b都是偶数。
直线将平面划成4个部分,要求包含点数最多的那个部分点数最少。

Input

第一行一个数N。
接下来N行每行描述一个点
N<=100000
1<=x,y<=1000000

Output

输出一个数表示最少的点数。

Sample Input

7
7 3
5 5
7 13
3 1
11 7
5 3
9 1
Sample Output

2
HINT

Source

枚举横坐标 然后上下维护线段树 然后每次做的时候对于纵坐标二分一个位置

max(l1,l2)>=max(r1,r2) 然后取一下四个中的最大值返回即可 因为前面这个函数是单峰函数所以可以在线段树上直接二分即可

#include<cstdio>
#include<cctype>
#include<algorithm>
#define lc (x<<1)
#define rc (x<<1|1)
#define inf 0x3f3f3f3f
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}while(isdigit(ch)) x=x*10+ch-'0',ch=gc();return x*f;
}
const int N=100010;
struct P{int x,y;
}point[N];
struct node{int v[2];}tree[N<<3];
int d[N],nn,d1[N],n1;
inline bool cmp(const P &a,const P &b){return a.x<b.x;}
inline void insert1(int x,int l,int r,int p,int v,int op){tree[x].v[op]+=v;if (l==r) return;int mid=l+r>>1;if(p<=mid) insert1(lc,l,mid,p,v,op);else insert1(rc,mid+1,r,p,v,op);
}
inline int query(int x,int l,int r,int l1,int r1,int l2,int r2){int mid=l+r>>1;int lv0=tree[lc].v[0],rv0=tree[rc].v[0];int lv1=tree[lc].v[1],rv1=tree[rc].v[1];if (l==r) {lv0=tree[x].v[0],rv0=tree[x].v[0];lv1=tree[x].v[1],rv1=tree[x].v[1];if (max(l1+lv0,l2+lv1)>=max(r1+rv0,r2+rv1))r1+=rv0,r2+=rv1;else l1+=lv0,l2+=lv1; return max(max(l1,l2),max(r1,r2));}if (max(lv0+l1,lv1+l2)>=max(rv0+r1,rv1+r2))return query(lc,l,mid,l1,rv0+r1,l2,rv1+r2);else return query(rc,mid+1,r,l1+lv0,r1,l2+lv1,r2);
}
int main(){freopen("bzoj4411.in","r",stdin);int n=read();for (int i=1;i<=n;++i) point[i].x=read(),point[i].y=read(),d[++nn]=point[i].y,d1[++n1]=point[i].x;sort(d1+1,d1+n1+1);n1=unique(d1+1,d1+n1+1)-d1-1;sort(d+1,d+nn+1);nn=unique(d+1,d+nn+1)-d-1;for (int i=1;i<=n;++i){point[i].x=lower_bound(d1+1,d1+n1+1,point[i].x)-d1;point[i].y=lower_bound(d+1,d+nn+1,point[i].y)-d;}sort(point+1,point+n+1,cmp);int now=1,ans=inf;//for (int i=1;i<=n;++i) printf("%d %d\n",point[i].x,point[i].y);for (int i=1;i<=n;++i) insert1(1,1,nn,point[i].y,1,1);for (int i=1;i<=n1;++i){while(point[now].x==i) insert1(1,1,nn,point[now].y,-1,1),insert1(1,1,nn,point[now].y,1,0),++now;ans=min(ans,query(1,1,nn,0,0,0,0));}printf("%d\n",ans);return 0;
}

http://www.ppmy.cn/news/370601.html

相关文章

HDU 4411 Arrest

分析&#xff1a;很明显的费用流&#xff0c;最重要的还是建图&#xff0c;首先确立源点和汇点&#xff0c;因为城市0为初始点&#xff0c;所以我定义s为源点&#xff0c;然后t为汇点&#xff0c;s-->0建边&#xff0c;流量为k&#xff0c;费用为0&#xff0c;因为不一定所有…

惠普电脑为什么打不开计算机刷题,如果无法打开HP笔记本计算机的无线开关该怎么办?惠普ProBook 4411s...

clp615808 通过 尊敬的HP用户&#xff0c;您好&#xff01;感谢您选择惠普产品. 根据您的描述&#xff0c;建议您参考以下信息: 1. 建议进入操作系统的桌面. 您可以右键单击[计算机](或[我的计算机])图标&#xff0c;选择[管理]&#xff0c;然后在页面左侧的[设备管理器]中-右键…

题解 P4411 【[BJWC2010]取数游戏】

看到大家都是用 f i f_i fi​ 来存储枚举到 i i i 的答案&#xff0c;这里再来一种别样的方法。 同样得先枚举 a i a_i ai​ 的约数&#xff0c;我们其实不需要存储 a i a_i ai​ , 边读边算即可。 我们用 m a i ma_i mai​ 存储约数为 i i i 的最大答案数量&#xff0…

HDU 4411 Arrest(费用流)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4411 题意&#xff1a;有N 1个城市&#xff0c;M条无向带权边&#xff0c;警局在0号点&#xff0c;其他N个点都有犯罪团伙需要抓&#xff0c;最多可以派出K支队伍去抓捕&#xff0c;到了某个城市可以选择抓或…

TPA4411RTJR

描述 TPA4411和TPA4411M是立体声耳机驱动器&#xff0c;旨在消除输出隔直电容&#xff0c;从而减少元件数量和成本。 TPA4411和TPA4411M是小型便携式电子产品的理想选择&#xff0c;其尺寸和成本是关键的设计参数。 TPA4411和TPA4411M能够在4.5 V时驱动80 mW至16负载.TPA4411和…

HDU 4411

费用流 建图见下面代码&#xff0c; 解释下这条加边addedge(2*v1,2*v2,k,0); 费用流第一遍跑肯定是跑含有v条负无穷的边。 如果以后跑反向边是对第一次跑n条负无穷的边的优化&#xff0c;如果没有优化就干脆不出动警力 #include<cstdio> #include<cstring>…

BZOJ4411 - [Usaco2016 Feb]Load balancing

Portal Description 给出平面上的\(n(n\leq10^5)\)个整点。画两条直线\(xx_0\)和\(yy_0\)将这些点划分成\(s_1,s_2,s_3,s_4\)个点&#xff0c;最小化\(max\{s_1,s_2,s_3,s_4\}\)。 Solution 二分答案线段树。 首先进行离散化&#xff0c;记录\(sumY[i]\)表示\(y\leq i\)的点的个…

构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用

构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用 文章目录 构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用文献信息背景和目的实验流程方法和结果从GSE73731下载CCRCC的数据&#xff0c;并进行预处理使用CIBERSORT评估每…