题目

$noip$ 欢乐赛真是欢乐,除了不欢乐的方面以外我都很欢乐。


T1

鸡汤题目,故意输对后面的胜率又没有影响,为什么要故意输呢?

所以第二个决策是凑字用的,这题就是朴素递推概率,最后乘结果权值计算期望。

 #include<cctype>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline int read(){
int x=; bool f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
if(f) return x;
return -x;
}
#define N 1001
int n;
double p[N][N],f[N][N];
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
n=read();
int i,j;
f[][]=;
for(i=;i<=n;++i){
cin>>p[i][j]; f[i][]=f[i-][]*(-p[i][j]);
for(j=;j<i;++j){
cin>>p[i][j];
f[i][j]=f[i-][j-]*p[i][j-]+f[i-][j]*(-p[i][j]);
}
f[i][j]=f[i-][j-]*p[i][j-];
}
double ans=;
for(i=;i<=n;++i) ans+=f[n][i]*i;
printf("%.2f",ans);
return ;
}

T2

原题……在日本竞赛书上看到过……

把 $40$ 个数平分成两半,枚举其中一半的选取情况,然后在另一半中二分出能取的最大的剩下部分。时间复杂度 $O(2^{20}*log(2^{20}))$。

 #include<cctype>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
inline int read(){
int x=; bool f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
if(f) return x;
return -x;
} int n,x;
ll v[<<],l[<<],r[<<];
int main(){
freopen("cake.in","r",stdin);
freopen("cake.out","w",stdout);
n=read(),x=read();
int i,to=n>>;
for(i=;i<=to;++i) v[<<(i-)]=read();
int l_len=<<to, r_len=<<(n-to), tmp;
for(i=;i^l_len;++i) tmp=i&(i-), l[i]=v[i^(i&tmp)]+l[i&tmp];
for(i=;i<=n-to;++i) v[<<(i-)]=read();
for(i=;i^r_len;++i) tmp=i&(i-), r[i]=v[i^(i&tmp)]+r[i&tmp];
sort(l+,l+l_len);
sort(r+,r+r_len);
int wz; ll ans=;
for(i=;i^l_len;++i){
if(l[i]>x) continue;
wz=upper_bound(r+,r+r_len,x-l[i])-r-;
ans=max(ans,l[i]+r[wz]);
//printf("go:%d %d %d %d\n",i,wz,l[i],r[wz]);
}
printf("%lld",x-ans);
return ;
}

T3

CXM 之前讲过……

矩阵不相交的情况 和 相交而且数不相同的情况也很好做,直接用小的限制覆盖掉大的限制就完了。

两个矩阵相交而且数相同的话,会麻烦一点,因为在重叠区域放一个数就可以满足两个限制,而在两矩阵不相交的地方,需要两边各放一个才行。

而且更多数相同的矩阵相交的话,计算就更复杂了。

那怎么算?容斥?

其实可以把相交且数相同的矩阵连通块分割,使任意相邻两块的覆盖层数不相等,然后用二进制数给每个部分按照覆盖情况进行二进制编号,做 $dp$。简单地说就是状压 $dp$。

 #include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=(x);i<=(y);i++)
