【noip2011】
noip2011
铺地毯
应该从后往前判断该地毯是否覆盖
struct node{int x,y,n,m;}a[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n);
for(int i=1;i<=n;++i) rd(a[i].x),rd(a[i].y),rd(a[i].n),rd(a[i].m);
rd(x),rd(y);
for(int i=1;i<=n;++i)
if((a[i].x<=x&&a[i].y<=y)&&(a[i].x+a[i].n>=x)&&(a[i].y+a[i].m>=y)) ans=i;
printf("%d",ans);
return 0;
选择客栈
用一个桶来装该种颜色的客栈有多少个可以配对 每找到一个新的可配对客栈 将其与前面一段的都++
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n),rd(m),rd(k);
for(int i=1;i<=n;++i) rd(a[i]),rd(p[i]);
for(int i=1,lst=0;i<=n;++i){
if(p[i]<=k){for(int j=lst+1;j<=i;++j) ++cnt[a[j]];lst=i;}
ans+=cnt[a[i]],ans-=(p[i]<=k);
}
printf("%lld",ans);
return 0;
}
Mayan游戏
神烦搜索==
写一个删除函数、掉落函数 然后还有一些细节
注意移动的时候左边有块的话就不用移动了 因为它左移和它左边的块左移是等价的
struct node{int x,y,d;}ans[10];
void print(){for(int i=1;i<=n;++i) printf("%d %d %d\n",ans[i].x-1,ans[i].y-1,ans[i].d);exit(0);}
void count(){for(int i=1;i<=5;++i){mp[i][0]=0;while(mp[i][mp[i][0]+1])mp[i][0]+=1;}}
void fall(){
for(int i=1,cnt;i<=5;++i){
cnt=0;
for(int j=1;j<=7;++j)
if(mp[i][j]) mp[i][++cnt]=mp[i][j];
for(int j=cnt+1;j<=7;++j) mp[i][j]=0;mp[i][0]=cnt;
}
}
bool tg[7][9],ok;
void delet(){
count();memset(tg,0,sizeof(tg)),ok=0;
for(int i=2;i<=4;++i)
for(int j=1;j<=mp[i][0];++j)
if(mp[i][j]==mp[i-1][j]&&mp[i][j]==mp[i+1][j]) tg[i][j]=tg[i-1][j]=tg[i+1][j]=1;
for(int i=1;i<=5;++i)
for(int j=2;j<mp[i][0];++j)
if(mp[i][j]==mp[i][j-1]&&mp[i][j]==mp[i][j+1]) tg[i][j]=tg[i][j-1]=tg[i][j+1]=1;
for(int i=1;i<=5;++i)
for(int j=1;j<=mp[i][0];++j)
if(tg[i][j]) mp[i][j]=0,ok=1;
fall();if(ok) delet();
}
bool finsh(){for(int i=1;i<=5;++i)if(mp[i][0]) return 0;return 1;}
void dfs(int x){
if(x==n+1){if(finsh()) print();return;}
if(finsh()) return;
int ret[10][10];memcpy(ret,mp,sizeof(mp));
for(int i=1;i<=5;++i)
for(int j=1;j<=mp[i][0];++j){
if(i!=5){
swap(mp[i][j],mp[i+1][j]);
fall(),delet(),ans[++tt]=(node){i,j,1},dfs(x+1);
--tt,memcpy(mp,ret,sizeof(mp));
}
if(i!=1&&!mp[i-1][j]){
swap(mp[i][j],mp[i-1][j]);
fall(),delet(),ans[++tt]=(node){i,j,-1},dfs(x+1);
--tt,memcpy(mp,ret,sizeof(mp));
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n);
for(int i=1;i<=5;++i)
while(rd(mp[i][++mp[i][0]]),mp[i][mp[i][0]]);
for(int i=1;i<=5;++i) mp[i][0]-=1;
dfs(1),puts("-1");
return 0;
}
计算系数
根据二项式定理:\((a+b)^n=\sum\limits_{k=0}^n{n\choose k}a^kb^{n-k}\)
复习一下杨辉三角?
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(a),rd(b),rd(k),rd(n),rd(m);
for(int i=1;i<=k;++i){
c[i][0]=c[i][i]=1;
for(int j=1;j<i;++j) c[i][j]=(c[i-1][j]+c[i-1][j-1])%P;
}
ans=qpow(a%P,n)*qpow(b%P,m)%P;
printf("%d",ans*c[k][n]%P);
return 0;
}
聪明的质检员
二分
struct node{int l,r;}q[N];
int sum[N];ll sv[N];
ll check(int mid){
for(int i=1;i<=n;++i)
if(w[i]>=mid) sum[i]=1,sv[i]=v[i];
else sum[i]=sv[i]=0;
for(int i=1;i<=n;++i) sum[i]+=sum[i-1],sv[i]+=sv[i-1];
ll ret=0;
for(int i=1,l,r;i<=m;++i) ret+=((ll)sum[r=q[i].r]-sum[l=q[i].l-1])*(sv[r]-sv[l]);
return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n),rd(m),rd(K);
for(int i=1;i<=n;++i) rd(w[i]),rd(v[i]);
for(int i=1;i<=m;++i) rd(q[i].l),rd(q[i].r);
int l=0,r=1000000,mid;ll ret;
while(l<=r){
mid=l+r>>1,ret=check(mid),ans=min(ans,abs(ret-K));
if(!ans) return puts("0"),0;
if(ret>K) l=mid+1;
else r=mid-1;
}
printf("%lld",ans);
return 0;
}
观光公交
每次修改一条路\(i\) 它只会影响到达景点\(i+1\)以及它之后的连续的会出现”人等车“的情况的景点 若景点\(i+1\)之后出现一个景点是\(x\)"车等人"的情况那么这条路权值减少就会不影响到景点\(x\)及其之后的景点
那么每次贪心减去影响最大的那条边
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n),rd(m),rd(k);
for(int i=1;i<n;++i) rd(d[i]);
for(int i=1;i<=m;++i){
rd(t[i]),rd(fr[i]),rd(to[i]);
las[fr[i]]=Max(las[fr[i]],t[i]),++dw[to[i]];
}
for(int i=1;i<=n;++i) sum[i]=sum[i-1]+dw[i];
for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
for(int i=1;i<=m;++i) ans+=((ll)lef[to[i]-1]+d[to[i]-1])-t[i];
while(k--){
for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
eff[n-1]=n;//第i条边改变 会影响到的最远城市
for(int i=n-2,arr;i;--i){
arr=lef[i]+d[i];
if(arr>las[i+1]) eff[i]=eff[i+1];
else eff[i]=i+1;
}
int mx=0,pos=0;
for(int i=1;i<n;++i)
if(d[i]&&sum[eff[i]]-sum[i]>mx) mx=sum[eff[i]]-sum[i],pos=i;
ans-=mx,--d[pos];
}
printf("%lld",ans);
return 0;
}