首页 > 其他分享 >10.6 模拟赛总结

10.6 模拟赛总结

时间:2022-10-06 21:25:46浏览次数:70  
标签:总结 mxx 10.6 int ll mi choose mx 模拟

10.6 模拟赛总结

T1 光

大意:给定四个方块的需要的亮度值,有光的散射,每个方块对于另外三个有影响,问四个亮度值之和最小为多少。$ n\le 1500$
思路:一眼看出是二分答案的判定性问题,判断中枚举其中两个值出来四个不等式小范围内枚举第三个即可
错因:为什么范围要手残除二啊!!!

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,l,r,mid,ans;
bool ck(){
    int aa,bb,cc,dd,o,md,k;
    for(int i=0;i<=a+4&&i<=mid;i++) for(int j=0;j<=b+4&&i+j<=mid;j++){
        aa=a-i-j/2,bb=b-i/2-j;
        cc=c-i/2-j/4,dd=d-i/4-j/2;
        md=mid-i-j;
        for(k=max(0,max(4*aa-md,2*cc-md));k<=min(md,min(2*md-4*bb,2*md-2*dd));k++){
            o=md-k;
            if(o/4+k/2>=aa&&o/2+k/4>=bb&&k+o/2>=cc&&k/2+o>=dd) return 1;
        }
    }
    return 0;
}

int main(){
}

T2 爬

大意:一颗树,每个节点的蚂蚁都有一个权值,可以选择不动和去到父亲节点,只有一个蚂蚁的节点贡献为0,否则贡献为所有蚂蚁的权值的亦或和\(n \le10^5\)

思路:考虑把每个节点的每一位贡献单独算,只跟父亲的亲生儿子们有关。每一次把一个节点的所有儿子弄在一团,团内又分当前这一位为\(1\)或\(0\),为0的比较自由,为1的必须取另外偶数个抵消才有贡献,发现其值为$${s \choose 0}+{s \choose 2}+{s \choose 4}+\cdots+{s \choose s}$$
放到杨辉三角上可以变成$${s-1 \choose 1}+{s-1 \choose 2}+{s-1 \choose 3}+\cdots+{s-1 \choose s-1}$$
之前不会结果打个表就发现等于 \(2^{s-1}\) (哇好神奇
再跟团内自由的方案和团外方案乘一下,剪掉只有自己爬上去但是父亲爬走的一种情况就差不多

但是,如果根为1必须特判!!!非常麻烦,考试就在这里挂了

不能让其他节点把1的贡献算重了,1作为父亲也不会跑路
(真的非常考细节!!!)

#include<bits/stdc++.h>
#define ll long long
const ll mod=1e9+7;
using namespace std;
ll a[200005],ans,n,c[203],k,m,t,jt[200005],d[205];
queue<ll>q;
struct node{
    ll f,x;
}s[200005];
bool cmp(node aa,node bb){
    return aa.f<bb.f;
}
ll gc(ll x){
	if(x<0) return 0;
	return jt[x];
}
ll gcc(ll x){
	if(x==-1) return 1;
	if(x<-1) return 0;
	return jt[x];
}
int main(){
     freopen("climb.in","r",stdin);
     freopen("climb.out","w",stdout);
    scanf("%lld",&n);
    jt[0]=1;
    for(int i=1;i<=n;i++) jt[i]=jt[i-1]*2ll%mod;
    for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=2;i<=n;i++) scanf("%lld",&s[i-1].f),s[i-1].x=i;
    sort(s+1,s+n,cmp);
    for(int i=1;i<n;i++){
        q.push(s[i].x),++m;
        for(int j=0;j<=35;j++) if((a[s[i].x]>>j)&1) ++d[j];
        if(s[i+1].f!=s[i].f){
            t=0,++m;
            for(int j=0;j<=35;j++) if((a[s[i].f]>>j)&1) ++d[j];
            q.push(s[i].f);
            while(!q.empty()){
                k=q.front(),q.pop();
                for(int j=0;j<=35;j++) if((a[k]>>j)&1){
                	if(s[i].f!=1||k==1) t=(t+(gcc(c[j]-1)*gc(m-d[j])%mod-1)*(1<<j)%mod+mod)%mod;
					else{
						ll o=((a[1]>>j)&1);
						if(!o) t=(t+(gcc(c[j]-1)*(gc(m-d[j]-1))%mod)*(1<<j)%mod+mod)%mod;
					}
					++c[j];
                }
            }
            ans=(ans+t*gc(n-m-(s[i].f!=1))%mod)%mod;
            for(int j=0;j<=35;j++) c[j]=0;
            for(int j=0;j<=35;j++) d[j]=0;
            m=0;
        }
    }
    printf("%lld",ans);
}

T3 字符串

大意:给n个A,m个B,AB间切换贡献+1,连续a个A贡献+1,连续b个B贡献+1,B至少连续c个才能换A,A无限制。

比赛时50分DP都能挂。。。

正解:贪心,枚举切换次数,再把剩下的A,B贪心塞进去看,很简单

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,sum,aa,bb,ans;
int main(){
    // freopen("string.in","r",stdin);
    // freopen("string.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
        ans=0;
        for(int i=1;i<=min(m/c,n)+1;i++){
            sum=i+1;
            aa=n-i,bb=m-i*c;
            sum+=(c-1)/b*i;
            if(aa) --aa,++sum;
            sum+=aa/a;
            if(bb) --bb,++sum;
            if((c-1)%b!=0) sum+=bb/((c-1)%b),bb%=((c-1)%b);
            sum+=bb/b;
            ans=max(ans,sum);
        }
        printf("%d\n",ans);
    }
}

