欢乐赛爆零祭
今天上午困得要死,全程划水。。
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
",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