[CC-CHANOQ]Chef and odd queries
题目大意:
给定$n(10^5)$个线段$[l_i,r_i](1\leq l_i,r_i\leq n)$,有$q(q\leq10^5)$组询问,每次给出$m_i(\sum m_i\leq n)$个点$x_{i,j}(1\leq x_{i,j}\leq n)$,问这些线段中有多少个线段覆盖了这些点中的奇数个点。
思路:
$q$比较小时,只需要对于每个位置$i$,处理位置$1\sim i$的点数前缀和。然后即可$O(1)$判断每个线段覆盖的点数的奇偶性。单笔询问时间复杂度$O(n+m)$。
由于$\sum m_i$有限制,所以当$q$比较大时,$m_i$就不会很大。可以用主席树记录对于$1\sim i$之间的左端点,每个区间内的右端点有多少。询问时对$x_{i,j}$排序,$O(m^2)$枚举线段覆盖了哪些点,用主席树求出符合条件的线段数即可。时间复杂度$O(m^2\log n)$。
因此对于每次询问不同的$m_i$,令较大的$m_i$执行$O(n+m)$的算法,令较小的$m_i$执行$O(m^2\log n)$的算法即可。
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e5+,M=1e5+,logN=;
int p[M],cnt[N];
std::pair<int,int> seg[N];
class FotileTree {
private:
struct Node {
int sum,left,right,vis;
};
Node node[N*logN];
int sz,new_node(const int &p,const int &id) {
node[++sz]=node[p];
node[sz].vis=id;
return sz;
}
public:
int root[N];
void modify(int &p,const int &b,const int &e,const int &x,const int &id) {
if(node[p].vis!=id) p=new_node(p,id);
node[p].sum++;
if(b==e) return;
const int mid=(b+e)>>;
if(x<=mid) modify(node[p].left,b,mid,x,id);
if(x>mid) modify(node[p].right,mid+,e,x,id);
}
int query(const int &p,const int &q,const int &b,const int &e,const int &l,const int &r) const {
if(b==l&&e==r) return node[q].sum-node[p].sum;
const int mid=(b+e)>>;
int ret=;
if(l<=mid) ret+=query(node[p].left,node[q].left,b,mid,l,std::min(mid,r));
if(r>mid) ret+=query(node[p].right,node[q].right,mid+,e,std::max(mid+,l),r);
return ret;
}
void reset() {
sz=;
}
};
FotileTree t;
int main() {
for(register int T=getint();T;T--) {
t.reset();
const int n=getint();
for(register int i=;i<=n;i++) {
const int l=getint(),r=getint();
seg[i]=std::make_pair(l,r);
}
std::sort(&seg[],&seg[n]+);
for(register int i=,j=;i<=n;i++) {
t.root[i]=t.root[i-];
for(;j<=n&&seg[j].first==i;j++) {
t.modify(t.root[i],,n,seg[j].second,i);
}
}
for(register int i=getint();i;i--) {
const int m=getint();
for(register int i=;i<=m;i++) p[i]=getint();
int ans=;
if(m<=) {
p[m+]=n+;
std::sort(&p[],&p[m]+);
for(register int i=;i<=m;i++) {
if(p[i]==p[i-]) continue;
for(register int j=i;j<=m;j+=) {
if(p[j]==p[j+]) continue;
ans+=t.query(t.root[p[i-]],t.root[p[i]],,n,p[j],p[j+]-);
}
}
} else {
for(register int i=;i<=n;i++) cnt[i]=;
for(register int i=;i<=m;i++) cnt[p[i]]++;
for(register int i=;i<=n;i++) cnt[i]+=cnt[i-];
for(register int i=;i<=n;i++) {
ans+=(cnt[seg[i].second]-cnt[seg[i].first-])&;
}
}
printf("%d\n",ans);
}
}
return ;
}
[CC-CHANOQ]Chef and odd queries的更多相关文章
- CodeChef---- February Challenge 2018----Chef and odd queries(复杂度分块计算)
链接 https://www.codechef.com/FEB18/problems/CHANOQ/ Chef and odd queries Problem Code: CHANOQ Chef ...
- 【CodeChef】Chef and Graph Queries
Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...
- [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)
[BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...
- [CodeChef - GERALD07 ] Chef and Graph Queries
Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...
- [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]
题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...
- Code Chef - Chef and Graph Queries
传送门 题目大意 给定一个$n$个点$m$条边的无向图$(n,m\leq 200000)$. 有$q$每次询问$(q\leq 200000)$,每次给定一个区间$L,R$,求仅保留编号$\in[L,R ...
- Chef and Graph Queries CodeChef - GERALD07
https://vjudge.net/problem/CodeChef-GERALD07 可以用莫队+带撤销并查集做 错误记录: 1.调试时数组开小了,忘了改大就交了 2.88行和91行少了备份num ...
- BZOJ3514 / Codechef GERALD07 Chef and Graph Queries LCT、主席树
传送门--BZOJ 传送门--VJ 考虑使用LCT维护时间最大生成树,那么对于第\(i\)条边,其加入时可能会删去一条边.记\(pre_i\)表示删去的边的编号,如果不存在则\(pre_i = 0\) ...
- codechef February Challenge 2018 简要题解
比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...
随机推荐
- 在cmd运行脚本
1.打开cmd 2.cd到脚本目录,运行所有脚本的上级目录,我的是cd C:\Users\Administrator\PycharmProjects\webtest\TestSuit 3.使用Pyth ...
- cloud.cfg_for_centos
users: - default disable_root: 0 ssh_pwauth: 1 locale_configfile: /etc/sysconfig/i18n mount_default_ ...
- 编译Code::Blocks源码 with MinGW on Win
Build Code::Blocks源码 ---By 狂徒归来 CodeBlocks是一款非常优秀的IDE !可惜的是没有64位的版本,而且本来是轻量级别的IDE就应该够轻,能够像记事本工具一样,迅速 ...
- 在Linux上录制终端的操作
在Linux上录制终端的操作 来源 http://blog.51cto.com/stuart/1831570 一.安装基础软件包 1 [root@test software]# yum install ...
- BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】
题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...
- jquery.jbox JBox-v2.3修改版
原版jquery.jbox是个不错的jquery扩展,使用简单,功能很多.可惜的是作者把javascript加密了,并且2011年以后就不再更新.如果项目中用到了新的jquery版本,甚至jbox就没 ...
- GDI+ 双缓存 和 刷新桌面(F5)
GDI+双缓存 POINT currentPoint; GetCursorPos(¤tPoint); HWND hWnd = ::GetDesktopWindow(); int n ...
- RSA加密/解密 Decryption error异常解决
RSA加密/解密 Decryption error异常解决 import java.io.ByteArrayOutputStream; import java.security.Key; import ...
- 使用 padding-bottom 设置高度基于宽度的自适应
我们在做移动端列表,通常会做到图文列表,列表是自适应的.当列表中有图片,图片的宽度是随着列表宽的变化而变化,我们为了在图片宽度变化的时候做到图片的不变形,所有采用以下办法. 本文章只讲语法 html ...
- JS将JSON日期转换为指定格式的日期
1.引入JS日期转换的函数库 function Format(now,mask) { var d = now; var zeroize = function (value, length) { if ...