NOIP 2011 提高组合集

D1 T1 铺地毯

模拟,题目让你干啥你就干啥

#include <iostream>
#include <cstdio>
using namespace std;
int x[100010],y[100010],dx[100010],dy[100010];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d%d",&x[i],&y[i],&dx[i],&dy[i]);
int a,b;
scanf("%d%d",&a,&b);
int r=-1;
for(int i=1;i<=n;i++)
{
if(a>=x[i]&&a<=x[i]+dx[i]&&b>=y[i]&&b<=y[i]+dy[i]) r=i;
}
printf("%d\n",r);
return 0;
}

D1 T2 选择客栈

做的时候好像麻烦了。我的做法是对于一个可以当接头地点的店,考虑它的贡献。为了避免算重,我们令它是左端点往右走的第一个满足条件的店。说是第一个满足条件,但是不一定非要在这里吃。

然后根据这个节点的往右走第一个不满足的,乘以右边的所有点,更新答案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200010
#define M 60
using namespace std;
typedef long long ll;
int a[N],b[N],f[N][M];
int main()
{
int n,k,p; cin >> n >> k >> p ;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
for(int i=n;i>=0;i--)
{
for(int j=0;j<k;j++)
{
f[i][j]=f[i+1][j];
if(a[i]==j&&i) f[i][j]++;
}
}
// for(int i=1;i<=n;i++) printf("%d %d\n",f[i][0],f[i][1]);
int bfr=0; ll ans=0;
for(int i=1;i<=n;i++)
{
if(b[i]>p) continue;
for(int j=0;j<k;j++)
{
ans+=1ll*(f[bfr+1][j]-f[i+1][j])*f[i+1][j];
// ans+=(f[bfr+1][j]-f[i][j]);
}
ans+=f[bfr+1][a[i]]-f[i][a[i]];
bfr=i;
}
printf("%lld\n",ans); return 0;
}

D1 T3 Mayan游戏

挖坑代填

D2 T1 计算系数

知道二项式定理这题是sb题。

#include <bits/stdc++.h>
#define mod 10007
using namespace std;
typedef long long ll;
ll quick_power(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
ll before[1010];
int main()
{
before[0]=1;
for(ll i=1;i<=1000;i++)
{
before[i]=before[i-1]*i%mod;
}
ll a,b,k,n,m;
cin >> a >> b >> k >> n >> m ;
// a%=mod,b%=mod;
printf("%lld\n",quick_power(a,n)%mod*quick_power(b,m)%mod*before[k]%mod
*(quick_power(before[n],mod-2)%mod*quick_power(before[k-n],mod-2)%mod)%mod);
}

D2 T2 聪明的质检员

考虑二分,然后直接暴力枚举验证即可,时间复杂度为O(logn(n+m))。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200010
using namespace std; typedef long long ll; int n,m; ll S;
int f[N]; ll g[N]; ll L[N],R[N],w[N],v[N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
ll rd() {ll x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
ll check(int x)
{
f[0]=0,g[0]=0;
for(int i=1;i<=n;i++)
{
f[i]=f[i-1]; g[i]=g[i-1];
if(w[i]>=x) f[i]++,g[i]+=v[i];
}
ll ans=0;
for(int i=1;i<=m;i++) ans+=1ll*(g[R[i]]-g[L[i]-1])*(f[R[i]]-f[L[i]-1]);
return ans;
}
int main()
{
n=rd(),m=rd(),S=rd(); ll maxn=0; for(int i=1;i<=n;i++) w[i]=rd(),v[i]=rd(),maxn=max(maxn,v[i]);
for(int i=1;i<=m;i++) L[i]=rd(),R[i]=rd();
ll l=0,r=maxn+1; ll minn=1000000000000000000ll;
while(l<r)
{
int mid=(l+r)>>1;
ll now=check(mid); minn=min(minn,abs(now-S));
if(now<S) r=mid;
else l=mid+1;
}
printf("%lld\n",minn);
return 0;
}

D2 T3 观光公交

我们考虑每一个加速器的利与弊即可。如果到达了之后还是需要等,我们减少了以等的那个节点为终点的乘客的时间。如果到达了直接走,我们节省了所有人的时间。所以我们可以贪心地做这个事情。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 20010
using namespace std;
struct node
{
int start,arrive,target;
}a[N];
int n,m,K,ans;
int f[N],Time[N],g[N],dist[N],sum[N];
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<n;i++)
scanf("%d",&dist[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].arrive,&a[i].start,&a[i].target);
f[a[i].start]=max(f[a[i].start],a[i].arrive);
sum[a[i].target]++;
}
for(int i=2;i<=n;i++)
sum[i]+=sum[i-1]; Time[1]=0;
for(int i=2;i<=n;i++)
Time[i]=max(Time[i-1],f[i-1])+dist[i-1];
for(int i=1;i<=m;i++)
ans+=Time[a[i].target]-a[i].arrive;
while(K)
{
g[n]=n;
g[n-1]=n;
for(int i=n-2;i;i--)
{
if(Time[i+1]<=f[i+1])
g[i]=i+1;
else g[i]=g[i+1];
}
int Max=0,j;
for(int i=1;i<=n;i++)
if(sum[g[i]]-sum[i]>Max&&dist[i]>0)
Max=sum[g[i]]-sum[i],j=i;
if(!Max) break;
ans-=Max;
dist[j]--;
K--;
Time[1]=0;
for(int i=2;i<=n;i++)
Time[i]=max(Time[i-1],f[i-1])+dist[i-1];
}
cout << ans << endl ;
return 0;
}

