• 20180720 考试记录


    T1 Black Rock Shooter

    Solution

    GSS3原题qwq

    Code

    //By Menteur_Hxy
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define int long long
    #define ls (cur<<1)
    #define rs (cur<<1|1)
    #define F(i,a,b) for(register int i=(a);i<=(b);i++)
    using namespace std;
    
    int read() {
    	int x=0,f=1; char c=getchar();
    	while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
    	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    	return x*f;
    }
    
    const int INF=0x3f3f3f3f;
    const int N=500010;
    int n,m,asu,amx,als,ars,ans;
    int sum[N<<2],lsu[N<<2],rsu[N<<2],mx[N<<2];
    
    void pushup(int cur) {
    	sum[cur]=sum[ls]+sum[rs];
    	lsu[cur]=max(lsu[ls],sum[ls]+lsu[rs]);
    	rsu[cur]=max(rsu[rs],sum[rs]+rsu[ls]);
    	mx[cur]=max(max(mx[ls],mx[rs]),max(max(lsu[ls],rsu[rs]),rsu[ls]+lsu[rs]));
    } 
    
    void build(int cur,int l,int r) {
    	if(l==r) {sum[cur]=lsu[cur]=rsu[cur]=mx[cur]=read();return ;}
    	int mid=(l+r)>>1;
    	build(ls,l,mid);
    	build(rs,mid+1,r);
    	pushup(cur);
    }
    
    void merge(int cur) {
    	if(asu==-INF) asu=sum[cur],amx=mx[cur],als=lsu[cur],ars=rsu[cur];
    	else {
    		int a,b,c,d;
    		a=asu+sum[cur];
    		b=max(als,asu+lsu[cur]);
    		c=max(rsu[cur],ars+sum[cur]);
    		d=max(max(amx,mx[cur]),max(max(als,rsu[cur]),ars+lsu[cur]));
    		asu=a,als=b,ars=c,amx=d;
    	}
    	ans=max(max(als,ars),max(ans,amx));
    } 
    
    void query(int cur,int l,int r,int L,int R) {
    	if(L<=l&&r<=R) {merge(cur);return ;}
    	int mid=(l+r)>>1;
    	if(L<=mid) query(ls,l,mid,L,R);
    	if(R>mid) query(rs,mid+1,r,L,R);
    }
    
    void update(int cur,int l,int r,int x,int k) {
    	if(l==x&&r==x) {sum[cur]=k,lsu[cur]=k,rsu[cur]=k,mx[cur]=k;return ;}
    	int mid=(l+r)>>1;
    	if(x<=mid) update(ls,l,mid,x,k);
    	else if(x>mid) update(rs,mid+1,r,x,k);
    	pushup(cur);
    }
    
    signed main() {
    	freopen("BRS.in","r",stdin);
    	freopen("BRS.out","w",stdout);
    	n=read(),m=read();
    	build(1,1,n);
    	F(i,1,m) {
    		ans=asu=amx=als=ars=-INF;
    		int opt=read(),x=read(),y=read();
    		if(opt==1) query(1,1,n,x,y),printf("%lld
    ",ans);
    		else update(1,1,n,x,y);
    	}
    	return 0;
    }
    

    T2 Fy's dota2



    Solution

    类似斐波那契的构造矩阵就行
    (注意不要赋错初值qwq)

    Code

    //By Menteur_Hxy
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define int long long
    #define ls (cur<<1)
    #define rs (cur<<1|1)
    #define F(i,a,b) for(register int i=(a);i<=(b);i++)
    #define R(i,a,b) for(register int i=(b);i>=(a);i--)
    using namespace std;
    
    int read() {
    	int x=0,f=1; char c=getchar();
    	while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
    	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    	return x*f;
    }
    
    const int MOD=7777777;
    struct Matrix{
    	int da[11][11];
    	void clear() {F(i,1,10) F(j,1,10) da[i][j]=0;}
    	Matrix operator * (const Matrix oth) {
    		Matrix ret;ret.clear();
    		F(i,1,10) F(j,1,10) F(k,1,10) 
    			ret.da[i][j]+=da[i][k]*oth.da[k][j]%MOD,ret.da[i][j]%=MOD;
    		return ret;
    	} 
    	void print() {
    		F(i,1,10) {
    			F(j,1,10) cout<<da[i][j]<<" ";
    			cout<<endl;
    		}cout<<endl;
    	}
    };
    
    Matrix Qpow(Matrix ret,int d) {
    	Matrix res; res.clear();
    	F(i,1,10) res.da[i][i]=1;
    	while(d) {
    		if(d&1) res=res*ret;
    		ret=ret*ret; d>>=1;
    	}
    	return res;
    }
    
    signed main() {
    //	freopen("fyfy.in","r",stdin);
    //	freopen("fyfy.out","w",stdout);
    	int k=read(),n=read();
    	Matrix nxt;nxt.clear();
    	F(i,1,k) nxt.da[i][1]=1;
    	F(i,1,k) nxt.da[i][i+1]=1;
    	Matrix ans=Qpow(nxt,n);
    	printf("%lld",ans.da[1][1]%MOD);
    	return 0;
    }
    

    T3 Olddriver’s books



    Solution

    好像叫做扫描线什么的,这道题比较水n3就能过(我写的n2)
    (注意不要少想一种情况qwq)

    Code

    //By Menteur_Hxy
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<map>
    #define int long long
    #define ls (cur<<1)
    #define rs (cur<<1|1)
    #define F(i,a,b) for(register int i=(a);i<=(b);i++)
    #define R(i,a,b) for(register int i=(b);i>=(a);i--)
    using namespace std;
    
    int read() {
    	int x=0,f=1; char c=getchar();
    	while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
    	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    	return x*f;
    }
    
    const int INF=0x3f3f3f3f;
    const int N=1100;
    int n,cnt;
    int hi[N],lo[N];
    int vis[N];
    struct xid{int da,id;}idx[N<<1];
    struct yid{int da,fl,id;}idy[N<<1];
    
    bool cmp1(xid a,xid b) {return a.da<b.da;} 
    bool cmp2(yid a,yid b) {return a.da<b.da;}
    
    signed main() {
    	freopen("olddriver.in","r",stdin);
    	freopen("olddriver.out","w",stdout);
    	n=read();
    	F(i,1,n) {
    		idx[++cnt].da=read(),idx[cnt].id=i;
    		idy[cnt].da=read(),idy[cnt].fl=1,idy[cnt].id=i;
    		idx[++cnt].da=read(),idx[cnt].id=i;
    		idy[cnt].da=read(),idy[cnt].fl=-1,idy[cnt].id=i;
    	}
    	sort(idx+1,idx+1+cnt,cmp1);
    	sort(idy+1,idy+1+cnt,cmp2);
    	int ans=0;
    	F(i,1,cnt) {
    		int sum=0,l=0,tmp=0;
    		F(j,1,cnt) if(vis[idy[j].id]) {
    			if(!tmp) l=idy[j].da;
    			tmp+=idy[j].fl;
    			if(!tmp) sum+=idy[j].da-l;
    		}
    		ans+=sum*(idx[i].da-idx[i-1].da);
    		vis[idx[i].id]^=1ll;
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    poj 2349 Arctic Network
    hdu 1596 find the safest road
    Codeforces 768B. Code For 1
    Codeforces 448C. Painting Fence
    Problem D. Ice Cream Tower(2016 China-Final)
    poj 2785 4 Values whose Sum is 0
    Codeforces 797C. Minimal string
    Codeforces 264A. Escape from Stones
    乌龟棋(noip2010)
    noip2018模拟题(类背包+贪心)
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9342378.html
Copyright © 2020-2023  润新知