[COCI2015]COCI

题目大意:

有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数。现在已经得知每个人前两轮的成绩。若规定一个人\(A\)在前两轮的成绩均严格高于\(B\),则\(A\)在第\(3\)轮的成绩也一定高于\(B\)。求每个人在比赛完成后,最高及最低的可能排名。

思路:

以最高排名为例,对于人\(A\)来言,若\(B\)在前两轮得分的总和\(-A\)在前两轮得分的总和\(\ge 650\),则无论如何,\(A\)都没有再次超过\(B\)的可能。

剩下我们则需要统计与\(A\)两轮得分差值不超过\(650\),但是又全面碾压\(A\)的人的个数。这显然是一个二维数点问题,用二维树状数组解决即可。

时间复杂度\(\mathcal O(n\log^2650)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5e5+1,M=652;
struct Player {
int a,b,id;
int total() const {
return a+b;
}
bool operator < (const Player &rhs) const {
return total()<rhs.total();
}
};
Player p[N];
class FenwickTree1 {
private:
int val[M][M];
int lowbit(const int &x) const {
return x&-x;
}
public:
void modify(int p,const int &q,const int &x) {
for(;p;p-=lowbit(p)) {
for(register int j=q;j;j-=lowbit(j)) {
val[p][j]+=x;
}
}
}
int query(int p,const int &q) {
int ret=0;
for(;p<M;p+=lowbit(p)) {
for(register int j=q;j<M;j+=lowbit(j)) {
ret+=val[p][j];
}
}
return ret;
}
};
FenwickTree1 t1;
class FenwickTree2 {
private:
int val[M][M];
int lowbit(const int &x) const {
return x&-x;
}
public:
void modify(int p,int q,const int &x) {
for(p++,q++;p<M;p+=lowbit(p)) {
for(register int j=q;j<M;j+=lowbit(j)) {
val[p][j]+=x;
}
}
}
int query(int p,int q) {
int ret=0;
for(p++,q++;p;p-=lowbit(p)) {
for(register int j=q;j;j-=lowbit(j)) {
ret+=val[p][j];
}
}
return ret;
}
};
FenwickTree2 t2;
int max[N],min[N];
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
p[i].a=getint();
p[i].b=getint();
p[i].id=i;
}
std::sort(&p[1],&p[n]+1);
for(register int i=1,j=1;i<=n;i++) {
for(;j<=n&&p[j].total()-p[i].total()<=650;j++) {
t1.modify(p[j].a,p[j].b,1);
}
max[p[i].id]=n-j+1+t1.query(p[i].a+1,p[i].b+1);
t1.modify(p[i].a,p[i].b,-1);
}
std::reverse(&p[1],&p[n]+1);
for(register int i=1,j=1;i<=n;i++) {
for(;j<=n&&p[i].total()-p[j].total()<650;j++) {
t2.modify(p[j].a,p[j].b,1);
}
min[p[i].id]=n-(n-j+1+t2.query(p[i].a-1,p[i].b-1));
}
for(register int i=1;i<=n;i++) {
printf("%d %d\n",max[i]+1,min[i]);
}
return 0;
}

[COCI2015]COCI的更多相关文章

  1. [COCI]coci2015/2016 nekameleoni

    题意: 初始数列,每个数都在1~k以内 支持两种操作:1.修改一个数,修改后的数在1~k内                           2.查询一个最短包含1~k的序列的长度 查询100000 ...

  2. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  3. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  4. [SinGuLaRiTy] COCI 2011~2012 #2

    [SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s   ...

  5. BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]

    3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...

  6. BZOJ3810: [Coci2015]Stanovi

    3810: [Coci2015]Stanovi Description Input 输入一行,三个整数,n, m, k   Output 输出一个数,表示最小不满意度.   Sample Input ...

  7. BZOJ_2223_[Coci 2009]PATULJCI_主席树

    BZOJ_2223_[Coci 2009]PATULJCI_主席树 Description Input 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 ...

  8. COCI 2018/2019 CONTEST #2 T4 Maja T5Sunčanje Solution

    COCI 2018/2019 CONTEST #2 T4 T5 Solution abstract 花式暴力 #2 T5 Sunčanje 题意 按顺序给你1e5个长方形(左下角坐标&& ...

  9. 【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社

    原题地址:P4312 [COCI 2009] OTOCI / 极地旅行社/SP4155 OTOCI - OTOCI lct入门难度的题,十分弱智(小蒟蒻说lct是什么,能吃吗?) bridge操作判联 ...

随机推荐

  1. data-key

    在foreach或者each循环中给按钮赋予值 html中:data-key="@config.key" js里获取值: var key = $(this).data(" ...

  2. OpenCV-Python入门教程5-阈值分割

    一.固定阈值分割 import cv2 import matplotlib.pyplot as plt # 灰度图读入 img = cv2.imread('gradient.jpg', 0) # 阈值 ...

  3. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  4. Swap file ".hive-site.xml.swp" already exists

    1.使用命令[hadoop@slaver1 conf]$ ls -la查找出隐藏文件,然后删除报出来的错误文件. [hadoop@slaver1 conf]$ rm -rf .hive-site.xm ...

  5. javascript 语句和严格模式(三)

    一.语句 javascript程序由语句组成,语句遵守特定的语法规则. block break continue empty if...else switch try catch var functi ...

  6. SPOJ 1812 LCS2

    题解: 和上一题差不多 每个点记录前面的到这个点的最大值 初值赋为len[i] 然后注意要用子节点更新父节点 代码: #include <bits/stdc++.h> #define ll ...

  7. alpha冲刺7/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺7 团队部分 后敬甲(组长) 过去两天完成了哪些任务 界面设计.图标设计 写博客 接下来的计划 准备下周答辩 跟进进 ...

  8. Android开发——使用Jword生成本地word文档

    本文主要介绍如何使用Jword生成本地word文档,这里涉及到Jword的使用技巧,本文给出相应的代码,需要的朋友可以参考下. 为什么使用Jword呢?因为IText .Freemark在安卓平台上压 ...

  9. 从源码开始运行Bitcoin Core

    安装Ubuntu 环境:虚拟机 网络连接:桥接 系统版本:16.04 源:ali 安装编译环境(依赖库) sudo apt-get update sudo apt-get install build- ...

  10. Python_set集合部分功能介绍

    set:无序集合,不能出现重复的元素 set的创建:s1=set() #访问速度快 #解决重复问题 x.add():添加一个新的元素,添加的重复的元素自动过滤掉 x.clear():清空集合 x.di ...