第五周训练总结(一)
2017-09-28 20:38
232 查看
第十六题:
题目大意:一个长度为L的区间,最多有T种颜色,并且有O种操作,接下去有o行。一共就两种操作:1、C
a b c:表示的是将【a,b】这个区间染成颜色c。 2、P a b :表示的是询问【a,b】这个区间有多少种颜色。
思路:
这个题目做了两天才有了眉目,线段树区间更新,维护一个区间的颜色种类数就行了,由于只有30种颜色,可以考虑位操作,用一个int来表示。
这个题目需要注意的是不能一直更新到最下面,就更新到符合的区间即可,否则会超时。
买票的问题:
题目大意:
给定每个人插队时的位置及他们的号码,然后判断他们最终的位置。
解题思路:
由于最后插入的人的位置一定是固定的,(因为后面不会再有人把他向后挤),所以将这个人位置排好后,在确定下一个人的位置前把这个已排好的位置“丢掉”。这样对于插入到第i个位置,即搜索第i+1个空位。
#include <stdio.h>
int p[200005];
int v[200005];
int ans[200005];
struct Node
{
int l,r,num;
}tree[1000000];
void Build(int n,int x,int y)
{
tree
.l = x;
tree
.r = y;
tree
.num = (y - x + 1);
int mid = (x + y) / 2;
if(x == y){
return;
}
Build(2*n,x,mid);
Build(2*n+1,mid+1,y);
}
void Modify(int n,int p,int v)
{
int l = tree
.l;
int r = tree
.r;
int mid = (l + r) / 2;
if(l == r){
tree
.num = 0;
ans[l] = v;
return;
}
if(tree[2*n].num >= p)
Modify(2*n,p,v);
else
Modify(2*n+1,p - tree[2*n].num,v);
tree
.num = tree[2*n].num + tree[2*n+1].num;
}
int main()
{
int n;
int i;
while(scanf("%d",&n) != EOF)
{
Build(1,1,n);
for(i = 0;i < n;i++){
scanf("%d%d",&p[i],&v[i]);
}
for(i = n - 1;i >= 0;i--){
Modify(1,p[i]+1,v[i]);
}
for(i = 1;i < n;i++){
printf("%d ",ans[i]);
}
printf("%d\n",ans
);
}
return 0;
}
感觉这周的状态好了一些,没啥乱七八糟的事,能静下心来看题。还是做的很慢,自己还是要抓紧。
题目大意:一个长度为L的区间,最多有T种颜色,并且有O种操作,接下去有o行。一共就两种操作:1、C
a b c:表示的是将【a,b】这个区间染成颜色c。 2、P a b :表示的是询问【a,b】这个区间有多少种颜色。
思路:
这个题目做了两天才有了眉目,线段树区间更新,维护一个区间的颜色种类数就行了,由于只有30种颜色,可以考虑位操作,用一个int来表示。
这个题目需要注意的是不能一直更新到最下面,就更新到符合的区间即可,否则会超时。
买票的问题:
题目大意:
给定每个人插队时的位置及他们的号码,然后判断他们最终的位置。
解题思路:
由于最后插入的人的位置一定是固定的,(因为后面不会再有人把他向后挤),所以将这个人位置排好后,在确定下一个人的位置前把这个已排好的位置“丢掉”。这样对于插入到第i个位置,即搜索第i+1个空位。
#include <stdio.h>
int p[200005];
int v[200005];
int ans[200005];
struct Node
{
int l,r,num;
}tree[1000000];
void Build(int n,int x,int y)
{
tree
.l = x;
tree
.r = y;
tree
.num = (y - x + 1);
int mid = (x + y) / 2;
if(x == y){
return;
}
Build(2*n,x,mid);
Build(2*n+1,mid+1,y);
}
void Modify(int n,int p,int v)
{
int l = tree
.l;
int r = tree
.r;
int mid = (l + r) / 2;
if(l == r){
tree
.num = 0;
ans[l] = v;
return;
}
if(tree[2*n].num >= p)
Modify(2*n,p,v);
else
Modify(2*n+1,p - tree[2*n].num,v);
tree
.num = tree[2*n].num + tree[2*n+1].num;
}
int main()
{
int n;
int i;
while(scanf("%d",&n) != EOF)
{
Build(1,1,n);
for(i = 0;i < n;i++){
scanf("%d%d",&p[i],&v[i]);
}
for(i = n - 1;i >= 0;i--){
Modify(1,p[i]+1,v[i]);
}
for(i = 1;i < n;i++){
printf("%d ",ans[i]);
}
printf("%d\n",ans
);
}
return 0;
}
感觉这周的状态好了一些,没啥乱七八糟的事,能静下心来看题。还是做的很慢,自己还是要抓紧。
相关文章推荐
- 2017开学训练第五周周中总结
- 2017开学训练第五周周末总结
- 第五周工作总结
- 专业技能训练总结
- 山东省第七届ACM大学生程序设计竞赛 训练总结 [8/12] 待补
- ACM训练周末总结—11月5日
- 实习第五周总结(2013.08.12-2013.08.18)
- 20162306 2016-2017-2《程序设计与数据结构》第五周学习总结
- 12.1 省选训练总结
- 华为机试训练做题总结(三)
- 20162313苑洪铭 2017-2018-1 《程序设计与数据结构》第五周学习总结
- 第五周信息安全系统设计基础学习总结 20135306 黄韧
- Linux内核分析第五周学习总结:扒开系统调用的三层皮(下)
- 训练总结7.31
- 第十五周训练总结(一)
- 12.8 省选训练总结3(1) DP
- 2014专题训练之动态规划总结
- 2017/8/25 训练总结(最终版QAQ)
- 2016.11.19日限时训练总结
- GDOI模拟赛round 1(4.11~13)训练总结