NOIP2011 提高组合集的更多相关文章

  1. NOIP2010 提高组合集

    NOIP 2010 提高组合集 T1 机器翻译 模拟题,用一个栈模拟,桶记录即可. #include <iostream> #include <cstdio> #include ...

  2. NOIP2015 提高组合集

    NOIP 2015 提高组 合集 D1 T1 神奇的幻方 题目让你干啥你就干啥,让你咋走你就咋走就完事儿了 #include <iostream> #include <cstdio& ...

  3. NOIP2014 提高组合集

    NOIP 2014 提高组 合集 D1 T1 生活大爆炸版石头剪刀布 首先,先将两个人的猜拳序列都变得不小于n.然后逐个模拟.胜败什么的看表就行了. #include <iostream> ...

  4. NOIP2013 提高组合集

    NOIP 2013 提高组 合集 D1 T1 转圈游戏 快速幂裸题 #include <iostream> #include <cstdio> #include <cst ...

  5. NOIP2012 提高组合集

    NOIP 2012 提高组 合集 D1 T1 Vigenère 密码 模拟题,观察到两个数对应位置-1相加的和%26就是对应的字母,按照这个性质模拟即可. #include <iostream& ...

  6. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  7. [NOIP2011] 提高组 洛谷P1312 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  8. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  9. [NOIP2011] 提高组 洛谷P1003 铺地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

随机推荐

  1. redis的两种备份方式

    Redis提供了两种持久化选项,分别是RDB和AOF. 默认情况下60秒刷新到disk一次[save 60 10000 当有1w条keys数据被改变时],Redis的数据集保存在叫dump.rdb一个 ...

  2. [APIO2007]动物园

    题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物. 你是动物园的公共主管.你要做的是,让每个来动物园的人都尽可能高兴.今天有一群小朋 ...

  3. 429c Leha and Function

    题目 解题报告 F(n, k)是在集合{1, 2, 3, ..., n}中所有的具有k个元素的子集中分别取最小值,相加后的期望. 例如:要求F(4, 2),根据定义有{1, 2}, {1, 3}, { ...

  4. npm err报错解决

    最近看vue官网:按照官网步骤正确按照vue脚手架却报错 翻了很多,才发现是webpack的问题 npm install webpack-dev-server@2.9.7 --save ok,好了!

  5. 高效程序员的45个习惯·敏捷开发修炼之道(Practices of an Agile Developer)读书笔记

    首先,这本书值得再看一遍——这次的阅读,有很多东西都是知其“形”,不知其“神”的,这导致了我对其中某些建议持怀疑态度,接受了的建议也有待商榷. 总之,先记录本书的一些信息: Practices of ...

  6. 解决 HTTP Status 500 - Unable to show problem report: freemarker.core.InvalidReferenceException:

    HTTP Status 500 - Unable to show problem report: freemarker.core.InvalidReferenceException: The foll ...

  7. 使用python获得N个区分度较高的RGB颜色值

    获得任意N个区分度最高的RGB颜色值是一个经典的问题,之前在做一些可视化的东西时需要解决这个问题.首先去网上找了一些方法,未果,于是想自己来搞,心里的想法是,先给出一个距离函数用来度量两个RGB颜色值 ...

  8. HWND CWND 转换

    一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念.   CWnd是M ...

  9. CAD绘制一个图象标记对象(com接口VB语言)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  10. string 字符串--------redis

    APPEND 语法:APPEND KEY VALUE 如果key已经存在并且是一个字符串,append 命令将value追加到key原来的值的末尾. 如果key不存在,append就简单地将给定key ...