2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp

 

A: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/A
题意:N*M的格子,从左上走到右下,要求在每个点的权值必须大于0,问起始的时候必须有多少能量
思路:二分答案

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; typedef long long LL; const int maxn=510; const int maxm=1010; const int MOD=1e9+7; const int INF=0x3f3f3f3f; int N,M; int a[maxn][maxn]; int dp[maxn][maxn]; bool can(int x){ for(int i=0;i<=N;i++){ for(int j=0;j<=M;j++){ dp[i][j]=-INF; } } dp[1][1]=x; if(dp[1][1]<=0)return false; for(int i=1;i<=N;i++){ for(int j=1;j<=M;j++){ if(i==1&&j==1)continue; dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j]; if(dp[i][j]<=0)dp[i][j]=-INF; } } return dp[N][M]>=0; } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&N,&M); for(int i=1;i<=N;i++){ for(int j=1;j<=M;j++){ scanf("%d",&a[i][j]); } } int l=0,r=INF; while(l<r){ int mid=(l+r)>>1; if(can(mid))r=mid; else l=mid+1; } printf("%d\n",r); } return 0; }

 

D: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/D

题意:N个人,两两之间比赛,然后告诉你每个人赢了多少场,但里面存在错误,问最小修改多少分,能符合常理
思路:每次枚举分数最高的,然后把他输得分配下去,更新答案

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; typedef long long LL; const int maxn=100010; const int maxm=1010; const int MOD=1e9+7; const int INF=0x3f3f3f3f; int N; int a[maxn]; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&N); int sum=0; for(int i=1;i<=N;i++){ scanf("%d",&a[i]); } int ans=0; for(int i=N;i>=1;i--){ sort(a+1,a+1+i); if(a[i]>=i){ ans+=a[i]-i+1; a[i]=i-1; } int cha=i-a[i]-1; for(int j=i-1;j>=i-cha;j--){ a[j]--; if(a[j]<0){ ans++; a[j]=0; } } } printf("%d\n",ans); } return 0; }

 

前1个人,至少0场胜利,他可能全部败给后面的人,也可能赢了后面某几个人。
前2个人,至少要有1场胜利,他们之间必须有一人获胜,如果不够,就需要补足。如果大于1,表示他们之中有人赢了后面某几人。
前3个人,至少要有3场胜利 ………………
前4个人,至少要有6场胜利 ………………
等等…………
前n个人(即所有的人)时,至少要有n(n-1)/2场胜利,不够则补足。但如果大于n(n-1)/2,就表示胜利场数超了,此时需要将胜利场数更改回n(n-1)/2 。

#include<cstdio>  
#include<algorithm>  
#include<iostream>  
using namespace std; int main(){ int s[51],p[51]; int t,i,n,res; for(cin>>t;t--;){ cin>>n; for(i=0,res=0;i<n;i++){ cin>>s[i]; p[i]=i?p[i-1]+i:0; } sort(s,s+n); for(i=0;i<n;i++){ s[i]=i?s[i-1]+s[i]:s[i]; if(p[i]>=s[i]) res+=p[i]-s[i],s[i]=p[i]; } cout<<res+s[n-1]-p[n-1]<<endl; } return 0; } 

 

