UESTC_Tournament CDOJ 124

A sports company is planning to advertise in a tournament. It is a single round-robin tournament, that‘s to say competitors play with all the others once. The company thinks that the advertising impact is proportional to the so called competitiveness degree(CD) of the tournament.

CD is calculated in the following way: We assume there‘re N competitors in the tournament and of course N×(N−1)2 matches in total. For each competitor we define two values S and E which stand for skill and experience. We say a match between competitor i and competitor j is competitive if and only if Si+Ei≥Sj and Sj+Ej≥Si. CD equals to the number of competitive matches among all N×(N−1)2 matches in the tournament.

Input

One integer T (T≤20) on the first line indicates the number of cases. The first line of each case contains one integer N (1≤N≤10000) -- the number of competitors. Then N lines follows. The ithline contains two integer Si and Ei (1≤Si,Ei≤100000000) which are defined in the description.

Output

For each case, print the value of CD on a line.

Sample input and output

Sample Input Sample Output
3
2
1 2
4 1
2
1 2
2 2
5
1 9
5 4
3 4
2 2
6 2
0
1
8

Source

The 8th UESTC Programming Contest Final

解题报告

题目意思很简单,找出给出这些整数中有多少队满足

Si+Ei≥Sj and Sj+Ej≥Si

第一想法是暴力,too simple...结果肯定是TLE

How to slove?

我们先对Si + Ei 按照从大到小排序,

对于排序后的序列来讲,若有i < j,若i能到pos位,则j能到达的位置肯定<=pos

因此维护一个S单调不减,每次更新答案即可.

注意到我们不是一次把某队数满足的所有其他队数加上去,而是不断累加(类似于将来的值)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>

using namespace std;
const int maxn = 1e4 + 5;
int n;

multiset<int>s;

typedef struct data
{
  int s,e;
  friend bool operator < (const data & x,const data & y)
   {
         return x.s + x.e > y.s + y.e;
   }
};

data A[maxn];

int main(int argc ,char * argv[])
{
  int Case;
  scanf("%d",&Case);
  while(Case--)
   {
         int ans = 0;
         scanf("%d",&n);
         for(int i = 0 ; i < n ; ++ i)
          scanf("%d%d",&A[i].s,&A[i].e);
         sort(A,A+n);
         s.clear();
         s.insert(A[0].s);
         set<int>::iterator it = s.begin();
         int cot = 1;
         for(int i = 1 ; i < n ; ++ i)
          {
                int temp = A[i].s + A[i].e;
                while( s.size() > 0  && *it > temp)
                 {
                       s.erase(it--);
                       cot--;
           }
          ans += cot++;
          s.insert(A[i].s);
          if (A[i].s >= *it)
           it++;
       }
      cout << ans << endl;
   }
  return 0;
}
时间: 2025-01-04 08:43:45

UESTC_Tournament CDOJ 124的相关文章

第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)

124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节点为结尾(包含它或者不包含)的最大值,有两种情况,分别来自左儿子和右儿子设为Vnow. 然后考虑经过这个节点的情况来更新最终答案.更新答案后返回Vnow供父节点继续更新. 代码很简单. 有一个类似的很有趣的题目,给定一个二叉树,选择一条路径,使得权值最大的和最小的相差最大.参考POJ3728 cla

RHCSA全课程讲解124(1-7)

RHCSA课程: 124(1-7) 前序: Linux的三句经典: a.Linux没有盘符之说,只有文件和文件夹之说 b.Linux万物始于根,所以最大的文件夹:/ c.Linux没有后缀之说,一切皆文件 第一课:文件类型与一级目录: 1.Linux文件类型: Linux文件类型 表示 颜色 目录文件 d 蓝色 链接文件 l 亮蓝色 特殊(设备)文件 c(快设备) b(块设备) 黄色 普通文件 - 黑色 软件包 红色 可执行文件 绿色 2.Linux一级目录: 名称 注释 /bin 存放系统命令

CDOJ 1273 God Qing&#39;s circuital law

