題解:NOI2017整數-線段樹
慶祝通過noip2018初賽,系列五題EP3.
題目背景
在人類智慧的山巔,有著一臺字長為10485761048576位(此數字與解題無關)的超級計算機,著名理論計算機科
學家P博士正用它進行各種研究。不幸的是,這天台風切斷了電力系統,超級計算機
無法工作,而 P 博士明天就要交實驗結果了,只好求助於學過OI的你. . . . . .
題目描述
P 博士將他的計算任務抽象為對一個整數的操作。
具體來說,有一個整數xx,一開始為00。
接下來有nn個操作,每個操作都是以下兩種型別中的一種:
-
1 a b
:將xx加上整數a\cdot 2^ba⋅2b,其中aa為一個整數,bb為一個非負整數 -
2 k
:詢問xx在用二進位制表示時,位權為2^k2k的位的值(即這一位上的11代表 2^k2k)
保證在任何時候,x\geqslant 0x⩾0。
輸入輸出格式
輸入格式:
輸入的第一行包含四個正整數n,t_1,t_2,t_3n,t1,t2,t3,nn的含義見題目描述,t_1t1,t_2t2,t_3t3的具體含義見子任務。
接下來nn行,每行給出一個操作,具體格式和含義見題目描述。
同一行輸入的相鄰兩個元素之間,用恰好一個空格隔開。
輸出格式:
對於每個詢問操作,輸出一行,表示該詢問的答案(00或11)。對於加法操作,沒有任何輸出。
輸入輸出樣例
輸入樣例#1: 複製10 3 1 2 1 100 0 1 2333 0 1 -233 0 2 5 2 7 2 15 1 5 15 2 15 1 -1 12 2 15輸出樣例#1: 複製
0 1 0 1 0
說明
在所有測試點中,1\leqslant t_1 \leqslant 3, 1 \leqslant t_2 \leqslant 4, 1 \leqslant t_3 \leqslant 21⩽t1⩽3,1⩽t2⩽4,1⩽t3⩽2。不同的 t_1, t_2, t_3t1,t2,t3 對應的特殊限制如下:
-
對於 t_1 = 1t1=1 的測試點,滿足 a = 1a=1
-
對於 t_1 = 2t1=2 的測試點,滿足 |a| = 1∣a∣=1
-
對於 t_1 = 3t1=3 的測試點,滿足 |a| \leqslant 10^9∣a∣⩽109
-
對於 t_2 = 1t2=1 的測試點,滿足 0 \leqslant b, k \leqslant 300⩽b,k⩽30
-
對於 t_2 = 2t2=2 的測試點,滿足 0 \leqslant b, k \leqslant 1000⩽b,k⩽100
-
對於 t_2 = 3t2=3 的測試點,滿足 0 \leqslant b, k \leqslant n0⩽b,k⩽n
-
對於 t_2 = 4t2=4 的測試點,滿足 0 \leqslant b, k \leqslant 30n0⩽b,k⩽30n
-
對於 t_3 = 1t3=1 的測試點,保證所有詢問操作都在所有修改操作之後
-
對於 t_3 = 2t3=2 的測試點,不保證詢問操作和修改操作的先後順序
本題共 25 個測試點,每個測試點 4 分。各個測試點的資料範圍如下:
解題思路:
我們可以把二進位制整數每30位壓在一個int裡面,然後進行加的操作時就是找到連續1後面的第一個0,再區間把1改成0,把第一個0改成1,
可以用區間or和區間and找出0,1的位置,並且可用線段樹維護
(慶祝通過noip2018第三題)
下面上程式碼:
1#include<bits/stdc++.h>
2#define N 1000005
3using namespace std;
4const int inf=(1<<30)-1;
5const int m=1000000;
6struct node{
7 int And,Or,lazy,val;
8}tree[N*4];
9int n,t,a,b,res,op,x,pos,loc;
10void read(){
11 cin >> n >> t >> t >> t;
12 for (int i=0;i<=4000000;i++)
13 tree[i].lazy=-1;
14}
15void Add(int p,int l,int r,int v){
16 tree[p].And=v;
17 tree[p].Or=v;
18 tree[p].lazy=v;
19}
20void pushdown(int p,int l,int r,int mid){
21 if (tree[p].lazy==-1) return;
22 Add(p<<1,l,mid,tree[p].lazy);
23 Add(p<<1|1,mid+1,r,tree[p].lazy);
24 tree[p].lazy=-1;
25}
26int query_ans(int p,int l,int r,int x){
27 if (l==r) return tree[p].And;
28 int mid=l+r >> 1;
29 pushdown(p,l,r,mid);
30 int res=0;
31 if (x<=mid)
32 res=query_ans(p<<1,l,mid,x); else
33 res=query_ans(p<<1|1,mid+1,r,x);
34 return res;
35}
36int find0(int p,int l,int r,int x){
37 if (tree[p].And==inf) return -1;
38 if (l==r) return l;
39 int mid=l+r >> 1;
40 pushdown(p,l,r,mid);
41 int res=0;
42 if (x<=mid){
43 res=find0(p<<1,l,mid,x);
44 res=~res?res:find0(p<<1|1,mid+1,r,x);
45 } else
46 res=find0(p<<1|1,mid+1,r,x);
47 return res;
48}
49int find1(int p,int l,int r,int x){
50 if (tree[p].Or==0) return -1;
51 if (l==r) return l;
52 int mid=l+r >> 1;
53 pushdown(p,l,r,mid);
54 int res=0;
55 if (x<=mid){
56 res=find1(p<<1,l,mid,x);
57 res=~res?res:find1(p<<1|1,mid+1,r,x);
58 } else
59 res=find1(p<<1|1,mid+1,r,x);
60 return res;
61}
62void modify(int p,int l,int r,int x,int y,int v){
63 if (l>=x&&r<=y){
64 Add(p,l,r,v);
65 return;
66 }
67 int mid=l+r >> 1;
68 if (l>r||l>y||r<x) return;
69 pushdown(p,l,r,mid);
70 if (x<=mid) modify(p<<1,l,mid,x,y,v);
71 if (y>mid) modify(p<<1|1,mid+1,r,x,y,v);
72 tree[p].And=tree[p<<1].And&tree[p<<1|1].And;
73 tree[p].Or=tree[p<<1].Or|tree[p<<1|1].Or;
74}
75
76void inc(int num,int pos){
77 if (num==0) return;
78 res=query_ans(1,0,m,pos)+num;
79 if (res>inf){
80 modify(1,0,m,pos,pos,res-inf-1);
81 int p=find0(1,0,m,pos+1);
相關推薦
題解:NOI2017整數-線段樹
慶祝通過noip2018初賽,系列五題EP3.
題目背景
在人類智慧的山巔,有著一臺字長為10485761048576位(此數字與解題無關)的超級計算機,著名理論計算機科
學家P博士正用它進行各種研究。不幸的是,這天台風切斷了電力系統,超級計算機
無法工作,而 P 博士明天就要交實驗結果了,只好求助於
【BZOJ4942】[Noi2017]整數 線段樹+DFS(卡過)
push 正常的 int 描述 printf turn n-1 如果 bzoj 【BZOJ4942】[Noi2017]整數
題目描述去uoj
題解:如果只有加法,那麽直接暴力即可。。。(因為1的數量最多nlogn個)
先考慮加法,比較顯然的做法就是將A二進制分解成lo
題解:CF115E(線段樹優化dp)
定義 可能 bit tput space nbsp sans odi bsp
題目描述
你是一個賽車比賽的組織者,想在線性王國中安排一些比賽。
線性王國有n條連續的從左到右的道路。道路從左到右依次編號為從1到n,因此道路按照升序排列。在這些道路上可能會有幾場比賽,每一場
noi2017 T1 整數 ——線段樹
mod 大於 答案 超級計算機 標準 nbsp i++ 研究 兩個
loj.ac上有 題目傳送門
不過我還是把題目搬過來吧
整數(integer)【題目背景】在人類智慧的山巔,有著一臺字長為 1048576 位的超級計算機,著名理論計算機科 學家 P 博士正用它進行各
luoguP1083 借教室(題解)(我用的線段樹)
push col \n div har printf clu pac flag luoguP1083 借教室 題目
#include<cstdio>
#include<iostream>
#include<cmath>
#include
BZOJ:5457: 城市(線段樹合並)(尚待優化)
size EDA max bzoj turn dfs insert 優化 next
5457: 城市
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Disc
BZOJ:5457: 城市(線段樹合併)(尚待優化)
5457: 城市
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Discuss]
Description
有n
Coursera普林斯頓大學演算法Week5: Kd-Trees 線段樹
本任務的PointSET比較好實現,借用給的Point2D API比較容易
而Kdtree任務比較複雜。主要是針對邊界問題比較複雜,需要分清待插入節點的父節點是位於偶數層還是位於奇數層,根據不同的層數具有不同的點比較方案。
private int compare(No
HDU1540:Tunnel Warfare(線段樹區間合併)
Problem Description
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north Chi
BZOJ4946[Noi2017]蔬菜——線段樹+堆+模擬費用流
can 固定 span make 鏈接 lap 新建 main 額外 題目鏈接:
[Noi2017]蔬菜
題目大意:有$n$種蔬菜,每種蔬菜有$c_{i}$個,每種蔬菜每天有$x_{i}$個單位會壞掉(準確來說每天每種蔬菜壞掉的量是$x_{i}-$當天這種蔬菜賣出量),
題解報告:hdu 1698 Just a Hook(線段樹lazy標記的運用)
http som height sum cup ive first 報告 original Problem Description
In the game of DotA, Pudge’s meat hook is actually the most horrible th
POJ3067:Japan(線段樹)
next __int64 write all return algo spa contains string.h
Description
Japan plans to welcome the ACM ICPC World Finals and a lot of road
CODEVS 1081 線段樹練習 2 題解
output lazy printf 區間修改 iostream getch spa turn 範圍 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:http://codevs.cn/problem/1081/
題目描述 Descri
BZOJ 1230 [Usaco2008 Nov]lites 開關燈:線段樹異或
題目 tdi geo += eof bzoj .com nbsp oid 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230
題意:
有n盞燈,一開始全是關著的。
有m次操作(p,a,b)。p為0,則將
解題報告:poj 3264 最基本的線段樹
線段樹 syn sin ++ cnblogs cstring pen main algo 2017-10-07 17:54:55
writer:pprp
/*
@theme: 最基本的線段樹
@writer:pprp
@end:17:38
@attention:記錄的數組
線段樹題解(3題)
integer pre contain 恰恰 sam 編號 更改 splay article
A - 敵兵布陣
C國的死對頭A國這段時間正在進行軍事演習,所以C國間諜頭子Derek和他手下Tidy又開始忙乎了。A國在海岸線沿直線布置了N個工兵營地,Derek和Tidy的
模板:線段樹
typedef long update void clas else tmp code build
1 typedef long long LL;
2 LL ans;
3
4 struct Tree
5 {
6 LL l,r;
7
【轉載】模板:線段樹
int pac 數據 pri note ont tag == else if 感謝勤奮的srf大蒟蒻!!
線段樹1
#include <bits/stdc++.h>
#define maxn 100000
#define LL long long
using
練習:線段樹+掃描線
const pda || mes stdin 遇到 技術分享 update space 題意
一個序列,每次給一段區間一些數,詢問每個點出現次數最多的數。
分析
掃描線,從左到右掃描,遇到區間的左端點,在權值線段樹(下標是數字種類)中相應的位置+1,右端點-1。操作完
洛谷3384:【模板】樹鏈剖分——題解
cnblogs html amp font ring con OS Go 最短 https://www.luogu.org/problemnew/show/P3384
如題,已知一棵包含N個結點的樹(連通且無環),每個節點上包含一個數值,需要支持以下操作:
操作1: