[NOIP2011]刷水

  前几天做了NOIP2011的题,感觉不是那么难。

  这边先做了两天的前两题,T3还没打。

D1T1:顺次读入,分别判断是否覆盖即可,照例大水:

#include<cstdio>
int x,y,a[10001],b[10001],c[10001],d[10001],n,ans=-1;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d%d%d",a+i,b+i,c+i,d+i);
    scanf("%d%d",&x,&y);
    for(int i=1;i<=n;i++)
        if(a[i]<=x&&b[i]<=y&&c[i]+a[i]>=x&&d[i]+b[i]>=y)ans=i;
    printf("%d",ans);
    return 0;
}

D1T2:一边扫过去,对于每家客栈,我们记下前一家相同色调的客栈,前一家能去的咖啡店,之前有多少家可以和这间客栈搭配和这是第几间该色调的客栈,然后如果前一家色调相同的客栈编号在前一家能去的咖啡店之前,说明这之前的客栈都能去,把可搭配客栈数更新后加入答案,否则直接加入答案。

代码如下:

#include<cstdio>
using namespace std;
int n,p,t[200001],h[51],ans,l[51],lst[51];
int main()
{
    scanf("%d%*d%d",&n,&p);
    for(int i=0;i<=50;i++)lst[i]=1;
    for(int i=1;i<=n;i++)
    {
        int w,c;
        scanf("%d%d",&c,&w);
        t[i]=t[i-1]+(w<=p);
        if(t[i]!=t[lst[c]-1])h[c]=l[c];
        l[c]++;
        ans+=h[c];
        if(w<=p)h[c]=l[c];
        lst[c]=i;
    }
    printf("%d",ans);
    return 0;
}

D2T1:用杨辉三角计算组合数然后用二项式定理直接出解:

#include<cstdio>
const int mod=10007;
int a,b,k,n,m,C[1002][1002],aa=1,bb=1;
void calC()
{
    C[1][1]=1;
    for(int i=2;i<=1001;i++)
        for(int j=1;j<=i;j++)
            C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
int main()
{
    calC();
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    a%=mod;b%=mod;
    for(int i=1;i<=n;i++)aa=(aa*a)%mod;
    for(int i=1;i<=m;i++)bb=(bb*b)%mod;
    printf("%d",((aa*bb%mod)*C[k+1][n+1])%mod);
    return 0;
}

D2T2:使和标准最近,而且是单调递减,容易想到用二分答案+check

二分就不说了。check中我们要O(m)计算m个区间的sigma,可以对于二分出的x计算从1到n能加入答案的计算前缀和然后轻松处理。

要注意防止爆long long,这边处理方法是加个最优上限maxn,否则一定不优。

代码如下:

#include<cstdio>
const long long maxn=10000000000000ll;
long long mn(long long x,long long y){return x<y?x:y;}
long long s[200001],ans=maxn,sa,v[200001],w[200001],sum[200001],l[200001],r[200001],ll,rr,n,m,mid;
bool check(long long x)
{
    long long tt=0;
    for(int i=1;i<=n;++i)
        sum[i]=sum[i-1]+(w[i]>=x),
        s[i]=s[i-1]+(w[i]>=x?v[i]:0);
    for(int i=1;i<=m;++i)
    {
        tt+=(sum[r[i]]-sum[l[i]-1])*(s[r[i]]-s[l[i]-1]);
        if(tt>maxn)return 0;
    }
    ans=mn(-mn(tt-sa,sa-tt),ans);
    return tt<=sa;
}
void bina()
{
    ll=0;rr=1000000;
    while(ll<rr)
    {
        mid=(ll+rr)/2;
        check(mid)?rr=mid:ll=mid+1;
    }
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&sa);
    for(int i=1;i<=n;++i)scanf("%lld%lld",w+i,v+i);
    for(int i=1;i<=m;++i)scanf("%lld%lld",l+i,r+i);
    bina();
    check(mid-1);check(mid);
    printf("%lld",ans);
    return 0;
}
时间: 2024-10-13 12:03:37

[NOIP2011]刷水的相关文章

北京赛车技巧8码滚雪球公式探讨交流+走势分析法刷水教程

