错了一个小地方调了一晚上。。。。

题目大意:

  给出最多2E+5种不同的矩形,每种有它的长h和宽v还有数量d,现在你要构造大矩形,使得在上面沿着平行于长或宽的边划刀,切出来的矩形正好是给出的所有矩形。问你能构造几种不同的大矩形。其中给出的矩形不能旋转。大矩形亦不能旋转,这意味着长为A,宽为B的大矩形和长为B,宽为A的大矩形不同。

题目分析:

  首先我们令矩形的总数目为tot。那么横着切p刀,竖着且q刀,则(p+1)(q+1)=tot。为了简便,下文的p表示横着切了p-1刀,q表示竖着切了q-1刀。

  以此为突破口,不难证明对于一组(p,q),矩形的大小固定。那么一组(p,q)可以作为大矩形的条件是什么?

  为了得到这个结论,我们设xi表示所有hi相同的矩形的数量,共m种不同的hi。我们不难发现xi是p的倍数。

  理由是这样子的:若xi不是p的倍数,那么在划分后必然在大矩形内有多余的长为hi的小矩形,这样必定非法。所以上面的结论得证!

  由于上面的理由,我们不难发现所有的hi相同的矩形必然集中在一坨,贯穿上下。即如果一列有一个是hi,那么一整列都是hi。

  现在我们解决了长上面的问题,还有宽没解决。

  首先我们发现如果一个v没有对应所有存在的h,那么这个必然无解。理由也很简单,一开始我安排好了p,现在安排q的时候受p的影响。

  同样的我们还能得出两个结论,一是任意的xi/p必然是v的因数,理由和上面相同;二是对于相同的v,它们占的行数相同,这个也很容易想到。

  现在我们通过对h和v的分析,得到了一个比较简单的O(n*sqrt(Σd))的算法,经过计算会发现超时,想办法解决这个问题。

  首先xi是p的倍数意味着p一定是xi的因数,这样p一定是所有xi的因数,也就是说p是所有xi的最大公因数的因数,我们解决了h上的问题。

  考虑v上的第一个结论如何优化,xi/p必然是v的因数。意味着我们可以找到一个si使得gcd(qi,v)=si,接着p一定是qi/si的倍数。所以p是所有qi/si的最小公倍数的倍数。这个可以通过唯一分解定理证明。

  至于v上的第二个结论,首先写出式子,推导后发现这是一个可以预判的式子,预处理的时候直接搞定。

  这样我们得到了一个O(sqrt(Σd))的算法。

代码:

  

 #include<bits/stdc++.h>
using namespace std; #define mp make_pair typedef long long ll;
typedef long double ld; const int maxn = ; int n,m;
struct node{ll h,v,d;}mt[maxn];
vector <pair<ll,ll> > V[maxn];
ll rt[maxn],tot;
ll mx;
ll zzll=; void init(){
for(int i=,now=;i<=n;i++){
if(mt[i].h == mt[now].h){V[m].push_back(mp(mt[i].v,mt[i].d));rt[m]+=mt[i].d;}
else{now = i; m++; V[m].push_back(mp(mt[i].v,mt[i].d)); rt[m]+=mt[i].d;}
}
} void read(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld%lld%lld",&mt[i].h,&mt[i].v,&mt[i].d); tot += mt[i].d;
}
sort(mt+,mt+n+,[](node a,node b){return a.h==b.h?a.v<b.v:a.h<b.h;});
init();
} int NoSolution(){
int hh = V[].size();
for(int i=;i<=m;i++) if(V[i].size()!=hh){return ;}
for(int i=;i<hh;i++){
ll kk = V[][i].second;
for(int j=;j<=m;j++){
ll jj = V[j][i].second;
if(V[j][i].first != V[][i].first){return ;}
if((ld)kk/(ld)rt[] != (ld)jj/(ld)rt[j]){return ;}
}
}
for(int i=;i<=m;i++){
for(int j=;j<V[i].size();j++){
ll mm = __gcd(rt[i],V[i][j].second);
mm = rt[i]/mm;
ll pp = __gcd(zzll,mm);
zzll = (zzll/pp)*mm;
if(zzll > mx){return ;}
}
}
return ;
} ll ans = ;
void solve(ll ht,ll kd){
if(ht % zzll == ){ans ++;}
} void work(){
mx = rt[];
for(int i=;i<=m;i++) mx = __gcd(mx,rt[i]);
if(NoSolution()){puts("");return;}
for(ll i=;i*i<=mx;i++){
if(mx % i != ) continue;
solve(i,tot/i);
if(i*i==mx)break;
solve(mx/i,tot/(mx/i));
}
printf("%lld",ans);
} int main(){
read();
work();
return ;
}

