2017-10-29-afternoon-清北模拟赛
2024-09-03 08:01:03
T1 洗澡
贪心:将未匹配的右括号花费1变为左括号,最有多余的左括号有一半变成右括号
#include <cstring>
#include <cstdio> const int N();
int n,top,ans;
char s[N]; int Presist()
{
freopen("shower.in","r",stdin);
freopen("shower.out","w",stdout);
scanf("%s",s); n=strlen(s);
for(int i=; i<n; ++i)
{
if(s[i]=='(') top++;
else
{
if(top<) top++,ans++;
else top--;
}
}
printf("%d\n",ans+top/);
return ;
} int Aptal=Presist();
int main(int argc,char*argv[]){;}
AC
T2 日记
线性筛出1e6内的所有素数,一共78000++个,对于每次询问暴力查找(可二分)符合条件的最大数,1.6*10^8
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N(1e6+);
bool not_pri[N],flag;
long long sum[N];
int pri[N],cnt,t; inline void Prepare()
{
register int i,j;
for(i=; i<=1e6; ++i)
{
if(!not_pri[i]) pri[++cnt]=i;
for(j=; j<=cnt; ++j)
{
if(i*pri[j]>1e6) break;
not_pri[i*pri[j]]=;
if(i%pri[j]==) break;
}
}
for(i=; i<=cnt; ++i)
sum[i]=sum[i-]+1ll*pri[i];
} int Presist()
{
freopen("diary.in","r",stdin);
freopen("diary.out","w",stdout);
// freopen("1.txt","r",stdin);
Prepare(); read(t);
for(register int n,k,i,j; t--; )
{
read(n),read(k); flag=;
for(i=cnt; i>=k; --i)
{
j=i-k;
if(sum[i]-sum[j]<=n)
{
printf("%I64d\n",sum[i]-sum[j]);
flag=; break;
}
}
if(flag) puts("-1");
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T3 洗衣
用f(i)表示第i棵树的值的话,会发现 f(i)=f(i-1)+f(i-2)+一坨奇怪的东西
这坨奇怪的东西大概是某棵树中到某个点的距离之和的几个组合方式,
所以你会发现本质问题实际上需要求第i棵树中所有点到第j个点的距离之和
用g[i][j]表示这个东西,那么我们实际上要想办法求g[i][j],那么这个递归的往下用记忆化搜索的方式历来求
#include <algorithm>
#include <cstdio>
#include <map> #define LL long long const int mod(1e9+);
const int N(); typedef std:: map<std:: pair<LL,LL>, LL> Mm1;
typedef std:: map<LL,LL> Mm2;
Mm1 mm1[N];
Mm2 mm2[N]; inline void read(LL &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} LL a[N],b[N],c[N],d[N],l[N];
LL F[N],n[N]; inline LL dis(LL i,LL x,LL y)
{
if(x>y) { LL a=x;x=y;y=a;}
if(x==y) return ;
Mm1::iterator it=mm1[i].find(std::make_pair(x,y));
if(it!=mm1[i].end()) return it->second;
LL na=n[a[i]];
if(x>=na) return mm1[i][std::make_pair(x,y)]=dis(b[i],x-na,y-na)%mod;
else if(y<na) return mm1[i][std::make_pair(x,y)]=dis(a[i],x,y)%mod;
else return mm1[i][std::make_pair(x,y)]=(dis(a[i],x,c[i])+dis(b[i],d[i],y-na)+l[i])%mod;
} inline LL f(LL i,LL j)
{
if(!i) return ;
Mm2:: iterator it=mm2[i].find(j);
if(it != mm2[i].end()) return it->second;
LL na=n[a[i]];
if(j<na) return mm2[i][j]= ( f(a[i],j)+n[b[i]]%mod*
dis(i,j,d[i]+na)%mod+
f(b[i],d[i])) %mod;
else return mm2[i][j]= ( f(b[i],j-na)+n[a[i]]%mod*
dis(i,j,c[i]) %mod+
f(a[i],c[i])) %mod;
} int Presist()
{
freopen("cloth.in","r",stdin);
freopen("cloth.out","w",stdout);
int m; scanf("%d",&m);
F[]=; n[]=;
for(int i=; i<=m; ++i)
{
read(a[i]),read(b[i]),read(c[i]),read(d[i]),read(l[i]);
n[i]=n[a[i]]+n[b[i]]; l[i]%=mod;
LL na=n[a[i]]%mod, nb=n[b[i]]%mod;
printf("%I64d\n",F[i]=( F[a[i]]+F[b[i]]+
nb*f(a[i],c[i])%mod+
na*f(b[i],d[i])%mod+
na*nb %mod*l[i]%mod)%mod);
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
最新文章
- enable feature AJAX of MOSS2007
- 使用小技巧,让你高效使用Eclipse
- 查看linux系统,服务,配置文件被修改的时间
- Culcurse
- 关于手动关闭BootStrap模态框
- Node Express 初探
- ubuntu下使用nginx搭建流媒体服务器,实现视频点播
- 模态框zeroModal快速引入
- python基础学习(一)
- java新手入门
- 浅谈React数据流管理
- 如何进行Django单元测试
- ROCKETMQ——2主2从集群部署
- eclipse 常用jar包总结
- Java第三阶段学习(二、IO流--------递归,字节流Stream)
- c++重载前置++和--
- 北京Uber优步司机奖励政策(11月9日~11月15日)
- 安装jdk8-linux版
- @classmethod装饰器
- 区域存储网络(SAN)与 网络直接存储(NAS)