Codeforces Round #200 (Div. 1) BCD
为了锻炼个人能力奋力div1 为了不做原题从200开始
B 两个电线缠在一起了 能不能抓住两头一扯就给扯分开
很明显当len为odd的时候无解 当len为偶数的时候 可以任选一段长度为even的相同字符串给它翻过去 即 ++--++++--++ -> ++--------++ -> ++++++++++++
一直这样下去一定可以翻出结果 但是复杂度很高 不能暴力的去找
考虑用一个栈 依次往里放 每次看到top等于当前的这个字符 意义是当前有一个偶数了 便pop出来 最后判断栈的empty
做完B的我十分欣慰 感觉这样练下去应该提升真的不小
C 磁盘调度算法 读取不花时间 n个磁头 m个地点 划过就算读入了 可以多个磁头一起随便移动 问最少多少时间所有的地点都能被划过
最小化最大值问题 考虑二分一下maxtime 然后枚举磁头来check 对于当前剩余的地点序列 我这个磁头从左到右最远可以读到哪儿
就是做一个类似于双指针的check 磁头的指针后跳 那么地点的指针可能也往后跳 看看最后地点的指针有没有跳完
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define L long long
#define pb push_back
#define ph push
#define lala printf(" --------- \n") ;
#define rep(i, a, b) for (L i=a;i<=b;++i)
#define dow(i, b, a) for (L i=b;i>=a;--i)
#define fmt(i,n) if(i==n)printf("\n");else printf(" ") ;
#define lro ro*2
#define rro ro*2+1
#define fi first
#define se second
template<class T> inline void flc(T &A, L x){memset(A, x, sizeof(A));}
L read(){L x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
L n , m ;
L a[100050] ;
L b[100050] ; bool check(L time) {
L last = 1 ;
rep(i,1,n){
if(b[last] <= a[i]) {
L xd = a[i] - b[last] ;
if(time < xd) {
return false ;
}
L yy = (time - xd) / 2 ;
L where1 = a[i] + yy ; L xd2 = time - (a[i] - b[last]) ;
L where2 = (xd2 + b[last]) ;
L where = max(where1 , where2) ;
while(b[last] <= where) {
last ++ ;
}
if(last > m) return true ;
}
else {
L where = a[i] + time ;
while(b[last] <= where) {
last ++ ;
}
if(last > m) return true ;
}
}
return false ;
} int main () {
n = read() ;
m = read() ;
rep(i,1,n) a[i] = read() ;
rep(i,1,m) b[i] = read() ;
L l = 0 ;
L r = 30000000000 ;
L res = 0 ;
while(l <= r) {
L mid = (l + r) / 2 ;
if(check(mid)) {
r = mid - 1 ;
res = mid ;
}
else {
l = mid + 1 ;
}
}
printf("%I64d\n" , res) ;
}
写完C1A了..asuka一脸迷茫 这个C明显比B简单的样子...那个年代的cf有点奇怪的说...
虽然开专题准备做div1BC 但是注意到D好像比C过的还多 于是做一下D
D 一个树 3个操作 op1 把一个点和他的子树群体置1 op2 把一个点和他的直系先辈群体置0 op3 查询一个点的值
dfs序标一下号 建立两个线段树来维护op1和op2
op1 线段树区间更新单点查询 由于val递增 其实不需要lazy标记
op2 线段树单点更新区间维护最大值 查询的意义是一个点的子树区间内谁最后被op2了
op3 对两个线段树询问 比一下谁最大
可能..做久远一点的CF idea都被用惯了 可能还是在做原题啊...
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define L long long
#define pb push_back
#define ph push
#define lala printf(" --------- \n") ;
#define rep(i, a, b) for (int i=a;i<=b;++i)
#define dow(i, b, a) for (int i=b;i>=a;--i)
#define fmt(i,n) if(i==n)printf("\n");else printf(" ") ;
#define lro ro*2
#define rro ro*2+1
#define fi first
#define se second
template<class T> inline void flc(T &A, int x){memset(A, x, sizeof(A));}
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;} int n , qnum ;
vector<int>q[500050] ;
int cnt ;
int l[500050] , r[500050] ;
int id[500050] ;
void dfs(int u , int fa) {
cnt ++ ;
l[u] = cnt ;
int siz = q[u].size() ;
rep(i,0,siz-1){
int v = q[u][i] ;
if(v==fa)continue ;
dfs(v,u) ;
}
r[u] = cnt ;
}
int last[500000 * 4] ;
int last2[500000 * 4] ;
/// --- op 1
void build() {
flc(last,0);
flc(last2,0);
}
int ans1 ;
void query(int ro,int l,int r,int pos) {
ans1 = max(ans1,last[ro]);
int mid=(l+r)/2;
if(l==r)return ;
if(pos<=mid)query(lro,l,mid,pos);
else query(rro,mid+1,r,pos);
}
void upda(int ro,int l,int r,int ul,int ur,int val) {
if(l>=ul&&r<=ur){
last[ro]=val;
return;
}
int mid=(l+r)/2;
if(ul<=mid)upda(lro,l,mid,ul,ur,val);
if(ur>=mid+1)upda(rro,mid+1,r,ul,ur,val);
}
/// --- op 2
int query2(int ro,int l,int r,int ul,int ur) {
if(l>=ul&&r<=ur){
return last2[ro];
}
int ans=0;
int mid=(l+r)/2;
if(ul<=mid) ans = max(ans,query2(lro,l,mid,ul,ur)) ;
if(ur>mid) ans = max(ans , query2(rro,mid+1,r,ul,ur)) ;
return ans ;
}
void upda(int ro,int l,int r,int pos,int val) {
if(l==r) {
last2[ro] = val ;
return ;
}
int mid=(l+r)/2;
if(pos<=mid) upda(lro,l,mid,pos,val);
else upda(rro,mid+1,r,pos,val);
last2[ro]=max(last2[lro],last2[rro]) ;
}
/// --- op 3 int solve(int x) {
ans1 = 0 ;
query(1,1,n,l[x]) ;
int ans2 = query2(1,1,n,l[x],r[x]) ;
if(ans1 == 0 && ans2 == 0) {
printf("0\n") ;
}
else {
if(ans1 > ans2) printf("1\n") ;
else printf("0\n") ;
}
} int main () {
n = read();
rep(i,1,n) q[i].clear() ;
rep(i,1,n-1) {
int u=read();
int v=read() ;
q[u].pb(v);
q[v].pb(u);
}
cnt = 0 ;
dfs(1,-1) ;
build() ;
qnum = read();
rep(i,1,qnum) {
int op = read() ;
int x = read() ;
if(op == 1) {
upda(1,1,n,l[x],r[x],i) ;
}
else if(op == 2) {
upda(1,1,n,l[x],i) ;
}
else {
solve(x) ;
}
}
}
Codeforces Round #200 (Div. 1) BCD的更多相关文章
- Codeforces Round #200 (Div. 1)A. Rational Resistance 数学
A. Rational Resistance Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343 ...
- Codeforces Round #200 (Div. 1)D. Water Tree dfs序
D. Water Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343/problem/ ...
- Codeforces Round #200 (Div. 1) C. Read Time 二分
C. Read Time Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343/problem/C ...
- Codeforces Round #200 (Div. 1) B. Alternating Current 栈
B. Alternating Current Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343 ...
- Codeforces Round #200 (Div. 2) C. Rational Resistance
C. Rational Resistance time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #200 (Div. 2)D. Alternating Current (堆栈)
D. Alternating Current time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)
思路: dfs序其实是很水的东西. 和树链剖分一样, 都是对树链的hash. 该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值. 该题需要注意的是:当我们对一棵子树全都赋值为1的 ...
- Codeforces Round #200 (Div. 2) E. Read Time(二分)
题目链接 这题,关键不是二分,而是如果在t的时间内,将n个头,刷完这m个磁盘. 看了一下题解,完全不知怎么弄.用一个指针从pre,枚举m,讨论一下.只需考虑,每一个磁盘是从右边的头,刷过来的(左边来的 ...
- Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
随机推荐
- CentOS系统bash: groupadd: command not found问题
如果我们需要在CentOS执行新建用户组命令的时候,需要进入到ROOT权限,如果你用以下命令: 1 su2 su root 进入到ROOT账户,那么会出现上述的错误信息:“bash: groupadd ...
- Storm 集群安装
http://archive.apache.org/dist/storm/ 版本都在这 本人安装的是 其他版本的自行安装吧,估计都差不多 sudo mkdir /export/serverssudo ...
- 从“关于Java堆与栈的思考”一帖看错误信息的传播
我对转贴的信息一直有敌意,原因如下:首先,除了制造更多的信息垃圾,转贴不会带来新的价值,想收藏的话一个链接足矣:其次,将错误信息以讹传讹,混淆视听.不妨选一个典型的例子说明一二. 相信<关于Ja ...
- nginx配置文件解析工具
最近花了一些时间自己实现解析nginx配置文件的功能,这里有个工具先记下以后用. https://github.com/nginxinc/crossplane
- Android系统移植与调试之------->build.prop生成过程分析
本文简要分析一下build.prop是如何生成的.Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编 ...
- linux虚拟机能ping通windows主机,windows主机ping不通linux虚拟机的解决办法
分三步: 1.虚拟机网络连接方式选择Nat
- boost之智能指针
内存问题永远是c++中讨论的重要话题 1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效 #include <iostrea ...
- (转)js获取内网ip地址,操作系统,浏览器版本等信息
这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...
- zabbix-2.4.8-1添加MySQL主从状态监控
1.安装zabbix-agentyum -y install zabbix-2.4.8-1.el6.x86_64.rpm zabbix-agent-2.4.8-1.el6.x86_64.rpm 安装以 ...
- Ubuntu输入su命令提示认证失败的解决办法
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许执行"su命令到root".对于桌面用户而言,这样可以提高安全性.但对于服务器可以设置成允许"su命 ...