【线段树】【4-6组队赛】Problem H
Problem Description
#include <algorithm>
using namespace std;
int n,a[110000],b[110000],c[110000],d[110000];
int main()
{
while(cin>>n)
{
for(int i=0;i<n;++i) cin>>a[i];
for(int i=0;i<n;++i) cin>>b[i];
for(int i=0;i<n;++i) cin>>c[i];
for(int i=0;i<n;++i) cin>>d[i];
for(int i=0;i<n;++i)
if(a[i]>b[i]) swap(a[i],b[i]);
for(int i=0;i<n;++i)
if(c[i]>d[i]) swap(c[i],d[i]);
for(int i=0;i<n;++i)
{
int ans=0;
for(int j=0;j<n;++j)
if(a[i]<=c[j]&&d[j]<=b[i]) ans++;
cout<<ans<<endl;
}
}
return 0;
}
Even you are brave enough still, I really not recommend you to copy the code and just submit it.
Input
Each case begins with an integer n (0<n<=100000).
Then follow with 4 lines representing a[ ],b[ ],c[ ] and d[ ], all values are located in [1,100000].
Output
Sample Input
4
1 1 1 2
1 1 1 2
1 1 1 1
1 1 1 1
Sample Output
4
4
4
0
题目大意:
给你二组线段A,B 询问A组中每一个线段包含了多少B组线段
将A,B按左端点排序;
那么当B前面线段若不满足当前A了 ,就可以废弃不用了,即B.x<A[now].x。
所以未被删除的B线段都是满足了左端点,现在只需要求是否满足右端点即可。
用线段树来维护B的右端点。若B一条废弃不用,更新线段树即可。每次查询【0-A[now].y】有多少元素即可
nlogn的复杂度。
最后还要按序号排序回来,因为要按输入顺序输出,代码如下:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=100000+5;
struct node
{
int x,y,num,ans;
}A[maxn],B[maxn];
int n;
int tree[maxn<<2];
bool cmp(node a,node b)
{
return a.x<b.x;
}
bool cmp1(node a,node b)
{
return a.num<b.num;
}
void pushup(int rt)
{
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
int build(int l,int r,int rt)
{
if(l==r) {tree[rt]=0;return 0;}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
int updata(int p,int k,int l,int r,int rt)//单点更新
{
int m;
if(l==r) {tree[rt]+=k;return 0;}
m=(l+r)>>1;
if(p<=m) updata(p,k,lson);
else updata(p,k,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
int temp=0,m;
if(L<=l&&r<=R) return tree[rt];
m=(l+r)>>1;
if(L<=m) temp=temp+query(L,R,lson);
if(R>m) temp=temp+query(L,R,rson);
return temp;
}
void input()
{
for(int i=0;i<n;++i) {scanf("%d",&A[i].x);A[i].num=i;}
for(int i=0;i<n;++i) scanf("%d",&A[i].y);
for(int i=0;i<n;++i) scanf("%d",&B[i].x);
for(int i=0;i<n;++i) scanf("%d",&B[i].y);
for(int i=0;i<n;++i)
if(A[i].x>A[i].y) swap(A[i].x,A[i].y);
for(int i=0;i<n;++i)
if(B[i].x>B[i].y) swap(B[i].x,B[i].y);
sort(B,B+n,cmp);
sort(A,A+n,cmp);
}
void solve()
{
int tot=0;
for(int i=0;i<n;i++)
{
updata(B[i].y,1,1,maxn-1,1);
}
for(int i=0;i<n;i++)
{
int ans=0;
while(B[tot].x<A[i].x&&tot<n) {
updata(B[tot].y,-1,1,maxn-1,1);
tot++;
}
ans=query(1,A[i].y,1,maxn-1,1);
A[i].ans=ans;
}
sort(A,A+n,cmp1);
for(int i=0;i<n;i++) printf("%d\n",A[i].ans);
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main()
{
// init();
while(scanf("%d",&n)!=EOF)
{
input();
build(1,maxn-1,1);
solve();
}
}
【线段树】【4-6组队赛】Problem H的更多相关文章
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 线段树:CDOJ1592-An easy problem B (线段树的区间合并)
An easy problem B Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- 线段树:POJ3468-A Simple Problem with Integers(线段树注意事项)
A Simple Problem with Integers Time Limit: 10000MS Memory Limit: 65536K Description You have N integ ...
- 【POJ3468】【zkw线段树】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]
题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...
- 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和
poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...
- 【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C - A Simple Problem with Integers
https://vjudge.net/contest/66989#problem/C #include<iostream> #include<cstdio> #include& ...
- (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/ ...
随机推荐
- retire
retire 本来抱着进队的决心迎战,结果在第一试就失利,是能力不足,还是命中注定我不是竞赛的料,一切关于OI的事随着GDOI2016的闭幕而消散-- 今后也许再也不搞OI了,或许会玩一下ACM,现在 ...
- matlab---边缘之sobel简单实例
最近在项目中需要做一些图像边缘检测的工作,但是由于之前没接触过图像处理的相关知识,所以只得 在matlab里面对一些图像处理函数挨个挨个的试着用.在用的过程中在慢慢的明白了一些简单的图像处 理方法. ...
- Android SDK目录结构和工具介绍
Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. AD: Android SDK目录结构和 ...
- linux下的DNS
Linux下设置DNS的位置主要是, 1网卡设置配置文件里面DNS服务器地址设置;2 hosts文件指定 3.系统默认DNS服务器地址设置/etc/resolv.conf文件修改 生效顺序是: 1 h ...
- 从Ecma规范深入理解js中的this的指向
this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java.c++这类比较严格的面向对象编程语言里是非常明确的.但是在javascript中,this的定义要灵活许多,如果 ...
- JQ对JSON的增删改
var userlist={ }, } } //方法一 userlist.row1.sex="女";//添加 userlist.row3={name:};//添加 userlist ...
- DropdownList的处理总结
创建一: List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text ...
- 寻求c++解答如下三个题目!
- com.sun.jdi.InvocationException occurred invoking method.
文章来源于网络, 自己也遇到同样的问题,也是采用这样的方式解决的.原文链接http://zuiyanwangyue.iteye.com/blog/470638 在 HibernateDaoSuppor ...
- jquery append 动态添加的元素事件on 不起作用的解决方案
用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...