D. Wizards and Roads

题目连接:

http://www.codeforces.com/contest/167/problem/D

Description

In some country live wizards. They love to build cities and roads.

The country used to have k cities, the j-th city (1 ≤ j ≤ k) was located at a point (xj, yj). It was decided to create another n - k cities. And the i-th one (k < i ≤ n) was created at a point with coordinates (xi, yi):

xi = (a·xi - 1 + b) mod (109 + 9)

yi = (c·yi - 1 + d) mod (109 + 9)

Here a, b, c, d are primes. Also, a ≠ c, b ≠ d.

After the construction of all n cities, the wizards have noticed something surprising. It turned out that for every two different cities i and j, xi ≠ xj and yi ≠ yj holds.

The cities are built, it's time to build roads! It was decided to use the most difficult (and, of course, the most powerful) spell for the construction of roads. Using this spell creates a road between the towns of u, v (yu > yv) if and only if for any city w which lies strictly inside the corner at the point u, v (see below), there is a city s that does not lie in the corner, which is located along the x-coordinate strictly between w and u and simultaneously ys > yv.

A corner on the points p2(x2, y2), p1(x1, y1) (y1 < y2) is the set of points (x, y), for which at least one of the two conditions is fulfilled:

min(x1, x2) ≤ x ≤ max(x1, x2) and y ≥ y1

y1 ≤ y ≤ y2 and (x - x2)·(x1 - x2) ≥ 0

The pictures showing two different corners

In order to test the spell, the wizards will apply it to all the cities that lie on the x-coordinate in the interval [L, R]. After the construction of roads the national government wants to choose the maximum number of pairs of cities connected by the road, so that no city occurs in two or more pairs. Your task is for each m offered variants of values L, R to calculate the maximum number of such pairs after the construction of the roads. Please note that the cities that do not lie in the interval [L, R] on the x-coordinate, do not affect the construction of roads in any way.

Input

The first line contains two space-separated integers n, k (1 ≤ k ≤ n ≤ 105, k ≤ 30). Next k lines contain coordinates of the cities' location points from the first to the k-th one. The j-th line contains space-separated pair of integers xj, yj (0 ≤ xj, yj < 109 + 9) — coordinates of the j-th city.

The next line contains space-separated integers a, b, c, d (2 ≤ a, b, c, d < 109 + 9). It is guaranteed that those numbers are prime and also that a ≠ c, b ≠ d.

It's guaranteed, that for every two different cities i and j, xi ≠ xj and yi ≠ yj holds.

The next line contains integer m (1 ≤ m ≤ 105) — the number of variants to build the roads. Next m lines contain pairs of space-separated integers Li, Ri (0 ≤ Li ≤ Ri < 109 + 9) — the variants of choosing the cities to build the roads.

Output

For any pair of numbers Li, Ri print the answer to the problem on a single line. Print the answers for the pairs in the order, in which the pairs are given in the input data.

Sample Input

6 6

0 0

1 1

2 2

3 3

4 4

5 5

2 3 3 2

4

0 5

1 4

2 3

3 3

Sample Output

3

2

1

0

Hint

题意

平面上给你n个点,保证数据随机

然后有一个定义叫做拐角的东西,就是题目中的图片显示的那个

现在如果某两个点u,v(假设uy>vy)构成的拐角中的任何一个点w,都存在一个能与w形成拐角的点s满足sx在w,v之间,且sy>vy

那么uv就可以连边

现在问你横坐标在l,r区间的点做二分图匹配的最大值是多少

题解:

那个神TM的题意,真是迷

经过猜测,观察,迷之领悟,知道了这么一个结论

假设我们把每个点的下方分成左下角和右下角两个区域,那么每个点只能和这两个区域中的y坐标最大值连边