Codeforces963C Cutting Rectangle 【数学】的更多相关文章

  1. *Codeforces963C. Cutting Rectangle

    $n \leq 200000$种互不相同的矩形,给长宽和数量,都$\leq 1e12$,问有多少种大矩形只沿平行长和宽切正好切成这些矩形. 首先可以发现在一个合法情况下,有些矩形的位置是可以乱挪的,比 ...

  2. 【CF963C】Cutting Rectangle(数论,构造,map)

    题意: 思路:考虑构造最小的单位矩形然后平铺 单位矩形中每种矩形的数量可以根据比例算出来,为c[i]/d,其中d是所有c[i]的gcd,如果能构造成功答案即为d的因子个数 考虑如果要将两种矩形放在同一 ...

  3. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)

    A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...

  4. LeetCode之“数学”:Rectangle Area

    题目链接 题目要求: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle i ...

  5. UVA 11880 Ball in a Rectangle(数学+平面几何)

    Input: Standard Input Output: Standard Output � There is a rectangle on the cartesian plane, with bo ...

  6. CF1027C Minimum Value Rectangle 贪心 数学

    Minimum Value Rectangle time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. 【CF1027C】Minimum Value Rectangle(贪心,数学)

    题意:给定n根木棍,不允许拼接或折断,选择四根组成矩形,求所有合法矩形中周长平方与面积比最小的一个,输出拼成这个矩形的四根木棍 n<=1e6 思路:猜结论:答案必定从相邻的4根中产生 证明见ht ...

  8. ACM: SCU 4440 Rectangle - 暴力

     SCU 4440 Rectangle Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu  Practic ...

  9. 二维剪板机下料问题(2-D Guillotine Cutting Stock Problem) 的混合整数规划精确求解——数学规划的计算智能特征

    二维剪板机下料问题(2-D Guillotine Cutting Stock Problem) 的混合整数规划精确求解——数学规划的计算智能特征 二维剪板机下料(2D-GCSP) 的混合整数规划是最优 ...

随机推荐

  1. 前后端分离的利器:fiddler的实用功能举例

    # 前后端分离的利器:fiddler的实用功能举例 ##what's fiddler fiddler是一款代理软件,对于前后端分离开发非常重要.可以说,如果前端开发没有用上fiddler或类似软件,那 ...

  2. 初次接触CSS变量

    本文的目的主要是展示CSS变量是如何工作的.随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性 ...

  3. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  4. Bootstrap 栅格 样式 组件 插件

    -----------------------------起先是我们造成习惯,后来是习惯造成我们. day 51 Bootstrap  官方网站:   bootcss.com/ <!DOCTYP ...

  5. html设置 hight100%问题

    Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度.如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度.但是高度的计算方式完全不一样.事实上,浏览器根本就不计算内容的高度, ...

  6. H5 video标签的第二种格式

    36-video标签的第二种格式 2.第二种格式存在的意义: 由于视频数据非常非常的重要, 所以五大浏览器厂商都不愿意支持别人的视频格式, 所以导致了没有一种视频格式是所有浏览器都支持的 这个时候W3 ...

  7. 007-迅雷定时重启AutoHotkey脚本-20190411

    ;; 定时重启迅雷.ahk,;;~ 2019年04月11日;#SingleInstance,forceSetWorkingDir,%A_ScriptDir%DetectHiddenWindows,On ...

  8. docker之导出、导入、数据搬迁

    docker 导出 导入有二种,一种是备份镜像,一种备份容器.数据搬迁,最简单粗暴就是直接COPY,volume的路径就行了. 一.导出导入镜像 #导出为tar docker save #ID or  ...

  9. Divide by three, multiply by two CodeForces - 977D (思维排序)

    Polycarp likes to play with numbers. He takes some integer number xx, writes it down on the board, a ...

  10. 替换iframe的内容

    一般就是点个按钮然后在不跳转页面的情况下显示另外一个页面的内容,显示的速度比较快,ifream还算是常用的吧 用的时候实现方式有以下几种, 1.替换src路径(觉得麻烦,没接触过,就不这样干了) 2. ...