H: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/H
题意:找有多少个字串包含最大值和最小值,找有多少个子序列包含最大值最小值
思路:对于第一个,可以预处理出里每个位置最近的最大值和最小值,然后枚举开头。对于第二问设最大值的个数为cnt1,最小值的个数为cnt2,那么答案就是2N2Ncnt12Ncnt2+2Ncnt1cnt2

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; typedef long long LL; const int maxn=100010; const int maxm=1010; const int MOD=1e9+7; const int INF=0x3f3f3f3f; int N; int a[maxn]; LL f[maxn]; int pos[maxn][2]; void solve(){ int minv=INF,maxv=-INF; int cnt1=0,cnt2=0; for(int i=1;i<=N;i++){ if(a[i]<minv){ minv=a[i]; cnt1=1; } else if(a[i]==minv){ cnt1++; } if(a[i]>maxv){ maxv=a[i]; cnt2=1; } else if(a[i]==maxv){ cnt2++; } } LL ans1=0,ans2=0; if(maxv==minv){ ans1=(1LL*(N+1)*N/2)%MOD; ans2=f[N]-1; printf("%lld %lld\n",ans1,ans2); return; } ans2=(f[N]-f[N-cnt1]-f[N-cnt2]+f[N-cnt1-cnt2])%MOD; int pos1=-1,pos2=-1; ans1=0; for(int i=N;i>=1;i--){ if(a[i]==minv)pos1=i; if(a[i]==maxv)pos2=i; pos[i][0]=pos1,pos[i][1]=pos2; } for(int i=1;i<=N;i++){ if(pos[i][0]!=-1&&pos[i][1]!=-1){ int x=max(pos[i][0],pos[i][1]); ans1+=N-(x-1); if(ans1>=MOD)ans1-=MOD; } } printf("%lld %lld\n",ans1,(ans2+MOD)%MOD); } int main(){ f[0]=1; for(int i=1;i<maxn;i++){ f[i]=f[i-1]*2%MOD; } int T; scanf("%d",&T); while(T--){ scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d",&a[i]); } solve(); } return 0; }

 

I: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/I
题意:每条龙都有一个生存周期,也会有一个父亲,问每条龙存在的时候,最多跟他的子孙隔多少代
思路:因为要查询他的子孙,所以首先对每个节点求出dfs序,隔多少代其实就是树中深度差多少,然后按照d(死亡时间)排序,离线处理,对于出生时间h小于d的都加进去,然后查询,具体看代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; typedef long long LL; const int maxn=100010; const int maxm=1010; const int MOD=1e9+7; const int INF=0x3f3f3f3f; struct node{ int h,d,p,id; node(){} node(int _p,int _h,int _d,int _id):p(_p),h(_h),d(_d),id(_id){} }a[maxn],b[maxn]; int dfn[maxn],dep[maxn],num[maxn]; int dfs_clock; int N; vector<int> G[maxn]; struct IntervalTree{ int maxv[maxn<<2]; void build(int o,int l,int r){ maxv[o]=0; if(l==r){ return ; } int mid=(l+r)>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); } void update(int o,int l,int r,int x,int val){ if(l==r){ maxv[o]=val; return ; } int mid=(l+r)>>1; if(x<=mid)update(o<<1,l,mid,x,val); else update(o<<1|1,mid+1,r,x,val); pushup(o); } void pushup(int o){ maxv[o]=max(maxv[o<<1],maxv[o<<1|1]); } int query(int o,int l,int r,int q1,int q2){ if(q1<=l&&r<=q2){ return maxv[o]; } int ans=0; int mid=(l+r)>>1; if(q1<=mid)ans=max(ans,query(o<<1,l,mid,q1,q2)); if(q2>mid)ans=max(ans,query(o<<1|1,mid+1,r,q1,q2)); return ans; } }tree; void dfs(int u,int depth){ dep[u]=depth; num[u]=1; dfn[u]=++dfs_clock; int len=G[u].size(); for(int i=0;i<len;i++){ int v=G[u][i]; dfs(v,depth+1); num[u]+=num[v]; } } bool cmp(node A,node B){ return A.h<B.h; } bool cmp1(node A,node B){ return A.d<B.d; } int ans[maxn]; int main(){freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--){ scanf("%d",&N); for(int i=0;i<=N;i++){ G[i].clear(); } for(int i=0;i<N;i++){ scanf("%d%d%d",&a[i].p,&a[i].h,&a[i].d); a[i].id=b[i].id=i; b[i].p=a[i].p; b[i].h=a[i].h; b[i].d=a[i].d; if(a[i].p!=-1)G[a[i].p].push_back(i); } dfs_clock=0; dfs(0,0); sort(a,a+N,cmp); sort(b,b+N,cmp1); tree.build(1,1,N); int j=0; for(int i=0;i<N;i++){ while(j<N&&a[j].h<=b[i].d){ tree.update(1,1,N,dfn[a[j].id],dep[a[j].id]); j++; } ans[b[i].id]=tree.query(1,1,N,dfn[b[i].id],dfn[b[i].id]+num[b[i].id]-1)-dep[b[i].id]; } for(int i=0;i<N;i++){ printf("%d",ans[i]); if(i==N-1)printf("\n"); else printf(" "); } } return 0; }

