LGP3813题解
这道题是我去年11月份的时候看到的,当时写了一个假的做法没过样例,然后就没管了。
结果今天在模拟赛的时候放到了 T1(
我也不知道他为什么是对的,可是他就是过了样例和大样例.jpg
容易发现 \(n\) 个矩形的边,将整个矩形划分成了 \((2n)^2\) 个小矩形。这样方便对每个小矩形考虑。
发现一个矩形的限制相当于限制了一车矩形的最大值,所以我们可以做一个 \(O(n^3)\) 的暴力得到每个小矩形的最大值是多少。
我们将最大值限制相同的小矩阵拉出来一起考虑。同时把限制为这个值的 \(O(n)\) 个矩阵拉出来。
看到数据范围 \(n=10\),考虑对这些限制值的矩阵容斥。
设 \(f[S]\) 为选取的矩阵的最大值不为 \(v\) 的方案,那么其他矩阵可以随便乱放。
这一部分的答案就是 \(\sum(-1)^{|S|}f[S]\),而 \(f[S]\) 跑一个暴力是很容易计算的。
我们就做到了 \(O(n^32^n)\),并且还跑不满(
//我也不知道他为什么是对的,可是他就是过了样例和大样例
#include<algorithm>
#include<cstdio>
const int M=15,mod=1e9+7;
int n,V,x,y,lx,ly,len,ppc[1<<M],tx[M<<1],ty[M<<1],mx[M<<1][M<<1];
bool vis[M<<1][M<<1];
struct mat{
int l1,l2,r1,r2,v;//(l1,r1]*(l2,r2]
inline bool operator<(const mat&it)const{
return v<it.v;
}
}m[M],t[M];
inline int pow(int a,int b=mod-2){
int ans(1);for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans;
}
inline int min(const int&a,const int&b){
return a>b?b:a;
}
inline int Solve(const int&v){
int ans(0),sum(0);
for(int i=2;i<=lx;++i)for(int j=2;j<=ly;++j){
if(mx[i][j]==v)sum+=(tx[i]-tx[i-1])*(ty[j]-ty[j-1]);
}
for(int S=0;S<(1<<len);++S){
int cnt(0);
for(int i=0;i<len;++i)if(S>>i&1){
for(int x=t[i+1].l1+1;x<=t[i+1].r1;++x){
for(int y=t[i+1].l2+1;y<=t[i+1].r2;++y){
if(mx[x][y]==v&&!vis[x][y])cnt+=(tx[x]-tx[x-1])*(ty[y]-ty[y-1]),vis[x][y]=true;
}
}
}
for(int i=2;i<=lx;++i)for(int j=2;j<=ly;++j)vis[i][j]=false;
if(ppc[S]&1)ans=(ans+1ll*(mod-pow(v-1,cnt))*pow(v,sum-cnt))%mod;
else ans=(ans+1ll*pow(v-1,cnt)*pow(v,sum-cnt))%mod;
}
return ans;
}
signed main(){
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
int T;scanf("%d",&T);
for(int i=1;i<1024;++i)ppc[i]=ppc[i>>1]+(i&1);
while(T--){
int ans(1);
scanf("%d%d%d%d",&x,&y,&V,&n);lx=ly=0;
tx[++lx]=0;tx[++lx]=x;ty[++ly]=0;ty[++ly]=y;
for(int i=1;i<=n;++i){
scanf("%d%d%d%d%d",&m[i].l1,&m[i].l2,&m[i].r1,&m[i].r2,&m[i].v);
--m[i].l1;tx[++lx]=m[i].l1;tx[++lx]=m[i].r1;
--m[i].l2;ty[++ly]=m[i].l2;ty[++ly]=m[i].r2;
}
std::sort(m+1,m+n+1);
std::sort(tx+1,tx+lx+1);lx=std::unique(tx+1,tx+lx+1)-tx-1;
std::sort(ty+1,ty+ly+1);ly=std::unique(ty+1,ty+ly+1)-ty-1;
for(int i=1;i<=n;++i){
m[i].l1=std::lower_bound(tx+1,tx+lx+1,m[i].l1)-tx;
m[i].r1=std::lower_bound(tx+1,tx+lx+1,m[i].r1)-tx;
m[i].l2=std::lower_bound(ty+1,ty+ly+1,m[i].l2)-ty;
m[i].r2=std::lower_bound(ty+1,ty+ly+1,m[i].r2)-ty;
}
for(int i=2;i<=lx;++i)for(int j=2;j<=ly;++j)mx[i][j]=0x7fffffff;
for(int id=1;id<=n;++id){
for(int i=m[id].l1+1;i<=m[id].r1;++i){
for(int j=m[id].l2+1;j<=m[id].r2;++j){
mx[i][j]=min(mx[i][j],m[id].v);
}
}
}
for(int i=1;i<=n;++i){
if(i!=1&&m[i].v!=m[i-1].v)ans=1ll*ans*Solve(m[i-1].v)%mod,len=0;t[++len]=m[i];
}
ans=1ll*ans*Solve(m[n].v)%mod;len=0;
for(int i=2;i<=lx;++i)for(int j=2;j<=ly;++j){
if(mx[i][j]==0x7fffffff)ans=1ll*ans*pow(V,(tx[i]-tx[i-1])*(ty[j]-ty[j-1]))%mod;
}
printf("%d\n",ans);
}
}
LGP3813题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- spring property标签中的 ref属性和ref 标签有什么不同
spring的配置文件可能会有多个<property name="a" ref="b" />就是找当前配置文件里的bean 也就是b <ref ...
- Oracle用户创建、删除和授权等方法总结
一.查看用户及权限 1.查询所有用户: 1.1.查看所有用户基本信息 select * from all_users; 1.2.查看所有用户相信信息 select * from dba_users; ...
- 基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台
1.板卡概述 板卡由我公司自主研发,基于6UCPCI架构,处理板包含双片TI DSP TMS320C6678芯片:一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片:六个千兆网口( ...
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...
- 浅谈:redis的主从复制 + 哨兵模式
浅谈:redis的主从复制 + 哨兵模式 主从模式 在谈论redis的主从复制之前,我们先回想下mysql的主从搭建过程,第一步呢首先要在主库服务器中修改my.cnf,开启一下bin_log功能, ...
- 前端提升生产力系列三(vant3 vue3 移动端H5下拉刷新,上拉加载组件的封装)
| 在日常的移动端开发中,经常会遇到列表的展示,以及数据量变多的情况下还会有上拉和下拉的操作.进入新公司后发现移动端好多列表,但是在看代码的时候发现,每个列表都是单独的代码,没有任何的封装,都是通过v ...
- 【C# 线程】WaitHandle类
理论 Windows的线程同步方式可分为2种,用户模式构造和内核模式构造.内核模式构造:是由Windows系统本身使用,内核对象进行调度协助的.内核对象是系统地址空间中的一个内存块,由系统创建维护. ...
- 换行符号(\r\n)的历史
文章来源:https://cloud.tencent.com/developer/article/1730918 \r\n与\n是有区别的. 如果要通用的则是\r\n,因为有些编辑器它不认\n &qu ...
- Zabbix使用python批量添加主机及主机资产信息-从零到无
- - 时间:2020年11月10日 - - 作者:飞翔的小胖猪 前言: 使用zabbix作为基础环境的监控系统时,面对现网在用的2000+台把这些主机添加到zabbix监控中是一个问题,当然zabb ...
- 人工智能之深度学习-初始环境搭建(安装Anaconda3和TensorFlow2步骤详解)
前言: 本篇文章主要讲解的是在学习人工智能之深度学习时所学到的知识和需要的环境配置(安装Anaconda3和TensorFlow2步骤详解),以及个人的心得体会,汇集成本篇文章,作为自己深度学习的总结 ...