【GYM102091】2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest
A-Evolution Game
题目大意:有$n$个不同的野兽,定义第$i$ 个野兽有 $i$ 个眼睛和 $h[i]$ 个角,你可以任意从中选择一个野兽进行进化,每次进化角数量必须增加,而且进化后要满足眼镜的变化量 $\triangle i \leq w$,求最多的进化次数。
题解:以$h$的值从大到小排序,$f[i]$表示从第i个野兽开始进化的最多次数。对于$1 \leq i \leq j$若满足条件则$f[j]=max \{ f[i]+1 \}$。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int n,w,ans;
- int f[];
- struct hh
- {
- int eye,horn;
- }a[];
- bool cmp(hh a,hh b)
- {
- return a.horn>b.horn;
- }
- int main()
- {
- int i,j;;
- scanf("%d%d",&n,&w);
- for(i=;i<=n;i++)
- scanf("%d",&a[i].horn);
- for(i=;i<=n;i++)
- a[i].eye=i;
- sort(a+,a++n,cmp);
- for(i=;i<=n;i++)
- for(j=i+;j<=n;j++)//h[i]>h[j]
- if(a[i].horn>a[j].horn&&abs(a[i].eye-a[j].eye)<=w)
- f[j]=max(f[j],f[i]+);
- for(i=;i<=n;i++)
- ans=max(f[i],ans);
- printf("%d",ans);
- return ;
- }
D-Bus Stop
题目大意:给出$n$个房子的坐标,要建立公交车站使得每个房子离最近的车站不过10公里,求最少的车站数。
题解:从左往右贪心即可。
- #include <bits/stdc++.h>
- using namespace std;
- const int N=3e6;
- int m,n;
- int a[N];
- int ans,lstop;
- int main()
- {
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- scanf("%d",&a[i]);
- }
- lstop=a[]+;
- ans=;
- for(int i=;i<=n;i++){
- if(abs(a[i]-lstop)<=){
- ;
- }
- else{
- lstop=a[i]+;
- ans++;
- }
- }
- if(n==)ans=;
- if(n==)ans=;
- printf("%d\n",ans);
- }
- }
G-Communication
题目大意:求有向图强连通分量数。
题解:Floyed+并查集或者Tarjan。
- #include <bits/stdc++.h>
- using namespace std;
- const int N=1e3;
- int m,n,c,ans,a,b;
- int f[N];
- int edge[N][N];
- int fnd(int x)
- {
- if(f[x]==x)return x;
- return f[x]=fnd(f[x]);
- }
- int main()
- {
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d%d",&n,&c);
- memset(edge,,sizeof(edge));
- for(int i=;i<n;i++)
- f[i]=i;
- for(int i=;i<=c;i++){
- scanf("%d%d",&a,&b);
- edge[a][b]=;
- }
- for(int k=;k<n;k++)
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- if(edge[i][k]&&edge[k][j])edge[i][j]=;
- }
- ans=;
- for(int i=;i<n-;i++)
- for(int j=i+;j<n;j++){
- if(edge[i][j]+edge[j][i]==){
- f[j]=fnd(i);
- }
- }
- for(int i=;i<n;i++){
- if(f[i]==i)ans++;
- }
- printf("%d\n",ans);
- }
- }
H-As rich as Crassus
题目大意:$x^3 \equiv A_i \ \ (mod \ \ N_i) (i=3)$,求$x$。
题解:中国剩余定理
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int n,t;
- long long ans;
- long long b[],m[];
- long long exgcd(long long a,long long b,long long &x,long long &y){
- if(b==){x=,y=;return a;}
- long long d=exgcd(b,a%b,x,y);
- long long z=x;x=y,y=z-a/b*y;
- return d;
- }
- void print(long long x){
- if(!x) return;
- if(x) print(x/);
- putchar(x%+'');
- }
- int main()
- {
- int i;
- long long x,y,M,aa,bb,cc,d,tmp;
- bool flag;n=;
- scanf("%d",&t);
- while(t--)
- {
- ans=flag=;
- for(i=;i<=n;i++)
- scanf("%I64d",&m[i]);
- for(i=;i<=n;i++)
- scanf("%I64d",&b[i]);
- M=m[],ans=b[];
- for(i=;i<=n;i++)
- {
- aa=M,bb=m[i],cc=(b[i]-ans%bb+bb)%bb;
- x=,y=;
- d=exgcd(aa,bb,x,y);
- bb=bb/d;
- if(cc%d){flag=;break;}
- x=((x*cc/d)%bb+bb)%bb;
- ans+=M*x;M*=bb;
- ans=(ans%M+M)%M;
- }
- if(flag)puts("-1");
- else {
- if(!ans)puts("");
- else
- {
- tmp=pow(ans,1.0/3.0);
- if(tmp*tmp*tmp<ans) printf("%I64d\n",tmp+);
- else printf("%I64d",tmp);
- }
- }
- }
- return ;
- }
- close
J-Floating-Point Hazard
题目大意:给出L,R,求$\sum_{i=L}^{R}(\sqrt[3]{i+10^{-15}}-\sqrt[3]{i})$。
题解:微分
- #include <iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- typedef long long ll;
- int main()
- {
- #ifdef LOCAL
- freopen("in.txt","r",stdin);
- // freopen("out.txt","w",stdout);
- #endif // LOCAL
- int a,b;
- while(~scanf("%d%d",&a,&b)){
- if(!a||!b) break;
- double ans=;
- for(ll i=a;i<=b;i++){
- ans+=pow(i*i,-/3.0);
- }
- ans*=1.0/*(1e-);
- printf("%.5E\n",ans);
- }
- }
K-The Stream of Corning 2
题目大意:给出若干个数和存在的时间点,问某一时刻存在的数中的第k大。
题解:将一个操作的起始点和终止点拆开标记,按时间排序后,用树状数组+二分求动态第k大数。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int t,n,totp,totq,lim;
- struct hh
- {
- int opt,t,v,k,id;
- }p[],q[];
- int c[];
- int lowbit(int x)
- {
- return x&(-x);
- }
- void add(int pos,int v)
- {
- for(;pos<=lim;pos+=lowbit(pos))
- c[pos]+=v;
- }
- int query(int pos)
- {
- int ret=;
- for(;pos;pos-=lowbit(pos))
- ret+=c[pos];
- return ret;
- }
- bool cmp(hh a,hh b)
- {
- return a.t<b.t;
- }
- bool cmp2(hh a,hh b)
- {
- return a.id<b.id;
- }
- int solve(int k)
- {
- int l,r,mid,ret,n;
- l=;r=lim;
- ret=lim;
- if(query(lim)<k) return -;
- while(l<=r)
- {
- mid=l+r>>;
- if(query(mid)>=k)
- {
- r=mid-;
- ret=min(ret,mid);
- }
- else l=mid+;
- }
- return ret;
- }
- int main()
- {
- int T,i,j,a,b,z,prep,opt;
- scanf("%d",&t);
- for(T=;T<=t;T++)
- {
- scanf("%d",&n);
- totp=totq=;
- memset(p,,sizeof(p));
- memset(q,,sizeof(q));
- memset(c,,sizeof(c));
- for(i=;i<=n;i++)
- {
- scanf("%d%d%d",&opt,&a,&b);
- lim=max(lim,b);
- if(opt==)
- {
- scanf("%d",&z);
- p[++totp].opt=;
- p[totp].v=b;
- p[totp].t=a;
- p[++totp].opt=-;
- p[totp].v=b;
- p[totp].t=z;
- }
- else
- {
- q[++totq].t=a;
- q[totq].k=b;
- q[totq].id=i;
- }
- }
- sort(p+,p++totp,cmp);
- sort(q+,q++totq,cmp);
- prep=;
- for(i=;i<=totq;i++)
- {
- while(p[prep].t<q[i].t&&prep<=totp)
- {
- add(p[prep].v,p[prep].opt);
- prep++;
- }
- q[i].v=solve(q[i].k);
- }
- sort(q+,q++totq,cmp2);
- printf("Case %d:\n",T);
- for(i=;i<=totq;i++)
- printf("%d\n",q[i].v);
- }
- return ;
- }
L-Largest Allowed Area
题目大意:求一个最大的子矩阵,要求子矩阵的和为0或1。
题解:单调队列。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- using namespace std;
- int t,n,m,ans;
- int s[][],a[][];
- char c;
- int main()
- {
- int i,j;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- memset(s,,sizeof(s));
- memset(a,,sizeof(a));
- for(i=;i<=n;i++)
- for(j=;j<=m;j++)
- {
- do{c=getchar();}while(c!=''&&c!='');
- s[i][j]=c-''+s[i-][j]+s[i][j-]-s[i-][j-];
- }
- for(i=,ans=;i<=n;i++)
- for(j=;j<=m;j++)
- {
- a[i][j]=a[i-][j-]-(a[i-][j-]>=);
- while(i+a[i][j]<=n&&j+a[i][j]<=m&&s[i+a[i][j]][j+a[i][j]]-s[i-][j+a[i][j]]-s[i+a[i][j]][j-]+s[i-][j-]<=)
- a[i][j]++;
- ans=max(ans,a[i][j]);
- }
- printf("%d\n",ans);
- }
- return ;
- }
【GYM102091】2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest的更多相关文章
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
- 2019 ACM/ICPC Asia Regional shanxia D Miku and Generals (二分图黑白染色+01背包)
Miku is matchless in the world!” As everyone knows, Nakano Miku is interested in Japanese generals, ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest
题解: https://files.cnblogs.com/files/clrs97/19HKEditorial-V1.zip Code:(Part) A. Axis of Symmetry #inc ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)G GCD Guessing Game
G: 要你去才Paul的年龄,Paul的年龄在1~n之间,你每猜一个Paul会告诉你,你猜的这个数和他年龄的gcd,问在最坏情况下最少要猜多少次. 题解: 什么是最坏情况,我们直到如果他的年龄是1的话 ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)E Eve
E: 模拟题,一开始有n个人(有男有女),对于子女来说线粒体DNA是继承母亲的.然后有m个操作(按时间顺序),一种就是给了父亲,母亲的ID,生了一个孩子(编号从n+1开始往下):还有一个就是 -x , ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)K Kingdom Roadmap
K: 给你n个点以及n-1的条边, 问你最少要加多少条边,使得每两个点割去一条联通的边,还可以使的这两个点连通. 有个一个结论,最少添加的边数为(叶子节点数+1)/ 2. 我们可以只考虑叶子节点数应该 ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)B Binary Encoding
B: 现在有一种新的2进制表示法,要你求出0~m-1的每个数的表示. 规则如下:n 是满足 m<=2n 最小数. 而0~m-1的数只能够用n-1个位和n个位来表示. 对于n个位表示的数来说不能有 ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)A ASCII Area
A: 给你一个矩阵求'/' 和 '\' 围成的图形,简单签到题,有一些细节要考虑. 题解:一行一行的跑,遇到'/'和'\' 就加0.5, 在面积里面的'.' 就加1.用一个flag来判断是否在围住的图 ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest J. Junior Mathematician 题解(数位dp)
题目链接 题目大意 要你在[l,r]中找到有多少个数满足\(x\equiv f(x)(mod\; m)\) \(f(x)=\sum_{i=1}^{k-1} \sum_{j=i+1}^{k}d(x,i) ...
随机推荐
- [Offer收割]编程练习赛104
题目过于简单,没啥好说的,但是拿了个第一感觉很爽,记录一下 题目1 : 小Hi与魔法 排序,从1开始递增 #include <bits/stdc++.h> using namespace ...
- jQuery纵向分类下拉菜单导航
在线演示 本地下载
- JavaScript中的this关键字的几种用法
JS 里的 this 在 function 内部被创建 指向调用时所在函数所绑定的对象(拗口) this 不能被赋值,但可以被 call/apply 改变 1. this 和构造函数 function ...
- iOS尽量不要在viewWillDisappear:方法中移除通知
http://www.cocoachina.com/ios/20151214/14596.html 在了解控制器的生命周期之后,我们都知道viewWillAppear:方法是在控制器的view将要显示 ...
- 第三十二讲:UML类图(下)
一个类能够看到另外一个类的属性和方法,那么这两个类是关联的.
- weixin 微信开放平台 微信公众平台
官网地址入口 微信小程序 https://mp.weixin.qq.com/ appid and openid not match 1.appid :是公众号的ID. 2.openid:关注公众号生成 ...
- KiCad EDA 5.1.4 发布了
KiCad EDA 5.1.4 发布了 KiCad EDA 自豪地宣布 KiCad 5 系列最新稳定版发布.5.1.4 稳定版修复了来自 5.1.2 和 5.1.3 版本的关键错误修复和其他一些小改进 ...
- 笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 (2019-06-09)
笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 原因 为了和服务器一样的运行环境. 使用 Ubuntu 运行 Odoo 运行更快. 方便使用 Windows 10 ...
- oracle函数的分类
v 单行函数:对每一行输入值进行计算,得到相应的计算结果,返回给用户,也就是说,每行作为一个输入参数,经过函数计算得到每行的计算结果. 比如select length(ename) from emp ...
- 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务
2019年4月4日,阿里云安全应急响应中心监测到Confluence 官方发布安全更新指出,Widget Connector 存在服务端模板注入漏洞,攻击者能利用此漏洞实现目录穿越遍历甚至远程命令执行 ...