Coder-Strike 2014
程序员文章站
2022-05-02 22:38:29
...
codeforces.com/contest/421/problem/D 题意:
给定n个数对(a, b),现在求有多少个数对(x, y)(1 3?≤?n?≤?3·105
分析:
不妨设选定两个数x、y,那么这对的值应该是cnt[x] + cnt[y] - cnt[(x, y)]。思考方向:
1.考虑(x, y):这样的复杂度是n*n的,且没办法降低,所以不可解
2.单独考虑一个x:现在一个明显的想法是二分找到所有满足cnt[x] + cnt[y] >= goal的个数,但是由于少减去了cnt[(x, y)],所以答案会包括一部分不正确的。但是(x, y)的对数是有限的,所以我们可以枚举所有的(x, y),看看它是否算在了答案中且是否合法
给定n个数对(a, b),现在求有多少个数对(x, y)(1 3?≤?n?≤?3·105
不妨设选定两个数x、y,那么这对的值应该是cnt[x] + cnt[y] - cnt[(x, y)]。思考方向:
1.考虑(x, y):这样的复杂度是n*n的,且没办法降低,所以不可解
2.单独考虑一个x:现在一个明显的想法是二分找到所有满足cnt[x] + cnt[y] >= goal的个数,但是由于少减去了cnt[(x, y)],所以答案会包括一部分不正确的。但是(x, y)的对数是有限的,所以我们可以枚举所有的(x, y),看看它是否算在了答案中且是否合法
const int MAXN = 310000;struct Node{ int n, num; int operator, int> mp; FE(i, 1, n) ipt[i].n = i; FE(i, 1, n) ipt[i].num = 0; REP(i, n) { RI(a); ipt[a].num++; cnt[a]++; RI(b); ipt[b].num++; cnt[b]++; if (a > b) swap(a, b); mp[MP(a, b)]++; } sort(ipt + 1, ipt + n + 1); LL ans = 0; FE(i, 1, n) { int ind = lower_bound(ipt + i + 1, ipt + n + 1, k - ipt[i].num, cmp) - ipt; ans += n - ind + 1; } FC(it, mp) { a = (it->first).first; b = (it->first).second; if (cnt[a] + cnt[b] >= k && cnt[a] + cnt[b] - it->second
推荐阅读
-
记2014年暑假,一个项目,三个框架
-
2014年找工作小结
-
2014年巴西世界杯直播软件排行榜介绍 2014世界杯直播软件哪个好?
-
BZOJ 3671 [Noi 2014] 贪心 解题报告
-
【JZOJ】 3566. 【GDKOI2014】阶乘
-
OGG的最新版本Version11.2.1.0.25BLR19358139–1September2014
-
程序员 - PHP时间问题,2014-1-21 和 2013-5-13 请用最有效率的方法计算出两个时间相差的年份和月份??
-
Photoshop设计制作一张华丽大气的古典风格2014新年贺卡
-
C#实现的优酷真实视频地址解析功能(2014新算法)
-
SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)