#define dwn(i,x,y) for(register int i=(x);i>=(y);i--)
#define maxn 51
#define maxk 10010
#define maxs ((1<<10)+5)
#define LL long long
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-,ch=getchar();
while(isdigit(ch))x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
void write(int x)
{
int f=;char ch[];
if(!x){putchar(''),putchar('\n');return;}
if(x<)x=-x,putchar('-');
while(x)ch[++f]=x%+'',x/=;
while(f)putchar(ch[f--]);
putchar('\n');
}
typedef struct quest{int l,r,u,d,k;}que;
que q[maxn];
const int mod=1e9+;
int f[maxs][maxs],sum;//,sum;
int full,fulls,r,c,n,m,g[maxn][maxn],siz[maxs],tox[maxk],toy[maxk],num[maxn][maxn],bacx[maxn],bacy[maxn],extx[maxn],exty[maxn],cntx,cnty,nowx=,nowy=;
int mul(int x,int y)
{
int ans=;
while(y)
{
if(y&)ans=(int)(((LL)ans*(LL)x)%((LL)mod));
x=(int)(((LL)x*(LL)x)%((LL)mod)),y>>=;
}
return ans;
}
void print(int x)
{
rep(i,,n)cout<<((x&(<<(i-)))?:);return;
}
int main()
{
freopen("grid.in","r",stdin);
freopen("grid.out","w",stdout);
memset(bacx,-,sizeof(bacx));
memset(bacy,-,sizeof(bacy));
r=read(),c=read(),m=read(),n=read();
bacx[]=bacy[]=;tox[]=toy[]=;
fulls=(<<n)-;
rep(i,,n)
q[i].l=read(),q[i].u=read(),q[i].r=read(),q[i].d=read(),q[i].k=read(),
extx[++cntx]=q[i].l,extx[++cntx]=q[i].r,exty[++cnty]=q[i].u,exty[++cnty]=q[i].d;
sort(extx+,extx+cntx+),sort(exty+,exty+cnty+);
extx[]=;
rep(i,,cntx)
{
if(extx[i]!=extx[i-]){if(extx[i]-extx[i-]>)nowx++;bacx[nowx]=extx[i],tox[extx[i]]=nowx,nowx++;}
}
if(bacx[nowx-]!=r){if(r-extx[cntx]>)nowx++;bacx[nowx]=r,tox[r]=nowx;}
else nowx--;
exty[]=;
rep(i,,cnty)
{
// cout<<exty[i]<<endl;
if(exty[i]!=exty[i-]){if(exty[i]-exty[i-]>)nowy++;bacy[nowy]=exty[i],toy[exty[i]]=nowy,nowy++;}
}
if(bacy[nowy-]!=c){if(c-exty[cnty]>)nowy++;bacy[nowy]=c,toy[c]=nowy;}
else nowy--;
rep(i,,nowx)
rep(j,,nowy)
{
int numx,numy;
if(bacx[i]!=-)numx=;
else numx=bacx[i+]-bacx[i-]-;
if(bacy[j]!=-)numy=;
else numy=bacy[j+]-bacy[j-]-;
num[i][j]=numx*numy;
}
rep(i,,n)
{
rep(j,tox[q[i].l],tox[q[i].r])
rep(k,toy[q[i].u],toy[q[i].d])
g[j][k]+=(<<(i-));
}
rep(i,,nowx)
{
rep(j,,nowy)
{
siz[g[i][j]]+=num[i][j];
full=max(full,g[i][j]);
}
}
f[][]=mul(m,siz[]);
rep(i,,full-)
{
rep(j,,fulls)
{
int limit=m,num=;
rep(k,,n)if((i+)&(<<(k-)))limit=min(limit,q[k].k);
rep(k,,n)if(((i+)&(<<(k-)))&&q[k].k==limit)num|=(<<(k-));
f[i+][j]=(int)(((LL)f[i+][j]+(LL)f[i][j]*(LL)mul(limit-,siz[i+]))%((LL)mod));
f[i+][j|num]=(int)(((LL)f[i+][j|num]+(LL)f[i][j]*(((LL)mul(limit,siz[i+])-(LL)mul(limit-,siz[i+])+(LL)mod)%((LL)mod)))%((LL)mod));
}
}
write(f[full][fulls]);
return ;
}
/*
2 3 2 1
1 2 2 3 2
*/
/*
3 6 3 2
1 2 2 3 2
1 3 3 6 1
*/
/*
7 11 5 4
2 2 4 4 3
3 3 5 5 2
4 4 5 9 3
1 7 6 8 1
*/

SYF

 #include<bits/stdc++.h>
typedef long long i64;
const int P=1e9+;
int T,h,w,m,n;
int xs[],ys[],xp,yp,vs[],vp,ts[];
int rc[][],mv[][],as[][];
void mins(int&a,int b){if(a>b)a=b;}
int pw(int a,int n){
int v=;
for(;n;n>>=,a=i64(a)*a%P)if(n&)v=i64(v)*a%P;
return v;
}
int main(){
int ans=;
scanf("%d%d%d%d",&h,&w,&m,&n);
xp=yp=vp=;
xs[xp++]=;
xs[xp++]=h+;
ys[yp++]=;
ys[yp++]=w+;
vs[vp++]=m;
for(int i=;i<n;++i){
for(int j=;j<;++j)scanf("%d",rc[i]+j);
xs[xp++]=rc[i][];
xs[xp++]=rc[i][]+;
ys[yp++]=rc[i][];
ys[yp++]=rc[i][]+;
vs[vp++]=rc[i][];
vs[vp++]=rc[i][]-;
}
std::sort(xs,xs+xp);
xp=std::unique(xs,xs+xp)-xs-;
std::sort(ys,ys+yp);
yp=std::unique(ys,ys+yp)-ys-;
std::sort(vs,vs+vp);
vp=std::unique(vs,vs+vp)-vs;
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)as[i][j]=(xs[i+]-xs[i])*(ys[j+]-ys[j]);
for(int t=;t<n;++t){
rc[t][]=std::lower_bound(xs,xs+xp,rc[t][])-xs;
rc[t][]=std::lower_bound(xs,xs+xp,rc[t][]+)-xs;
rc[t][]=std::lower_bound(ys,ys+yp,rc[t][])-ys;
rc[t][]=std::lower_bound(ys,ys+yp,rc[t][]+)-ys;
rc[t][]=std::lower_bound(vs,vs+vp,rc[t][])-vs;
}
for(int S=;S<(<<n);++S){
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)mv[i][j]=vp-;
int s=;
for(int t=;t<n;++t){
int v=rc[t][];
if(S>>t&)s=-s,--v;
for(int i=rc[t][];i<rc[t][];++i)
for(int j=rc[t][];j<rc[t][];++j)mins(mv[i][j],v);
}
for(int i=;i<vp;++i)ts[i]=;
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)ts[mv[i][j]]+=as[i][j];
for(int i=;i<vp;++i)s=i64(s)*pw(vs[i],ts[i])%P;
ans=(ans+s)%P;
}
printf("%d\n",(ans+P)%P);
return ;
}