暴力枚举+idea.做的时候mod写错了,写成了1000000009,找了两个多小时才发现...... a[1],a[2],a[3]....a[N] b[1],b[2],b[3]....b[N] 首先需要枚举b[1]...b[N]与a[1]进行组合. 然后对a[2]...a[N]从小到大排序 对b[1],b[2],b[3]....b[N] 除当前与a[1]组合的以外,剩下的从大到小排序 然后找出每一个a[i]在不破坏a[0]最大值的情况下最大能与哪一个b[i]配对. 然后从第N个人开始往第2个人

2016上半年数据库系统工程师上午试题(1-24)

<五年高考三年模拟>相当于高考"武功秘籍"中的<九阴真经>.海量的题库,对真题详尽的解析,备受老师和学生的追捧.可见,真题是应对考试的上好资料,下面希赛软考学院为你整理了2016年上半年数据库系统工程师考试真题的上午题,助你修炼出一身"绝技",应对来年的数据库系统工程师考试. 2016年上半年数据库系统工程师考试上午试题(1-24) ●VLIW是()的简称. (1)A.复杂指令系统计算机 B.超大规模集成电路 C.单指令流多数据流 D.超长指

UESTC_魔法少女小蟹 CDOJ 710

小蟹是一名魔法少女,能熟练的施放很多魔法. 有一天魔法学院上课的时候出现了这样一道题,给一个6位数,让大家用自己的魔法,把这个6位数变成另一个给定的6位数. 小蟹翻了下魔法书,发现她有以下6种魔法: 将当前魔杖指向的数字与最左端的一个数字调换位置. 将当前魔杖指向的数字与最右端的一个数字调换位置. 将当前魔杖指向的数字+1.(若当前魔杖指向的数字为9则无效) 将当前魔杖指向的数字−1.(若当前魔杖指向的数字为0则无效) 将当前魔杖向右移动一位. 将当前魔杖向左移动一位. 最开始,她的魔杖指向的是

UESTC_冰雪奇缘 CDOJ 843

艾莎女王又开始用冰雪魔法盖宫殿了. 她决定先造一堵墙,于是释放魔法让形为直角梯形的冰砖从天而降,定入冻土之中. 现在你将回答女王的询问:某段冻土上冰砖的面积. 注:多块冰砖之间会互相重叠,重叠部分要多次计算. Input 第一行一个整数n,表示有n个冰砖先后定入了冻土之中. 冻土上刚开始并没有冰砖. 接下来n行,每行6个整数,x1i,h1i,x2i,h2i,li,ri. 表示一次如图所示的冰砖下落,并询问在这之后,落在[li,ri]内冰砖的总面积. 2≤n≤100000,−108≤li<ri≤1

NYOJ题目124中位数

------------------------------------- 排序取中间数即可 AC代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 8 Scanner sc=new Scanner(System.in); 9 10 int times=sc.nextInt(); 11 wh

CDOJ 26 遮挡判断(shadow) 解题报告

题目链接http://acm.uestc.edu.cn/#/problem/show/26 出题目的给我说清东边是哪一边啊魂淡! 分析样例可得,东边是先读入数据的那一边. 这题主要考察排序,然而感谢上苍我有<algorithm> 另外,CDOJ是可以用C++11标准的匿名函数的,所以sort的比较函数我就打了匿名的 这题只要记录一下扫到的柱子中投影最西边最靠西的那根,不妨设为柱子h 如果这根柱子h能完全遮住当前扫到的柱子i,那么柱子h仍然是影子最靠西的柱子 如果这根柱子h不能完全遮住当前扫到的

2016 - 1- 24 随便写写~~

反正也没什么人看 就随便写写吧~ 我是从来没想过我可能会成为一个码农的,虽然我现在很讨厌这个词啊哈哈哈. 说实话,直到今天我都觉得自己大学生活过的好失败,什么都没学到,白白浪费了三年多的光阴.好像从来没发现过什么东西可以吸引到我.除了游戏啊哈哈哈. C语言都挂了两次,我怎么可能敲得好代码呢?对吧? 但是真是接触到了 我才发现我多么热爱这个东西,我觉得面向对象的编程真的好美好方便啊哈哈 无论怎么自己也算迈出了第一步吧,也许我这辈子也到不了能到顶尖大牛的水准,但是我觉得我做一些我热爱的东西,起码生活