题目传送门:https://atcoder.jp/contests/abc136/tasks/abc136_f

  题目大意:在平面上有$n$个点我们,定义一个点集的权值为平面上包含这个点集的最小矩形所包含的点个数(矩形的边与坐标轴平行),求所有非空点集的权值和,保证每个点的横纵坐标互不相同。

  先考虑转化一下,求每个点被多少个点集$S$的矩形包含,假设我们当前考虑的是点$i$,那么可以分成两种情况:$i \in S$或$i \notin S$。

    1. 对于$i \in S$的情况,容易发现点$i$对所有包含$i$的点集有贡献,这里的贡献为$2^(n-1)$。

    2. 对于$i \notin S$的情况,因为每个点的横纵坐标互不相同,所以点$i$把整个坐标系划分成了4个区域

    那么若点集$S$的矩形包含点$i$,那么必存在$p,q \in S,p \in A,q \in D$或$p \in B,q \in D$。

    设$A$区域中的点数量为$a$,$B$区域中的点数量为$b$,$C$区域中的点数量为$c$,$D$区域中的点数量为$d$,容斥可知这里的贡献为$(2^a-1)2^b2^c(2^d-1)+2^a(2^b-1)(2^c-1)2^d-(2^a-1)(2^b-1)(2^c-1)(2^d-1)$。

  计算每个区域的点数可以将点排序离散化后用树状数组维护,于是就可以在$O(n \log n)$的时间复杂度下解决问题。

  代码:

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define mod 998244353
#define maxn 200010
inline ll read()
{
ll x=; char c=getchar(),f=;
for(;c<''||''<c;c=getchar())if(c=='-')f=-;
for(;''<=c&&c<='';c=getchar())x=x*+c-'';
return x*f;
}
inline void write(ll x)
{
static char buf[],len; len=;
if(x<)x=-x,putchar('-');
for(;x;x/=)buf[len++]=x%+'';
if(!len)putchar('');
else while(len)putchar(buf[--len]);
}
inline void writesp(ll x){write(x); putchar(' ');}
inline void writeln(ll x){write(x); putchar('\n');}
struct Data{
int x,id;
}num[maxn];
struct point{
int x,y,rk;
}a[maxn];
int n;
bool cmp1(Data a,Data b){return a.x<b.x;}
bool cmp2(point a,point b){return a.x<b.x;}
inline ll power(ll a,ll b)
{
ll ans=;
for(;b;b>>=,a=a*a%mod)
if(b&)ans=ans*a%mod;
return ans;
}
int bit1[maxn],bit2[maxn];
void add1(int x,int k){for(;x<=n;x+=x&(-x))bit1[x]+=k;}
int getsum1(int x){int sum=; for(;x;x-=x&(-x))sum+=bit1[x]; return sum;}
void add2(int x,int k){for(;x<=n;x+=x&(-x))bit2[x]+=k;}
int getsum2(int x){int sum=; for(;x;x-=x&(-x))sum+=bit2[x]; return sum;}
int main()
{
n=read();
for(int i=;i<=n;i++){
a[i].x=read(); a[i].y=read();
num[i].x=a[i].y; num[i].id=i;
}
std::sort(num+,num+n+,cmp1);
for(int i=;i<=n;i++)
a[num[i].id].rk=i;
std::sort(a+,a+n+,cmp2);
for(int i=;i<=n;i++)
bit1[i]=,bit2[i]=i&(-i);
ll ans=;
for(int i=;i<=n;i++){
add2(a[i].rk,-);
int A=getsum1(a[i].rk),B=getsum1(n)-getsum1(a[i].rk),C=getsum2(a[i].rk),D=getsum2(n)-getsum2(a[i].rk);
ll totA=power(,A),totB=power(,B),totC=power(,C),totD=power(,D);
ans=(ans+(totA-)*totB%mod*totC%mod*(totD-))%mod;
ans=(ans+totA*(totB-)%mod*(totC-)%mod*totD)%mod;
ans=(ans-(totA-)*(totB-)%mod*(totC-)%mod*(totD-)%mod+mod)%mod;
ans=(ans+power(,n-))%mod;
add1(a[i].rk,);
}
writeln(ans);
return ;
}

abc136F

【atcoder】Enclosed Points [abc136F]的更多相关文章

  1. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  2. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  3. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  4. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  5. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  6. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  7. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  8. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  9. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

随机推荐

  1. 【404】int main(int argc,char * argv[]) windows 下的使用

    参考:int main(int argc,char * argv[]) windows 下的使用 参考:Theprogram can't start because libgcc_s_dw2-1.dl ...

  2. Path环境变量的作用

    作用: 当我们要求系统运行一个程序(例如a.exe)而没有告诉它程序所在的完整路径时,系统会先在当前目录寻找是否存在a.exe,如果找到,直接运行:如果没有找到,会去path路径下面找.设置path, ...

  3. Unity Shader基础(1):基础

    一.Shaderlab语法 1.给Shader起名字 Shader "Custom/MyShader" 这个名称会出现在材质选择使用的下拉列表里 2. Properties (属性 ...

  4. matlab 提取图像轮廓(图像边缘提取)

    利用edge()函数提取图像轮廓,绘制出对象的边界和提取边界坐标信息,matlab实现代码如下: close all;clear all;clc; % 提取图像轮廓,提取图像边缘 I = imread ...

  5. 记录编译<Separable Subsurface Scattering demo>工程遇到的问题

    1. Separable Subsurface Scattering demo 可以从 https://github.com/iryoku/separable-sss 下载下来,但是默认的sln 是 ...

  6. JDK1.8新特性之Optional

    概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...

  7. Fabric 查看 blockfile_000000 区块文件

    进入peer docker exec -it peer bash cd /var/hyperledger/production/ledgersData/chains/chains

  8. 在先电IAAS平台中,搭建先电bigdata平台

    以两台节点为例来组件Hadoop分布式集群,这里采用的系统版本为Centos7,如下表所示: 主机名 内存 硬盘 IP地址 角色 master 8192MB 100G 192.168.200.131 ...

  9. npm run build报错 No PostCSS Config found in

    在项目根目录新建postcss.config.js文件,并对postcss进行配置: module.exports = { plugins: [ require('autoprefixer')//自动 ...

  10. 软件测试工具LoadRunner常见问题

    1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Inter ...