此文章是适合5-8码的玩家去下注.(内附冷热原理讲解) 及需要无解刷水方法的直接找我,在这里重申一遍,此教程免费 本人任何方法是以走势冷热原理去研究出的一套方法,明白原理,方法就可以千变万化 任何人以我名义及盗版此文章去招摇撞骗充当高手的都是骗子 本人唯一企鹅号:183468628(蜂蜜柚子茶) 走势无非是热码的一个延伸, 只有明白冷热原理,才能够真正去掌握. (PS:解释一下,具我对走势的熟悉,本人认为完全没有公式计算方法,因为公式是死的,而走势不可能每天都一样,特别注意的是,走势无非是热码的

刷水题(二)

今天,我又去刷水题了.水题好多呀!这些题分为N个难度级别,做出第i个难度级别的任意一题都需要a[i]分钟,并获得b[i]点积分.我最多可以刷T分钟水题,问我最多能获得多少积分? [输入] 第一行两个正整数N和T,接下来的N行每行两个正整数数a[i]和b[i]. [输出] 一个数,表示我最多可以获得的积分. [样例输入] 4 50 1 10 3 40 9 130 27 400 [样例输出] 720 题解: 直接上代码(没错,就是这么简单) 1 #include<iostream> 2 using

刷水题记(1)

嗯,看到最近yyl大神刷了很多题(lzw大神也是),于是我翻开他们的记录,轻轻点开他们刷过的题(这句话似曾相识?)妈旦这么水的题我竟然没过!!!,然后有了这篇文. 第一题,最大连续子序列之和 良心锑星题,然后我很开心的把它艹过去了嗯. #include <cstdio> int f,i,j,n,m,p; int main(){ m=1<<31; scanf("%d",&n); for(i=0;i<n;++i){ scanf("%d&quo

【刷水】之USACO2008资格赛(Bzoj1599-1603)

做之前真是没想到有这么水>.< 但做了还是发上来吧>.< 就当是刷一刷AC量&1A率什么的>.< Bzoj1599: [Usaco2008 Oct]笨重的石子 枚举.. 1 #include<cstdio> 2 int a,b,c; 3 int t[100]; 4 5 int main(){ 6 scanf("%d%d%d",&a,&b,&c); 7 for(int i=1;i<=a;i++) 8 f

刷水题 堆

题目背景 众所周知,熊本熊的洛谷大号是kakakaka.有的时候熊本熊会在洛谷上面刷水题,但是熊本熊并不知道该怎么计划好自己的时间,他想让你来帮他计划一下. 题目大意 熊本熊今天一时兴起想刷n道水题,熊本熊有m个大脑,每个大脑都只能独立工作,也就是说,熊本熊可以在同一时间做m道题.由于熊本熊刷的水题都是topcoder,codeforces,usaco,CCF上最新出的水题,所以在熊本熊刷一道水题时,下一道水题可能还没有出来.又因为熊本熊又不会什么奇技淫巧,所以他完成每一道题都有一个特定的时间.

刷水题记(2)

看了看提交记录,有一堆小高一在做题... 然后开始快乐地刷那些我没有刷过的水题啦啦啦~~ 第一题 蟠桃记 恩简单递推. #include <cstdio> int main(){ int a,i,n; scanf("%d",&n); a=1; for(i=1;i<n;++i) a=(a+1)<<1; printf("%d\n",a); return 0; } 第二题 得票查询 一个个数过来,真·良心水题推荐 #include &

OI刷水记录

3.19 颓了一周: **3211: 花神游历各国 区间开方区间查询 可以用树状数组暴力修改+并查集维护下一个不为1的数 #include<bits/stdc++.h> #define rep(i,l,r) for(int i=l;i<=r;i++) #define N 101333 typedef long long ll; int f[N],a[N],now,m,n,l,r,x,delta; ll c[N]; inline void add(int x,int k){while(x&

bzoj 刷水

bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 long long h, a, b, k; 8 int main(){ 9

OI本月刷水记录

bzoj 1044 硬币购物 如果没有每个硬币的个数限制,这就是一个完全背包计数问题,现在我们注意到硬币个数很少,于是我们分别考虑一下每个硬币不符合条件的情况,容斥一下即可 bzoj 1225假如不考虑高精度的情况,那么转移还是好考虑的 f[i][j]表示前i个质数有j的约数最小数字 f[i][j]=minprime[i]k|jf[i?1][j/(k+1)]?prime[i]k 但万恶的高精度啊= =,于是改成搜索,然后用对数来表示,就好了 bzoj 2440 一道很神的数论题,二分+容斥+莫比