
牛客17423 vcd
发布日期:2021-05-06 15:23:23
浏览次数:30
分类:精选文章
本文共 2139 字,大约阅读时间需要 7 分钟。
一、题意
定义点集S是好点集:S的每一个子集都能被一个左边界和宽固定,长度无限长的矩形覆盖,并且只会覆盖该子集中的点。
给一个n个点的集合T,问集合T的子集有几个是好点集。每个点记作(x,y)。
数据范围:
二、题解
设满足好点集要求的T的子集为R
(1)R的子集的大小是1都是可以的。
(2)R的子集的大小是2,需要纵坐标不同。这个直接统计就好了。
(3)R的子集的大小是3,需要构成'<'这个形状,即下图所示。先排序,再pbds或者bit都行。
(4)4个点及以上不可以。
三、感受
查排名直接order_of_key,不用先lower_bound
四、代码
#include#include #include #define pb push_back#define fi first#define se second#define sz(x) (int)x.size()#define cl(x) x.clear()#define all(x) x.begin() , x.end()#define rep(i , x , n) for(int i = x ; i <= n ; i ++)#define per(i , n , x) for(int i = n ; i >= x ; i --)#define mem0(x) memset(x , 0 , sizeof(x))#define mem_1(x) memset(x , -1 , sizeof(x))#define mem_inf(x) memset(x , 0x3f , sizeof(x))#define debug(x) cerr << #x << " = " << x << '\n'#define ddebug(x , y) cerr << #x << " = " << x << " " << #y << " = " << y << '\n'#define ios std::ios::sync_with_stdio(false) , cin.tie(0)using namespace std ;using namespace __gnu_pbds ;template using ordered_set = tree , rb_tree_tag, tree_order_statistics_node_update> ;typedef long long ll ;typedef long double ld ;typedef pair pii ;typedef pair pll ;const int mod = 998244353 ;const int maxn = 2e5 + 10 ;const int inf = 0x3f3f3f3f ;const double eps = 1e-6 ; mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count()) ; int n ;ordered_set s ;struct node{ ll x , y ;} p[maxn] ;bool cmp1(node s , node t){ return s.y < t.y ;}bool cmp2(node s , node t){ return s.x > t.x ;}int main(){ ios ; ll ans = 0 ; cin >> n ; rep(i , 1 , n) cin >> p[i].x >> p[i].y ; //1个点 ans += n ; //2个点 sort(p + 1 , p + n + 1 , cmp1) ; rep(i , 1 , n) { int j = i ; while(j + 1 <= n && p[j + 1].y == p[j].y) j ++ ; ans += 1ll * (j - i + 1) * (n - j) % mod , ans %= mod ; i = j ; } //3个点 sort(p + 1 , p + n + 1 , cmp2) ; rep(i , 1 , n) { int j = i ; while(j + 1 <= n && p[j + 1].x == p[j].x) j ++ ; rep(k , i , j) { ll t1 = sz(s) - s.order_of_key({p[k].y + 1 , 0}) ; ll t2 = s.order_of_key({p[k].y - 1 , 10000000}) ; ans += t1 * t2 % mod , ans %= mod ; } rep(k , i , j) s.insert({p[k].y , k}) ; i = j ; } cout << ans << '\n' ; return 0 ;}
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月24日 18时04分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
qt中moc的作用
2019-03-06
阿里钉钉面试题
2019-03-06
华为社招笔试
2019-03-06
MFC的Dlg和App什么区别?应用程序类与对话框类
2019-03-06
C\C++下获取系统进程或线程ID(转)
2019-03-06
VS环境变量(转)
2019-03-06
C++中找资源或者函数的方法
2019-03-06
一些留给自己的思考题(只求回过头来能够有所获)
2019-03-06
SQL函数返回表的写法
2019-03-06
delete对象时会自动调用类的析构函数
2019-03-06
C++ 子类对象直接赋值给父类对象可行,反过来不行
2019-03-06
WMWare下安装centOS7,并使用xshell进行连接记录.
2019-03-06
linux下同一个动态库名为何辣么多的.so文件
2019-03-06
SQL联表的方式(逗号, Left Join, Right Join)
2019-03-06
牛客网输入输出举例
2019-03-06
字符串初始化时的注意点
2019-03-06
dll路径加载顺序
2019-03-06
悬垂指针和野指针的区别
2019-03-06
软考相关试题
2019-03-06
顺序表的操作
2019-03-06