转载于:https://www.cnblogs.com/13224ACMer/p/4744350.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是混合云?

来源&#xff1a;光联集团混合云是使那些正常的进化措施看起来更酷&#xff0c;是IT前沿术语之一。亚马逊&#xff0c;谷歌和微软等云供应商倡导企业关闭内部数据中心并将所有基础架构迁移到云端&#xff0c;这就是“超融合”数据中心战略。1转移基础设施对于刚刚起步的公司而言…

Shell—grep、sed、awk

Shell学习 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 She…

【科普】AI的分类与演进

来源&#xff1a;物联网智库摘要&#xff1a;AI是人工通过高强度的计算能力&#xff0c;并基于大量的环境数据、行为数据、历史数据等大数据支持&#xff0c;或是一定规则的自学习机制&#xff0c;来分析特定输入的情况下&#xff0c;事物的相关性、影响和可能处理方法&#xf…

AngularJs入门学习

http://www.ituring.com.cn/article/13471 安装并配置好所有依赖环境之后&#xff0c;只需要在cmd进入angular-phonecat目录。接着指令操作npm start&#xff1b;开启服务器。如下图&#xff1a; 打开angular-phonecat的gitbash&#xff1b; 接下来就是用编译器打开angular-pho…

nginx+uWSGI + django部署项目

项目部署 nginxuWSGI django 1. WSGI WSGI是Web服务器网关接口。它是一个规范&#xff0c;描述了Web服务器(返回静态资源的就是web服务器&#xff0c;Nginx)如何与Web应用程序(django、Flask)通信&#xff0c;以及Web应用程序如何链接在一起以处理一个请求&#xff0c;&…

深入理解js闭包

闭包&#xff08;closure&#xff09;是Javascript语言的一个难点&#xff0c;也是它的特色&#xff0c;很多高级应用都要依靠闭包实现。 下面就是我的学习笔记&#xff0c;对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascri…

71页《乌镇智库:全球人工智能发展报告(2018)》PDF下载

来源&#xff1a;专知【导读】人工智能热潮之下&#xff0c;斯坦福、阿里等纷纷出台人工智能报告。乌镇智库已连续发布三年《全球人工智能发展报告》&#xff0c;以宏观视角纵览全球人工智能发展&#xff0c;从产业、融资、技术、教育和应用等多个角度展现人工智能在全球的发展…

Windows实用技巧

Windows常用命令&#xff0c;亲测可用 创建文件夹Test&#xff0c;命令为&#xff1a;mkdir Test 盘符&#xff1a; 进入系统中的某个盘&#xff0c;例如E&#xff1a;进入E盘cd 文件夹位置 进入某个文件夹&#xff0c;需要先进入盘符&#xff0c;即完成第一步&#xff0c;例如…

python进程、线程、协程

通过学习bi站 蚂蚁学Python 老师视频总结文档&#xff0c;仅用于学习。。。 python进程、线程、协程 多线程&#xff1a;threading&#xff0c;利用CPU和IO可以同时执行的原理&#xff0c;不会让CPU干巴巴的等待IO完成 多进程&#xff1a;multiprocessing&#xff0c;利用多核…

一文读懂计算计仿真技术

