POJ 2886 线段树单点更新
转载自:http://blog.csdn.net/sdj222555/article/details/6878651
反素数拓展参照:http://blog.csdn.net/ACdreamers/article/details/25049767
题目大意就是一群熊孩子做游戏,第一个出队的人是编号为k的人。此后出队的人就是按照前一个人手里的编号。如果是正数+m就是这个人的左边的第m个人。如果是负数-m,就是 这个人的右边第m个人。由于这个人出队了。对下一个人有影响,所以+m的时候,是k+m-1。-m的时候是k+m。因为是他后边的人所以没有影响。因为可能出现负数和0的情况,所以就有下面的取模时的处理。线段树的每个节点保存的是这个区间还有多少个位置。所以每次更新时,如果左孩子节点的空位够了,搜索左孩子,否则搜索右孩子。可以建树参照对样例模拟一下。
还不懂怎么打反素数表。所以是cooy的。
附代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; #define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define N 500010 int tree[N<<]; const int antiprime[] = { // 反素数表
,,,,,,,,,,,,,,,
,,,,,,,,,
,,,,,,,,
,,,,
}; const int factorNum[] = { // 对应的约数个数
,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
,,,
}; struct child{ // 保存输入时的节点信息
char name[];
int val;
}c[N]; void Build(int l, int r, int rt) { // 建树
tree[rt] = r-l+;
if (l == r)
return;
int m = (l+r)>>;
Build(lson);
Build(rson);
} int Update(int p, int l, int r, int rt) { // 第p个人出去。Update函数可以理解。
tree[rt]--;
if (l == r)
return r;
int m = (l+r)>>;
if (p<=tree[rt<<])
return Update(p, lson);
else return Update(p-tree[rt<<], rson);
} int main() {
int i, n, &mod = tree[];
// mod 保存的就是一共有多少个人、
int k; while(~scanf("%d%d", &n, &k)) {
// 输入建树
for (i=; i<=n; ++i) {
scanf("%s%d", c[i].name, &c[i].val);
}
Build(, n, ); // 小于等于n的最大的反素数。
int cnt = ;
while(cnt < && antiprime[cnt] <= n) {
cnt++;
}
cnt--;
// 先找到1-n范围内的约束个数最大的数。 // pos是记录当前位置该出队的人的ID
int pos = ;
c[pos].val = ; // 找antiprime[cnt]出队的人的名字、
for (i=; i<antiprime[cnt]; ++i) { // 循环的次数就是直到这个人出队。 // 这两个if是根据 这个人手里牌的编号来推算下一个出队列的人的当前位置、
if (c[pos].val > )
k = ((k+c[pos].val-)%mod+mod)%mod+;
else k=((k+c[pos].val-)%mod+mod)%mod+; // pos 记录的是当前循环出队的人的所在位置、
pos = Update(k, , n, );
cout << pos << "====\n";
}
printf("%s %d\n", c[pos].name, factorNum[cnt]);
}
return ;
}
POJ 2886 线段树单点更新的更多相关文章
- poj 2828(线段树单点更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 18561 Accepted: 9209 Desc ...
- POJ 2828 (线段树 单点更新) Buy Tickets
倒着插,倒着插,这道题是倒着插! 想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0. 从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的 ...
- poj 2886 线段树的更新+反素数
Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , ...
- POJ 2828 线段树单点更新 离线搞
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)
Brainman Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10575 Accepted: 5489 Descrip ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
随机推荐
- 20145122《Java程序设计》第七周学习总结
教材学习内容总结 1.在只有Lambda表达式的情况下,参数的类型必须写出来. 2.Lambda表达式本身是中性的,同样的Lambda表达式可用来表示不同目标类型的对象操作. 3.Lambda表达式只 ...
- Duilib 控件类html富文本绘制
转载:http://blog.csdn.net/wyansai/article/details/51088896 转载:http://blog.csdn.net/lixiang987654321/ar ...
- DD-WRT自定义脚本更新花生壳DDNS
N年以前买了一个tp-link 841n v7,一直用的还算可以吧,除了不定期重启路由器,不然网速慢的龟爬啊!这也是TP原厂固件的通病,于是刷了DD-WRT,话说DD确实很爽,除了功能强大之外,而且很 ...
- 【基础配置】Dubbo的配置及使用
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- [TODO]The way to Go(9): 基本类型和运算符
参考: Github: Go Github: The way to Go 基本类型和运算符 表达式是一种特定的类型的值,它可以由其它的值以及运算符组合而成. 每个类型都定义了可以和自己结合的运算符集合 ...
- The way to Go(5): 文件名、关键字与标识符
Reference: Github: Go Github: The way to Go 文件名 1.后缀名:.go 2.小写字母 3._分割名称 4.不包含空格或其他特殊字符 标识符 有效的标识符必须 ...
- 【TCP/IP详解 卷一:协议】第四章 ARP:地址解析协议 以及其他部分的一些知识
4.1 引言 数据链路 如以太网(Ethernet) 或者 令牌环网 都有自己的寻址机制(一般为 48 bit 的地址). 一个网络(数据链路层) 可以同时被多个不同的网络使用.比如,一组使用TCP/ ...
- python 字节与字符串转化
name = 'laogaoyang' # 采用系统默认编码格式 nameBytes = name.encode('utf-8') # 先将 name 解码(采用系统默认格式),然后用 'utf-8' ...
- Kali Linux下常用软件安装及配置
0x00 Synaptic Synaptic(新立得)是一个高级软件包管理器,它可以管理系统内安装的每个软件及包组件,在图形界面内完成LINUX系统软件的搜寻.安装和删除. Synaptic安装简单, ...
- iOS进阶_Socket(Socket简介&代码演练)
网络通讯三要素 TCP & UDP 三次握手 断开连接的四次握手 Socket套接字 了解了上面的概念,我们开始演练一下Socket #import "ViewController. ...