T4 奇怪的函数

大意:一堆\(min,max\)和\(+\)弄在一起,可修改,询问Q次给定输入\(x\),求最后得出什么

看出是分段函数,可以把\(+\)套在之前的\(min,max\)之间\(O(1)\)查询
分块解决简单易懂

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e5+10,inf=1e18,M=500;
ll n,a[N],qr,l[M],r[M],q[N],h[N],mi[M],mx[M],s[M],k,Q,x,y,z,mii,mxx,ss;
void pp(int i){
    k=0,mx[i]=mxx=inf,mi[i]=mii=-inf;
    for(int j=l[i];j<=r[i];j++) if(h[j]==1) k+=a[j];
    s[i]=k;
    for(int j=l[i];j<=r[i];j++){
        if(h[j]==1) k-=a[j];
        if(h[j]==2){
            mx[i]=min(mx[i],a[j]+k);
            if(mi[i]>mx[i]) mi[i]=mx[i];
        }
        if(h[j]==3){
            mi[i]=max(mi[i],a[j]+k);
            if(mi[i]>mx[i]) mx[i]=mi[i];
        }
    }
}
void qq(){
    k=ss=0;
    for(int i=1;i<=q[n];i++) k+=s[i],ss+=s[i];
    for(int i=1;i<=q[n];i++){
        k-=s[i];
        mii=max(mii,mi[i]+k);
        if(mii>mxx) mxx=mii;
        mxx=min(mxx,mx[i]+k);
        if(mii>mxx) mii=mxx;
    }
}
int main(){
    freopen("function.in","r",stdin);
    freopen("function.out","w",stdout);
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld%lld",&h[i],&a[i]);
    qr=sqrt(n);
    for(int i=1;i<=n;i++) q[i]=(i-1)/qr+1;
    for(int i=1;i<=q[n];i++){
        l[i]=(i-1)*qr+1,r[i]=min(n,i*qr);
        pp(i);
    }
    qq(),scanf("%lld",&Q);
    int bz=0;
    while(Q--){
        scanf("%lld%lld",&x,&y);
        if(x==4){
            if(bz) bz=0,qq();
            printf("%lld\n",min(max(mii,y+ss),mxx));
            continue;
        }
        scanf("%lld",&z);
        h[y]=x,a[y]=z,bz=1;
        pp(q[y]),bz=1;
    }
}


炸得很惨,引以为戒,对拍!!!

标签:总结,mxx,10.6,int,ll,mi,choose,mx,模拟
From: https://www.cnblogs.com/2020ljh/p/16758506.html

相关文章

  • 2022.10.06考试总结
    2022.10.06考试总结得分:\(175/300\)总结:今天考试的题目非常有区分度,第一题因为没有发现结论,导致最后只拿到了部分分,第二题是一道比较简单的背包,第三题的题目意思描述的......
  • 本周总结
    本周总结数据类型整型int一.类型转换int(其他数据类型)二.进制转换bin二进制oct八进制hex十六进制其他转十进制可以直接int三.python自身对数字敏感度低(精确度低......
  • 「牛客网」45道JS能力测评经典题总结
    前言牛客网的45道JS能力评测题个人觉得是非常好的45道js基础检测题,基本就是对自己的JavaScript基础做一个比较全面的评估,包括if语句、循环体、基础操作符、setInterval、s......
  • 闲话 22.10.6
    闲话所以为什么模拟赛都喜欢考后缀题啊前有一个SA后有一个广义SAM上树剖什么玩意我只会非字符串的科技(字符串能不能滚粗OIa大渣好,我四渣渣辉,点一下,玩一年,装备不花......
  • 2022.10.6
    考试,成绩一般。因为意外少了一小时时间,估计题目难度的时候出现错误,一直想巨大困难的T4(论文题)导致简单的T3没拿分,只有7、8名的样子。下午叶老心血来潮讲了笛卡尔树,运用到T3......
  • C语言下for循环的一点技巧总结
    for循环是普遍应用与各种计算机语言的一种循环方式。一般情况下,for循环规则:for(条件一;条件二;条件三)条件一为满足条件,也就是条件一为1时,进入这个for循环。条件二为循环......
  • 第二组chap1-2学习总结
      在两周C语言的学习课程中,让我们从认识C语言历史到开始动手打代码,从最初对C语言的懵懵懂懂到小有成就,我们对C语言的认识和运用也越来越深。充实着我们的不仅仅是学习......
  • 2022.9.30 Java第四次课后总结
    1.publicclassBoxAndUnbox{ /** *@paramargs */ publicstaticvoidmain(String[]args){ intvalue=100; Integerobj=value;//装箱 intresult=obj*2;......
  • 每周总结——week02(流程控制篇)
    每周总结——week02(流程控制篇)1、流程控制理论什么是流程控制对程序执行的顺序进行控制总共有三种:1、顺序结构 按程序语句的自然顺序,自上到下,依次执行每条语句的程......
  • 每周总结——week02(运算符篇)
    每周总结——运算符篇1、基本运算符数学运算符:'''+-*///%**简化写法如下:'''m=7m+=2m-=2m*=2m/=2m//=2m%=2m**=2比较运算符:'''<......