[Codeforces #190] Tutorial
Link:
A:
明显答案为$n+m-1$且能构造出来
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
int n,m; int main()
{
scanf("%d%d",&n,&m);
printf("%d\n",n+m-);
for(int i=;i<=m;i++)
printf("1 %d\n",i);
for(int i=;i<=n;i++)
printf("%d 1\n",i);
return ;
}
Problem A
B:
我是采取对余数分类讨论的方式
但如果余数为0,2,2且原数中恰好有一个0时要特判!因此WA了一次……
不过完全可以通过采取其他方法来避免这个问题:
暴力枚举散装分别为0,1,2时的总个数即可
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
int r,g,b,tr,tg,tb,res; int main()
{
scanf("%d%d%d",&r,&g,&b);
res+=r/;res+=g/;res+=b/;
tr=r;tg=g;tb=b;
r%=;g%=;b%=;
if(r>g) swap(r,g);
if(r>b) swap(r,b);
if(g>b) swap(g,b); if(r==) res++;
else if(r==) res+=;//如果%3=0的值原来就是0不能增加!
else if(r==&&g==&&b==&&tr&&tg&&tb) res++;
printf("%d",res);
return ;
}
Problem B
C:
此题只要对第一次循环中的所有位置判断能否通过整的循环到达终点即可
不过有2点要注意:1、特判整循环最终$X,Y$为0的情况 2、循环数非负
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
const int INF=<<;
P cur,sum,T;char s[]; void move(P &v,int pos)
{
if(s[pos]=='U') v.Y++;
if(s[pos]=='D') v.Y--;
if(s[pos]=='L') v.X--;
if(s[pos]=='R') v.X++;
}
int main()
{
scanf("%d%d%s",&T.X,&T.Y,s);
if(T==P(,)) return puts("Yes"),; int len=strlen(s);bool f=;
for(int i=;i<len;i++) move(sum,i);
for(int i=;i<len;i++)
{
move(cur,i);//可能mod出-1,因此初始值设为INF
int mx=INF,my=INF,cx=INF,cy=INF;
if(sum.X) mx=(T.X-cur.X)%sum.X,cx=(T.X-cur.X)/sum.X;
if(sum.Y) my=(T.Y-cur.Y)%sum.Y,cy=(T.Y-cur.Y)/sum.Y;
if(mx==INF&&my==INF&&cur==T){f=;break;}
if(mx==INF&&cur.X==T.X&&!my&&cy>=){f=;break;}
if(my==INF&&cur.Y==T.Y&&!mx&&cx>=){f=;break;}
if(!mx&&!my&&cx==cy&&cx>=){f=;break;}
}
puts(f?"Yes":"No");
return ;
}
Problem C
这题一开始都WA了一次……
原因是判断整循环的$X,Y$为0时是用余数的初始值是否为-1来判断的
但实际上余数结果本来就可能是-1从而和初始值冲突
以后对余数设初始值时要注意设为$INF$这样不可能达到的值……
D:
很容易的贪心,发现只要考虑两种情况:
1、只攻击$ATK$
2、将$DEF$和$ATK$都攻击完
将3个序列都排序后
对于情况1,每次用最大的攻击$ATK$最小的,直到不能攻击为止必是最优解
对于情况2,先用尽可能接近的攻击完$DEF$,接下来只要能将$ATK$都打完结果就是两个序列和的差
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
#define pb push_back
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
const int MAXN=;
char s[MAXN];
int n,m,x;
vector<int> atk,def,dat; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s%d",s,&x);
if(s[]=='A') atk.pb(x);
if(s[]=='D') def.pb(x);
}
for(int i=;i<=m;i++) scanf("%d",&x),dat.pb(x);
sort(dat.begin(),dat.end());
sort(atk.begin(),atk.end());
sort(def.begin(),def.end()); int res1=,res2=,sum1=,sum2=;bool f=;
for(int i=;i<atk.size()&&i<dat.size();i++)
if(dat[m-i-]>=atk[i]) res1+=dat[m-i-]-atk[i];
else break;
for(int i=(int)def.size()-;i>=;i--)
{
vector<int>::iterator it=upper_bound(dat.begin(),dat.end(),def[i]);
if(it==dat.end()){f=;break;}
dat.erase(it);
}
int sz=dat.size();
if(sz<atk.size()) f=;
for(int i=;i<sz;i++) sum1+=dat[i];
for(int i=;i<atk.size();i++) sum2+=atk[i];
for(int i=(int)atk.size()-;i>=;i--)
{
vector<int>::iterator it=lower_bound(dat.begin(),dat.end(),atk[i]);
if(it==dat.end()){f=;break;}
dat.erase(it);
} res2=f?sum1-sum2:;
printf("%d",max(res1,res2));
return ;
}
Problem D
注意在情况2的第二个阶段不能采取和情况1相同的方法
因为此时的目标是将$ATK$都打完,因此应和攻击$DEF$时采取的方法一样:贪心选取第一个更大的数
E:
构造题
一般在树上构造考虑两种方式:
1、从底到上(对应此题为点分治的方法)
2、从顶至下(从叶子节点向上递归)
方法1:
发现如果将一个节点设为$A$,那么剩下的子树都变成了独立的问题,只不过不能再出现$A$
因此考虑将第$i$层点分治的树根设为$A+i$,这样保证有解因为$log(1e5)<26$
方法2:
考虑从叶子节点向上递归构造
每次向上传递该点的值和该子树中比根大的值,因为比根小的明显不用考虑了
选择时将儿子上传的值合并,选取比出现2次大的第一个没有出现的值
其实就是不合法的值分类后去除:
1、点对在两个不同儿子且值更大(因此选取比出现2次大的)
2、该点本身和子树中一个较大的值组成点对(因此选取为出现过的)
注意在返回时要将比选取值小的个数清零,因为后面不用考虑了
这样保证使用个数不超过26的正确性可以用势能法证明,然而我并不会
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
struct edge{int nxt,to;}e[MAXN<<];
int n,x,y,head[MAXN],cnt[MAXN][],res[MAXN],tot; void add(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;}
void dfs(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dfs(e[i].to,x);
for(int j=;j<;j++)
cnt[x][j]+=cnt[e[i].to][j];
}
int pos1=,pos2=;
for(int i=;i<;i++)
if(cnt[x][i]>=){pos1=i;break;}
for(int i=pos1-;i>=;i--)
if(!cnt[x][i]){pos2=i;break;}
cnt[x][pos2]=;res[x]=pos2;
for(int i=pos2+;i<;i++) cnt[x][i]=;
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs(,);
for(int i=;i<=n;i++)
printf("%c ",'A'+res[i]);
return ;
}
Problem E
[Codeforces #190] Tutorial的更多相关文章
- [Codeforces #172] Tutorial
Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...
- [Codeforces #514] Tutorial
Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...
- [Codeforces #210] Tutorial
Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- [Codeforces #174] Tutorial
Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...
- [Codeforces #211] Tutorial
Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...
- [Codeforces #192] Tutorial
Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...
- [Codeforces #201] Tutorial
Link: 传送门 代码量很少的一套思维题 A: 试一试发现最后状态一定是所有$min,max$间$gcd$的倍数 直接判断数量的奇偶性即可 #include <bits/stdc++.h> ...
- [Codeforces #188] Tutorial
Link: Codeoforces #188 传送门 A: 先全转为正数,后面就全是指数级增长了 #include <bits/stdc++.h> using namespace std; ...
随机推荐
- 【BZOJ】2190 [SDOI2008]仪仗队
[算法]欧拉函数 欧拉线性筛 [题解]将图从左至右,从下至上,分别标号0~n-1. 除了坐标0,一个点会被观察到当且仅当其坐标(i,j)的i与j互质,否则会被(i/d,j/d)挡住. 所以累加2~n- ...
- .net XmlHelper xml帮助类
using System.Data; using System.IO; using System.Xml; using System.Xml.Serialization; /// <summar ...
- linux 下 /bin /sbin 的区别 -- (转)
/bin,/sbin,/usr/bin,/usr/sbin区别 / : this is root directory root 用户根目录 /bin : command ...
- hdu 1081 To The Max(dp+化二维为一维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others ...
- Android中TextView设置字体
最近项目中出现把字体设置成宋体,微软雅黑,黑体,楷体等的需求; 度娘发现Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace",除此之外还可以使 ...
- Android 聊天软件客户端
1.代码架构图 2.qq.model层 3.qq.app层 4.qq.Constatnt层 5.qq.util层 6.qq.broadcast层 7.qq.control层 8.qq.view层 9. ...
- 2017多校第6场 HDU 6105 Gameia 博弈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6105 题意:Alice和Bob玩一个游戏,喷漆!现在有一棵树上边的节点最开始都没有被染色.游戏规则是: ...
- CSS中cursor属性给标签加上小手形状
HTML/CSS 2012-08-10 CSS,标签 我们发现a标签在网页中有一个值得注意的地方,即鼠标移到a标签上光标会变成一只小手的图标,移出a标签后又恢复为默认箭头. 如今,JS在网页中的功能越 ...
- cookies保存购物车数据的编码问题(pickle和base64)
在保存cookies时,如果存在着中文字符,cookies保存会报错.所以需要对数据进行编码. 通常cookies的保存都是以Base64来保存.所以先要对数据编码成bytes,再编码成base64字 ...
- IEDA自动清除无用的import
Before After Step 快捷键展示格式化对话框:ctrl + shift + alt + l 格式化快捷键:ctrl + alt + l <wiz_tmp_tag id= ...