来源&#xff1a;传感器技术计算机仿真作为分析和研究系统运行行为、揭示系统动态过程和运动规律的一种重要手段和方法, 随着系统科学研究的深入、控制理论、计算技术、计算机科学与技术的发展而形成的一门新兴学科。近年来, 随着信息处理技术的突飞猛进, 使仿真技术得到迅速发…

Chrome Cookie SameSite 属性设置

Chrome Cookie SameSite 设置 Chrome 51 开始&#xff0c;浏览器的 Cookie 新增加了一个SameSite属性&#xff0c;用来防止 CSRF 攻击和用户追踪。 Cookie 的SameSite属性用来限制第三方 Cookie&#xff0c;从而减少安全风险。 它可以设置三个值。 StrictLaxNone Chrome 默认…

胡蜂也会逻辑推理

胡蜂能通过基本的逻辑测试。来源&#xff1a; 中国科学报逻辑推理是一种复杂的行为&#xff0c;通常被认为仅限于具有复杂神经系统的动物。但一项新的研究表明&#xff0c;胡蜂可以运用某种逻辑推理。这在无脊椎动物中尚属首次。相关成果日前发表于英国《皇家学会生物学报》。这…

两种方法解决tomcat的 Failed to initialize end point associated with ProtocolHandler [http-apr-8080]...

安装多个tomcat同时启动的时候&#xff0c;端口号冲突。修改下端口号就可以了。转载于:https://www.cnblogs.com/CooderIsCool/p/4749831.html

python asyncio 异步编程---协程

1、协程 官方描述; 协程是子例程的更一般形式。 子例程可以在某一点进入并在另一点退出。 协程则可以在许多不同的点上进入、退出和恢复。 它们可通过 async def 语句来实现。 参见 PEP 492。 协程不是计算机内部提供的&#xff0c;不像进程、线程&#xff0c;由电脑本身提供&a…

二十大未来最有潜力的新材料(绝对经典值得收藏)

来源&#xff1a;新材料在线石墨烯、碳纳米管、非晶合金、泡沫金属、离子液体……20种新材料&#xff0c;为材料工业工业发展带来无限机遇。材料工业是国民经济的基础产业&#xff0c;新材料是材料工业发展的先导&#xff0c;是重要的战略性新兴产业。今天&#xff0c;科技革命…

Unity3D 4.x 使用Mecanim实现动画控制

Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim&#xff0c;尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的&#xff0c;可知Mecanim将会是以后动画播放的趋势&#xff01; Mecanim是一种基于状态机的结构&#xff0c;不同的…

全国国家重点实验室分布总览

来源&#xff1a;114产学研在我国的科研平台&#xff0c;企业国家重点实验室、国家重点实验室和省部共建国家重点实验室在科学前沿探索和解决国家重大需求方面发挥了非常重要的作用&#xff0c;在科学研究方面取得不少具有国际先进水平的成果。2018年5月21日&#xff0c;科技部…

(算法)宝石升级问题

题目&#xff1a; 有一块宝石&#xff0c;1级升2级成功率100&#xff05;&#xff0c;2级升3级成功率80&#xff05;&#xff0c;3级升4级成功率60&#xff05;&#xff0c;4级升5级成功率40&#xff05;&#xff0c;每次升级失败时降回到1级。请问一块1级宝石升到5级平均要多少…

python asyncio 异步编程-协程 2

asyncio 异步编程 官方文档&#xff1a; 中文版&#xff1a;https://docs.python.org/zh-cn/3.8/library/asyncio.html英文本&#xff1a;https://docs.python.org/3.8/library/asyncio.html 1. 事件循环 事件循环 是指主线程每次将执行序列中的任务清空后&#xff0c;就去…

能源枯竭?在能源互联网时代不存在!

曹军威清华大学信息技术研究院研究员、副院长北京智中能源互联网研究院首席科学家来源&#xff1a;DeepTech深科技演绎inSite第十一期节目能量路由器离我们还远吗&#xff1f;曹军威演绎inSite演讲视频链接&#xff1a;以下为曹军威老师演讲文字稿&#xff1a;&#xff08;根据…