AtCoder Petrozavodsk Contest 001
第一场apc,5H的持久战,我当然水几个题就睡了
A - Two Integers
Time limit : 2sec / Memory limit : 256MB
Score : 100 points
Problem Statement
You are given positive integers X and Y. If there exists a positive integer not greater than 1018 that is a multiple of X but not a multiple of Y, choose one such integer and print it. If it does not exist, print −1.
Constraints
- 1≤X,Y≤109
- X and Y are integers.
Input
Input is given from Standard Input in the following format:
X Y
Output
Print a positive integer not greater than 1018 that is a multiple of X but not a multiple of Y, or print −1 if it does not exist.
Sample Input 1
8 6
Sample Output 1
16
For example, 16 is a multiple of 8 but not a multiple of 6.
Sample Input 2
3 3
Sample Output 2
-1
A multiple of 3 is a multiple of 3.
这个是特判题的
输出一个数是x的倍数但并不是y的倍数
emmmm,模拟一下?不,a是b的倍数的话不存在,否则输出a就好了啊
#include<bits/stdc++.h> using namespace std; int main() {int x,y;cin>>x>>y;if (x%y==0)printf("-1");else printf("%d",x); }
给了16,所以我再猜最大公约数*a,太naive了,想了数据把自己hack了
话说直接暴力模拟就是直接在输出x
B - Two Arrays
Time limit : 2sec / Memory limit : 256MB
Score : 300 points
Problem Statement
You are given two integer sequences of length N: a1,a2,..,aN and b1,b2,..,bN. Determine if we can repeat the following operation zero or more times so that the sequences a and b become equal.
Operation: Choose two integers i and j (possibly the same) between 1 and N (inclusive), then perform the following two actions simultaneously:
- Add 2 to ai.
- Add 1 to bj.
Constraints
- 1≤N≤10 000
- 0≤ai,bi≤109 (1≤i≤N)
- All input values are integers.
Input
Input is given from Standard Input in the following format:
N a1 a2 .. aN b1 b2 .. bN
Output
If we can repeat the operation zero or more times so that the sequences a and b become equal, print Yes
; otherwise, print No
.
Sample Input 1
3 1 2 3 5 2 2
Sample Output 1
Yes
For example, we can perform three operations as follows to do our job:
- First operation: i=1 and j=2. Now we have a={3,2,3}, b={5,3,2}.
- Second operation: i=1 and j=2. Now we have a={5,2,3}, b={5,4,2}.
- Third operation: i=2 and j=3. Now we have a={5,4,3}, b={5,4,3}.
Sample Input 2
5 3 1 4 1 5 2 7 1 8 2
Sample Output 2
No
Sample Input 3
5 2 7 1 8 2 3 1 4 1 5
Sample Output 3
No
说是可以加任意次,但是你要让两个序列相等,最多次数就是sumb-suma,每次操作会让suma+2,sumb+1,相当于差少了1
然后去模拟让两个相等,需要分下奇偶。
#include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N],b[N]; int main() {int n;cin>>n;for(int i=0; i<n; i++)cin>>a[i];long long s=0;for(int i=0; i<n; i++)cin>>b[i],s+=a[i]-b[i];if(s>0)printf("No");else{long long ta=-s,tb=-s;for(int i=0; i<n; i++){if(a[i]>b[i])tb-=a[i]-b[i];else if(a[i]<b[i]){if((b[i]-a[i])&1)ta-=(b[i]-a[i])/2+1,tb--;else ta-=(b[i]-a[i])/2;}}if(2*ta==tb&&ta>=0&&tb>=0)printf("Yes");else printf("No");}return 0; }
当然ta,tb也可以省掉,我就是模拟这个次数就可以了
#include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N],b[N]; int main() {int n;cin>>n;for(int i=0; i<n; i++)cin>>a[i];long long s=0;for(int i=0; i<n; i++)cin>>b[i];for(int i=0; i<n; i++){if(a[i]>b[i])s-=a[i]-b[i];else s+=(b[i]-a[i])/2;}if(s>=0)printf("Yes");else printf("No");return 0; }
C - Vacant Seat
Time limit : 2sec / Memory limit : 256MB
Score : 500 points
Problem Statement
This is an interactive task.
Let N be an odd number at least 3.
There are N seats arranged in a circle. The seats are numbered 0 through N−1. For each i (0≤i≤N−2), Seat i and Seat i+1are adjacent. Also, Seat N−1 and Seat 0 are adjacent.
Each seat is either vacant, or oppupied by a man or a woman. However, no two adjacent seats are occupied by two people of the same sex. It can be shown that there is at least one empty seat where N is an odd number at least 3.
You are given N, but the states of the seats are not given. Your objective is to correctly guess the ID number of any one of the empty seats. To do so, you can repeatedly send the following query:
- Choose an integer i (0≤i≤N−1). If Seat i is empty, the problem is solved. Otherwise, you are notified of the sex of the person in Seat i.
Guess the ID number of an empty seat by sending at most 20 queries.
Constraints
- N is an odd number.
- 3≤N≤99 999
Input and Output
First, N is given from Standard Input in the following format:
N
Then, you should send queries. A query should be printed to Standart Output in the following format. Print a newline at the end.
i
The response to the query is given from Standard Input in the following format:
s
Here, s is Vacant
, Male
or Female
. Each of these means that Seat i is empty, occupied by a man and occupied by a woman, respectively.
Notice
- Flush Standard Output each time you print something. Failure to do so may result in
TLE
. - Immediately terminate the program when s is
Vacant
. Otherwise, the verdict is indeterminate. - The verdict is indeterminate if more than 20 queries or ill-formatted queries are sent.
Sample Input / Output 1
In this sample, N=3, and Seat 0, 1, 2 are occupied by a man, occupied by a woman and vacant, respectively.
Input | Output |
---|---|
3 | |
0 | |
Male | |
1 | |
Female | |
2 | |
Vacant |
C是个交互题,记得在每次输出后fflush(stdout);
#include<bits/stdc++.h> using namespace std; map<string,int>M; int x[999999]; int main() {M["Male"]=1;M["Female"]=0;int n;scanf("%d",&n);string s;cout<<0<<endl;fflush(stdout);cin>>s;if(s=="Vacant")return 0;int lval=M[s];cout<<n-1<<endl;fflush(stdout);cin>>s;if(s=="Vacant")return 0;int rval=M[s];int l=0,r=n-1;while(true){int mi=(l+r)/2;cout<<mi<<endl;fflush(stdout);cin>>s;if(s=="Vacant")return 0;int val=M[s];if(!((mi-l+1)%2&1)&&val==lval){r=mi;rval=val;}else if((mi-l+1)&1&&val!=lval){r=mi;rval=val;}else if(!((r-mi+1)%2)&&val==rval){l=mi;lval=val;}else if((r-mi+1)&1&&val!=rval){l=mi;lval=val;}}return 0; }
大神的牛逼代码
#include<iostream> using namespace std; string s,t; main() {int n,f,l,m;cin>>n;f=0;l=n;cout<<0<<endl;cin>>s;if(s=="Vacant")return 0;while(t!="Vacant"){m=(f+l)/2;cout<<m<<endl;cin>>t;if(m%2^s==t)f=m;else l=m;} }
D - Forest
Time limit : 2sec / Memory limit : 256MB
Score : 600 points
Problem Statement
You are given a forest with N vertices and M edges. The vertices are numbered 0 through N−1. The edges are given in the format (xi,yi), which means that Vertex xi and yi are connected by an edge.
Each vertex i has a value ai. You want to add edges in the given forest so that the forest becomes connected. To add an edge, you choose two different vertices i and j, then span an edge between i and j. This operation costs ai+aj dollars, and afterward neither Vertex i nor j can be selected again.
Find the minimum total cost required to make the forest connected, or print Impossible
if it is impossible.
Constraints
- 1≤N≤100,000
- 0≤M≤N−1
- 1≤ai≤109
- 0≤xi,yi≤N−1
- The given graph is a forest.
- All input values are integers.
Input
Input is given from Standard Input in the following format:
N M a0 a1 .. aN−1 x1 y1 x2 y2 : xM yM
Output
Print the minimum total cost required to make the forest connected, or print Impossible
if it is impossible.
Sample Input 1
7 5 1 2 3 4 5 6 7 3 0 4 0 1 2 1 3 5 6
Sample Output 1
7
If we connect vertices 0 and 5, the graph becomes connected, for the cost of 1+6=7 dollars.
Sample Input 2
5 0 3 1 4 1 5
Sample Output 2
Impossible
We can't make the graph connected.
Sample Input 3
1 0 5
Sample Output 3
0
The graph is already connected, so we do not need to add any edges.
#include<bits/stdc++.h> using namespace std; const int N=1e5+5,INF=0x3f3f3f3f; int a[N],fa[N],vis[N],mi[N]; pair<int,int>t; priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > >Q; int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x])); } int main() {ios::sync_with_stdio(false);int n,m;cin>>n>>m;for(int i=0; i<n; i++)cin>>a[i],fa[i]=i,mi[i]=INF;for(int i=0,u,v; i<m; i++){cin>>u>>v,u=find(u),v=find(v);if(u!=v)fa[u]=v;}for(int i=0; i<n; i++)find(i);for(int i=0; i<n; i++)mi[fa[i]]=min(a[i],mi[fa[i]]),Q.push(make_pair(a[i],fa[i]));sort(fa,fa+n);int tn=unique(fa,fa+n)-fa;if(tn==1)cout<<0;else{long long s=0;for(int i=0; i<tn; i++)s+=mi[fa[i]];while(!Q.empty()){if(tn==2)break;t=Q.top();Q.pop();if(!vis[t.second]){vis[t.second]=1;continue;}s+=t.first,--tn;}if(tn==2)cout<<s;else cout<<"Impossible";}return 0; }
特判下impossible速度并没有更快
#include<bits/stdc++.h> using namespace std; const int N=1e5+5,INF=0x3f3f3f3f; int a[N],fa[N],vis[N],mi[N]; typedef pair<int,int> pii; priority_queue<pii, vector<pii >, greater<pii > >Q; int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x])); } int main() {ios::sync_with_stdio(false);int n,m;cin>>n>>m;for(int i=0; i<n; i++)cin>>a[i],fa[i]=i,mi[i]=INF;for(int i=0,u,v; i<m; i++){cin>>u>>v,u=find(u),v=find(v);if(u!=v)fa[u]=v;}for(int i=0; i<n; i++)find(i);for(int i=0; i<n; i++)mi[fa[i]]=min(a[i],mi[fa[i]]),Q.push(make_pair(a[i],fa[i]));sort(fa,fa+n);int tn=unique(fa,fa+n)-fa;if(tn==1)cout<<0;else if((tn-1)*2>n)cout<<"Impossible";else{long long s=0;for(int i=0; i<tn; i++)s+=mi[fa[i]];while(!Q.empty()){if(tn==2)break;pii t=Q.top();Q.pop();if(!vis[t.second]){vis[t.second]=1;continue;}s+=t.first,--tn;}cout<<s;}return 0; }
优化不了了,最后的代码也很棒
#include<bits/stdc++.h> using namespace std; const int N=1e5+5,INF=0x3f3f3f3f; typedef pair<int,int> pii; int fa[N],vis[N],mi[N],V[N]; vector<pii >Q(N); int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x])); } int main() {ios::sync_with_stdio(false);int n,m,tn=0;cin>>n>>m;for(int i=0; i<n; i++)cin>>Q[i].first,fa[i]=i,mi[i]=INF;for(int i=0,u,v; i<m; i++){cin>>u>>v,u=find(u),v=find(v);if(u!=v)fa[u]=v;}for(int i=0; i<n; i++){find(i);if(!vis[fa[i]])V[tn++]=fa[i];vis[fa[i]]=1,Q[i].second=fa[i],mi[fa[i]]=min(Q[i].first,mi[fa[i]]);}if(tn==1)cout<<0;else if((tn-1)*2>n)cout<<"Impossible";else{long long s=0;for(int i=0; i<tn; i++)s+=mi[V[i]];if(tn!=2)sort(Q.begin(),Q.begin()+n);for(int i=0; i<n&&tn!=2; i++){if(vis[Q[i].second]){vis[Q[i].second]=0;continue;}s+=Q[i].first,tn--;}cout<<s;}return 0; }
E - Antennas on Tree
Time limit : 2sec / Memory limit : 256MB
Score : 900 points
Problem Statement
We have a tree with N vertices. The vertices are numbered 0 through N−1, and the i-th edge (0≤i<N−1) comnnects Vertex aiand bi. For each pair of vertices u and v (0≤u,v<N), we define the distance d(u,v) as the number of edges in the path u-v.
It is expected that one of the vertices will be invaded by aliens from outer space. Snuke wants to immediately identify that vertex when the invasion happens. To do so, he has decided to install an antenna on some vertices.
First, he decides the number of antennas, K (1≤K≤N). Then, he chooses K different vertices, x0, x1, ..., xK−1, on which he installs Antenna 0, 1, ..., K−1, respectively. If Vertex v is invaded by aliens, Antenna k (0≤k<K) will output the distance d(xk,v). Based on these K outputs, Snuke will identify the vertex that is invaded. Thus, in order to identify the invaded vertex no matter which one is invaded, the following condition must hold:
- For each vertex u (0≤u<N), consider the vector (d(x0,u),…,d(xK−1,u)). These N vectors are distinct.
Find the minumum value of K, the number of antennas, when the condition is satisfied.
Constraints
- 2≤N≤105
- 0≤ai,bi<N
- The given graph is a tree.
Input
Input is given from Standard Input in the following format:
N a0 b0 a1 b1 : aN−2 bN−2
Output
Print the minumum value of K, the number of antennas, when the condition is satisfied.
Sample Input 1
5 0 1 0 2 0 3 3 4
Sample Output 1
2
For example, install an antenna on Vertex 1 and 3. Then, the following five vectors are distinct:
- (d(1,0),d(3,0))=(1,1)
- (d(1,1),d(3,1))=(0,2)
- (d(1,2),d(3,2))=(2,2)
- (d(1,3),d(3,3))=(2,0)
- (d(1,4),d(3,4))=(3,1)
Sample Input 2
2 0 1
Sample Output 2
1
For example, install an antenna on Vertex 0.
Sample Input 3
10 2 8 6 0 4 1 7 6 2 3 8 6 6 9 2 4 5 8
Sample Output 3
3
For example, install an antenna on Vertex 0, 4, 9.
一颗树让你找最少k个点放监控,使得所有节点到这个节点的k维空间向量(无方向)两两不同
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; vector<int>G[N]; int n,dp[N],f=-1; void dfs(int i,int p) {int F=0;for(auto j:G[i]){if(j==p)continue;dfs(j,i);dp[i]+=dp[j];if(!dp[j]){if(!F)F=1;else dp[i]++;}} } int main() {scanf("%d",&n);for(int i=1,u,v; i<n; i++)scanf("%d%d",&u,&v),G[u].push_back(v),G[v].push_back(u);for(int i=0; i<n; i++)if(G[i].size()>2){f=i;break;}if(f==-1)printf("1\n");else dfs(f,-1),printf("%d\n",dp[f]);return 0; }
转载于:https://www.cnblogs.com/BobHuang/p/8413338.html
AtCoder Petrozavodsk Contest 001相关推荐
- Atcoder Beginner Contest 260D - Draw Your Cards 解题报告
Atcoder Beginner Contest 260D - Draw Your Cards 解题报告 1 题目链接 abc260_d 2 题目大意 题目 : 抽牌 题目大意 : 给定NNN个数字, ...
- 【每日亿题#12】AtCoder Grand Contest 021 (A ~ F)全部题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 AtCoder Grand Contest 021 题解 A. Digit Sum 2 B. ...
- AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...
- AtCoder Beginner Contest 197 题解(A ~ F)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...
- AtCoder Beginner Contest 198 (A ~ F)题解
目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...
- AtCoder Beginner Contest 215 G - Colorful Candies 2
AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...
- AtCoder Beginner Contest 215 F - Dist Max 2
AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi,yi),定义两点(xi,yi),(xj,yj)(x ...
- AtCoder Beginner Contest 215 E - Chain Contestant
AtCoder Beginner Contest 215 E - Chain Contestant 给出一个只包括A~J的字符串,定义一种子序列为:在这个子序列中,相同的字符必定连续出现,求出这样的子 ...
- AtCoder Beginner Contest 204 F Hanjo 2
AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...
最新文章
- 计算机专业推荐表自我介绍,就业推荐表-自我介绍
- php array colum,php5.5新数组函数array_column使用
- 数据库查询经常卡死?面对亿级大数据量,我是这么展示分析的
- python常用模块之requests
- Linux:is not in the sudoers file
- 关于laravel数据库问题
- layey图片内容不居中
- python中append,pop,extend,remove的区别
- MAVEN插件打包SNAPSHOT包MANIFEST.MF中Class-Path带时间戳的问题
- win10系统 计算机配置要求高吗,win10流畅配置要求有哪些
- like语法 mysql_mysql中like语法拼接4种方式
- kindle底层系统详细说明
- 普通人翻身的希望?揭秘“元宇宙”到底是个啥玩意!
- python 图标题上移_请问如何在这个Python中将标题一起爬下来啊
- Windows设置自动开关机
- 打印机服务器虚拟端口,Win7打印机服务器端口添加方法
- 采用计算机对酒店客房进行管理,酒店客房管理系统—计算机毕业设计论文.doc...
- Skipped,remains conflicted
- shopify 与国内第三方建站服务平台的比较(店匠、shopline、shopyy、ueeshop)
- Centos 7 matlab2018a安装及键盘无法输入的问题
热门文章
- VC++ OCX 控件注册
- 【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext
- 【linux】串口编程(三)——错误处理
- nmt模型源文本词项序列_「自然语言处理(NLP)」阿里团队--文本匹配模型(含源码)...
- php显示服务器文件,php-无法显示从新服务器下载文件的进度(在以前的服务器上工作)...
- Java学习总结:21
- NodeJS 使用redis实现定时执行方法
- Error:java: 无效的源发行版: 11
- Java中父类构造方法对子类构造方法的影响(不是一句话可以说清的)
- 通用权限管理系统组件 (GPM - General Permissions Manager) 权限管理以前我们都是自己开发,可是到下一个系统又不适用,又改,加上人员流动大,管理很混乱...