题目

$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. MySQL性能优化奇技淫巧

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.   2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使 ...

  2. https增加临时证书,tomcat配置

    1Windows下: 1.1 生成keystore文件及导出证书 打开控制台: 运行: %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RS ...

  3. 洛谷 P1744 采购特价商品

    题目背景 <爱与愁的故事第三弹·shopping>第一章. 题目描述 中山路店山店海,成了购物狂爱与愁大神的“不归之路”.中山路上有n(n<=100)家店,每家店的坐标均在-1000 ...

  4. python常用模块之requests

    一.requests 1.GET   url带参数请求 >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> ...

  5. 【Qt】2.2 继续了解信号和槽

    槽和普通成员函数一样,可以是虚函数.被重载,可以是公有.私有.保护的.它可以被其它C++成员函数调用. 槽连接了信号,当发射这个信号时,槽会被自动调用. 连接函数: bool QObject::con ...

  6. go get 升级所有

    go get -u all go get -u go mod update go get -u full_package_name    go get -u github.com/... // ('. ...

  7. 转义字符 & sizeof & strlen

    在定义了数组大小时: sizeof是运算符,表示编译时分配的空间大小,即数组定义的大小,char t[20] = "sfa".sizeof: 20; strlen: 3.在未定义数 ...

  8. Swift 中 String 与 CChar 数组的转换

    在现阶段Swift的编码中,我们还是有很多场景需要调用一些C函数.在Swift与C的混编中,经常遇到的一个问题就是需要在两者中互相转换字符串.在C语言中,字符串通常是用一个char数组来表示,在Swi ...

  9. CF-1072-C. Cram Time(贪心,数学)

    CF-1072-C. Cram Time http://codeforces.com/contest/1072/problem/C 题意: 第一天有 a 小时,第二天有 b 小时.第 k 个任务需要 ...

  10. 【分块】[HNOI2010]弹飞绵羊&分块大法祭

    分块(似乎还有一种动态树(LCT)做法) 第一次学习分块,似乎有点小激动 这是黄学长的分块入门博客「分块」数列分块入门1 – 9 by hzwer 题目描述 某天,Lostmonkey发明了一种超级弹 ...