2018.7.20模拟赛

欢乐赛爆零祭
今天上午困得要死,全程划水。。
T1:
同gss3.最后query的时候return 的ans2,全部翻车。样例还过了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
const int N=500005;
struct Segtree{
	
	int lmx,rmx,mx,l,r,sum;Segtree(){lmx=rmx=l=r=mx=sum=0;}
}t[N<<3];
int rd() {
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void pushup(int cur) {
	t[cur].lmx=max(t[cur<<1].lmx,t[cur<<1].sum+t[cur<<1|1].lmx);
	t[cur].rmx=max(t[cur<<1|1].rmx,t[cur<<1|1].sum+t[cur<<1].rmx);
	t[cur].sum=t[cur<<1].sum+t[cur<<1|1].sum;
	t[cur].mx=max((t[cur<<1].mx),max(t[cur<<1|1].mx,t[cur<<1].rmx+t[cur<<1|1].lmx));
}
void build(int l,int r,int cur) {
	t[cur].l=l,t[cur].r=r;
	if(l==r) {
		t[cur].sum=t[cur].lmx=t[cur].rmx=t[cur].mx=rd();
		return;
	}
	build(l,l+r>>1,cur<<1);
	build(1+(l+r>>1),r,cur<<1|1);
	pushup(cur);
}
void update(int node,int cur,int c) {
	if(t[cur].l==t[cur].r) {t[cur].lmx=t[cur].mx=t[cur].rmx=t[cur].sum=c;return;}
	int mid=t[cur].l+t[cur].r>>1;
	if(node<=mid) update(node,cur<<1,c);
	else update(node,cur<<1|1,c);
	pushup(cur);
}
Segtree query(int l,int r,int cur) {
	if(t[cur].l>=l&&t[cur].r<=r) {return t[cur];}
	int mid=t[cur].l+t[cur].r>>1;
	if(l>mid) return query(l,r,cur<<1|1);
	else if(r<=mid) return query(l,r,cur<<1);
	else {
		Segtree ans1=query(l,r,cur<<1),ans2=query(l,r,cur<<1|1),ans3;
		ans3.lmx=max(ans1.lmx,ans1.sum+ans2.lmx),ans3.rmx=max(ans1.rmx+ans2.sum,ans2.rmx);
		ans3.sum=ans1.sum+ans2.sum;
		ans3.mx=max(ans1.mx,max(ans2.mx,ans1.rmx+ans2.lmx));
		return ans3;
	}
}
int main() {
	scanf("%d%d",&n,&m);
	build(1,n,1);
	int opt,x,y;
	while(m--) {
		opt=rd(),x=rd(),y=rd();
		if(opt==1) 
			printf("%d\n",query(x,y,1).mx);
		else if(opt==2) 
			update(x,1,y);
	}
	return 0;
}
/*
5 3
1 2 
-3 4 5
1 2 3
2 2 -1
1 2 3
*/

开始划水。。
T2:
矩阵加速递推。看错题,觉得非常不可做,开始睡觉。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
int n,k,f[1005];
int ans;
int rd() {
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
const int mod=7777777;
struct Matrix {
	long long g[11][11];
	Matrix () {
		memset(g,0,sizeof g);
	}
	Matrix operator * (const Matrix &rhs) const {
		Matrix ans;
		for(int i=1; i<=k; i++) {
			for(int j=1; j<=k; j++) {
				for(int l=1; l<=k; l++) {
					(ans.g[i][j]+=g[i][l]*rhs.g[l][j]%mod)%=mod;
				}
			}
		}
		return ans;
	}
} A,B;
Matrix ksm(Matrix d,int z) {
	Matrix res=d;
	z--;
	while(z) {
		if(z&1) res=res*d;
		d=d*d,z>>=1;
	}
	return res;
}
bool vis[1005];
int main() {
	k=rd();
	n=rd();
//	if(k==1) {puts("1");return 0;}
//	if(k==2&&n==4) {puts("5");return 0;}
	for(int i=1; i<=k; i++) A.g[1][i]=1;
	for(int i=2;i<=k;i++) A.g[i][i-1]=1;
	B=ksm(A,n);
	printf("%d",B.g[1][1]);
}

T3
考场想出正解,困得不行,划水。。。

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int rd() {
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
struct Seg {
	int xa,xb,ya,yb;
} t[800<<3];
vector<long long>vx,vy;
long long ans;
const int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};
bool cmp(Seg x,Seg y) {
	return x.xa<y.xa;
}
bool g[605][605];
void add(int pos1,int pos2,int ya,int yb) {
	if(pos1>pos2) swap(pos1,pos2);
	if(ya>yb) swap(ya,yb);
	for(int i=pos1; i<=pos2; i++) {
		for(int j=ya; j<=yb; j++) {
			g[i][j]=1;
		}
	}
}
int n;
int main() {
//	freopen("olddriver.in","r",stdin);
//	freopen("olddriver.out","w",stdout);
	n=rd();
//	if(n<=300) {
//		for(int i=1,xa,ya,xb,yb; i<=n; i++) {
//			xa=rd(),ya=rd(),xb=rd(),yb=rd();
//			xa+=300,xb+=300,ya+=300,yb+=300;
//			t[i].xa=xa,t[i].xb=xb,t[i].ya=ya,t[i].yb=yb;
//			add(xa,xb-1,ya,yb-1);
//			vx.push_back(xa),vx.push_back(xb),vy.push_back(ya),vy.push_back(yb);
//		}
//		int ans=0;
//		for(int i=0; i<=600; i++) {
//			int len=0;
//			for(int j=0; j<=600; j++) {
//				if(g[i][j]) len++;
//			}
//			ans+=(len==0?0:len);
//		}
//		cout<<ans;
//		return 0;
//	}
	for(int i=1;i<=n;i++) {
		t[i].xa=rd();t[i].ya=rd();t[i].xb=rd();t[i].yb=rd();
		vx.push_back(t[i].xa),vx.push_back(t[i].xb);vy.push_back(t[i].ya);vy.push_back(t[i].yb);
	}
	sort(vx.begin(),vx.end());
	sort(vy.begin(),vy.end());
	for(int i=1;i<=n;i++) {
		int xa=lower_bound(vx.begin(),vx.end(),t[i].xa)-vx.begin();
		int xb=lower_bound(vx.begin(),vx.end(),t[i].xb)-vx.begin();
		int ya=lower_bound(vy.begin(),vy.end(),t[i].ya)-vy.begin();
		int yb=lower_bound(vy.begin(),vy.end(),t[i].yb)-vy.begin();
		for(int j=xa;j<xb;j++) 
			for(int k=ya;k<yb;k++) 
				g[j][k]=1;
	}
	ans=0;
	for(int i=0;i<vx.size()-1;i++) 
		for(int j=0;j<vy.size()-1;j++) 
			if(g[i][j]) 
				ans+=1ll*(vx[i+1]-vx[i])*(vy[j+1]-vy[j])*1ll;
	cout<<ans;

}
//3
//1 1 4 3
//2 -1 3 2
//4 0 5 2
posted @ 2018-07-20 15:03  SWHsz  阅读(104)  评论(0编辑  收藏  举报