std(好像是另类做法)

另外 $wxj$ 用扫描线过了……

【2018.11.8】小迟的比赛 / Yuno like cake / 格子填数的更多相关文章

  1. OI生涯回忆录 2018.11.12~2019.4.15

    上一篇:OI生涯回忆录 2017.9.10~2018.11.11 一次逆风而行的成功,是什么都无法代替的 ………… 历经艰难 我还在走着 一 NOIP之后,全机房开始了省选知识的自学. 动态DP,LC ...

  2. China Intelligent Office Summit(2018.11.21)

    时间:2018.11.21地点:中关村软件园国际会议中心

  3. International Programming Retreat Day(2018.11.17)

    时间:2018.11.17地点:北京国华投资大厦

  4. Intel Artificial Intelligence Conference(2018.11.14)

    时间:2018.11.14地点:北京国贸大酒店

  5. 如何规范移动应用交互设计?UI/UX设计师须知的11个小技巧

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 十年前,手机的使用只是为了沟通. 而近几年,情况发生了很大变化,我们很难找到不使用手机的人.手机在极 ...

  6. 2018.11.23 浪在ACM 集训队第六次测试赛

    2018.11.23 浪在ACM 集训队第六次测试赛 整理人:刘文胜 div 2: A: Jam的计数法 参考博客:[1] 万众 B:数列 参考博客: [1] C:摆花 参考博客: [1] D:文化之 ...

  7. 2018.11.16 浪在ACM 集训队第五次测试赛

    2018.11.16 浪在ACM 集训队第五次测试赛 整理人:李继朋 Problem A : 参考博客:[1]朱远迪 Problem B : 参考博客: Problem C : 参考博客:[1]马鸿儒 ...

  8. 2018.11.9浪在ACM集训队第四次测试赛

    2018.11.9浪在ACM集训队第四次测试赛 整理人:朱远迪 A 生活大爆炸版 石头剪刀布           参考博客:[1] 刘凯 B 联合权值            参考博客: [1]田玉康 ...

  9. 2018.11.2浪在ACM集训队第三次测试赛

    2018.11.2 浪在ACM 集训队第三次测试赛 整理人:孔晓霞 A 珠心算测试 参考博客:[1]李继朋  B 比例简化 参考博客: [1]李继朋 C 螺旋矩阵 参考博客:[1]朱远迪 D 子矩阵 ...

随机推荐

  1. jmeter中文件上传配置

  2. 如何通过Xcode 5中集成的XCTest框架进行简单的单元测试

    XCTest 1.第一个单元测试 XCTest是Xcode 5中自带的测试框架 下面从一个Demo开始.首先用Xcode新建一个工程UnitTestDemo,工程目录结构如下: 可以看到工程下面多了一 ...

  3. Python 目录和文件基本操作

    今天在写一个小工具的过程中发现对目录和文件的基本操作不是很熟,特此把遇到的常用操作总结汇总下. 获取当前路径:os.getcwd() 目录操作:1.创建目录:os.mkdir('目录名')2.创建多级 ...

  4. Words Prefixed Trans-

    transit v. Pass across or through (an area) The new large ships will be too big to transit the Panam ...

  5. lg、ln的表示方法

    c语言中 函数 log(x) 表示是以e为底的自然对数,即 ln(x) 函数 log10(x) 以10为底的对数,即 lg(x) 以其它数为底的对数用换底公式来表示 log(a)/log(b) 函数 ...

  6. faster rcnn细节总结

    1.roi_pooling层是先利用spatial_scale将region proposal映射到feature map上,然后利用pooled_w.pooled_h分别将映射后的框的长度.宽度等分 ...

  7. intellij IDEA版本控制设置

    我们开发肯定是有版本控制的,大家以前Eclipse的时候在本地文件和版本库不一致的时候,那么文件以及所在的文件夹都会出现一个〉表示,大家能很轻松的看到本地文件修改了哪一些,但是IntelliJ中默认是 ...

  8. python基础面试题整理---从零开始 每天十题(03)

    一.Q:用Python输出一个Fibonacci数列?(斐波那契额数列) A:我们先来看下代码 #!/usr/bin/env python # -*- coding: utf-8 -*- def fi ...

  9. 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace

    把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...

  10. GIMP图像窗口的自定义

    具体功能包含:初始缩放比例.空格键按下时触发动作