然后这样递归下来,显然就能够构成一个笛卡尔树的样子(其实就是

然后这是一颗二叉树

所以询问就很简单了,由于是二叉树,所以就是一个简单的贪心(或者dp

然后均摊的直接像线段树那样去跑一发就好了

复杂度是nlogn的

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
const int mod = 1e9+9;
int n,k,a,b,c,d;
pair<int,int>p[maxn];
int tot=1;
struct Tr
{
int l,r,x,lson,rson;
pair<int,int>v;
}tree[maxn];
int newnode(int &x)
{
return x=++tot;
}
pair<int,int> deal(pair<int,int> a,pair<int,int> b)
{
return make_pair(a.second+b.second,max(a.first+b.second,a.second+b.first)+1);
}
void build_tree(int l,int r,int x)
{
int high=-1,id=l;
for(int i=l;i<=r;i++)
if(p[i].second>high)
high=p[i].second,id=i;
tree[x].l=p[l].first,tree[x].r=p[r].first,tree[x].x=p[id].first;
if(id>l)build_tree(l,id-1,newnode(tree[x].lson));
if(id<r)build_tree(id+1,r,newnode(tree[x].rson));
tree[x].v=deal(tree[tree[x].lson].v,tree[tree[x].rson].v);
}
pair<int,int> query(int l,int r,int x)
{
if(x==0||l>tree[x].r||r<tree[x].l)return make_pair(-1,0);
if(l<=tree[x].l&&r>=tree[x].r)return tree[x].v;
if(r<tree[x].x)return query(l,r,tree[x].lson);
if(l>tree[x].x)return query(l,r,tree[x].rson);
return deal(query(l,r,tree[x].lson),query(l,r,tree[x].rson));
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
scanf("%d%d",&p[i].first,&p[i].second);
scanf("%d%d%d%d",&a,&b,&c,&d);
for(int i=k;i<n;i++)
p[i]=make_pair((1LL*p[i-1].first*a+b)%mod,(1LL*p[i-1].second*c+d)%mod);
sort(p,p+n);
tree[0].v=make_pair(-1,0);
build_tree(0,n-1,1);
int m;
scanf("%d",&m);
while(m--)
{
int a,b;scanf("%d%d",&a,&b);
printf("%d\n",query(a,b,1).second);
}
}

Codeforces Round #114 (Div. 1) D. Wizards and Roads 笛卡尔树+树贪心+阅读题的更多相关文章

  1. Codeforces Round #114 (Div. 1) B. Wizards and Huge Prize 概率dp

    B. Wizards and Huge Prize Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  2. Codeforces Round #114 (Div. 1) A. Wizards and Trolleybuses 物理题

    A. Wizards and Trolleybuses Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/conte ...

  3. Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元

    E. Wizards and Bets 题目连接: http://www.codeforces.com/contest/167/problem/E Description In some countr ...

  4. Codeforces Round #114 (Div. 1) C. Wizards and Numbers 博弈论

    C. Wizards and Numbers 题目连接: http://codeforces.com/problemset/problem/167/C Description In some coun ...

  5. Codeforces Round #689 (Div. 2, based on Zed Code Competition) E. Water Level (贪心好题)

    题意:你在一家公司工作\(t\)天,负责给饮水机灌水,饮水机最初有\(k\)升水,水的范围必须要在\([l,r]\)内,同事每天白天都会喝\(x\)升水,你在每天大清早可以给饮水机灌\(y\)升水,问 ...

  6. Codeforces Round #114 (Div. 2)

    Codeforces Round #114 (Div. 2) 代码 Codeforces Round #114 (Div. 2) C. Wizards and Trolleybuses 思路 每条车的 ...

  7. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (0/1-Trie树)

    Vasiliy's Multiset 题目链接: http://codeforces.com/contest/706/problem/D Description Author has gone out ...

  8. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  9. Codeforces Round #327 (Div. 2) A. Wizards' Duel 水题

    A. Wizards' Duel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/prob ...

随机推荐

  1. sublime在搜索的时候排除js文件

    代码审计的时候sublime是一个神器.所以.... Ctrl + Shift + F /home/i3ekr/Desktop/coding/phpcms,*.php 这样就可以直接搜索所有的php文 ...

  2. 搭建selenium+python自动化环境

    1.安装python,下载地址:http://python.org---安装版本3.5.1 ps:自带setuptools和pip工具 2.然后,用pip安装开发Web App需要的第三方库:异步框架 ...

  3. 使用js获取url里的指定参数

    String.prototype.getQuery = function(name){     var reg = new RegExp("(^|&)"+ name +&q ...

  4. 生成RSA2公钥、私钥

    RSA2是一种被使用广泛的非对称加密算法. openssl OpenSSL> genrsa -out app_private_key.pem # 私钥RSA2 OpenSSL> rsa - ...

  5. Activiti如何替换已部署流程图

    首先交代下背景:我们有一个已经上线的activiti工作流系统,对于流程图的操作已经封装好部署,查看,删除的接口.此时客户提出要修改个别流程图里的节点名称. 我的第一个想法就是本地修改流程图bpmn文 ...

  6. Spring + MyBatis 多数据源实现

    近期,在项目中需要做分库,但是因为某些原因,没有采用开源的分库插件,而是采用了同事之前弄得多数据源形式实现的分库.对于多数据源,本人在实际项目也中遇到的不多,之前的项目大多是服务化,以RPC的形式获得 ...

  7. Django内置信号

    阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...

  8. jquery中的jsonp和js中的jsonp还有配合php实现的jsonp。

    最近在做一个自己的网站,才知道一个前端需要学习的东西到底有多少. 来吧~步入正题,我的网站空间很小.所以在资源上,就有点吼不住了.跨域拿数据肯定是不可避免的了. 一.原生js: 我们知道他的原理,就是 ...

  9. 洛谷P1514 引水入城 [搜索,区间DP]

    题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...

  10. 洛谷P3901 数列找不同 [莫队]

    题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1​,A2​,⋯,AN​ ,Q 个询问 (L_i,R_i)(Li​,Ri​) , A_{Li} ,A_{Li+1},\cdots, ...