1. 程式人生 > >題解:NOI2017整數-線段樹

題解:NOI2017整數-線段樹

慶祝通過noip2018初賽,系列五題EP3.

題目背景

在人類智慧的山巔,有著一臺字長為10485761048576位(此數字與解題無關)的超級計算機,著名理論計算機科

學家P博士正用它進行各種研究。不幸的是,這天台風切斷了電力系統,超級計算機

無法工作,而 P 博士明天就要交實驗結果了,只好求助於學過OI的你. . . . . .

題目描述

P 博士將他的計算任務抽象為對一個整數的操作。

具體來說,有一個整數xx,一開始為00。

接下來有nn個操作,每個操作都是以下兩種型別中的一種:

  • 1 a b:將xx加上整數a\cdot 2^ba2b,其中aa為一個整數,bb為一個非負整數

  • 2 k :詢問xx在用二進位制表示時,位權為2^k2k的位的值(即這一位上的11代表 2^k2k)

保證在任何時候,x\geqslant 0x0。

輸入輸出格式

輸入格式:

 

輸入的第一行包含四個正整數n,t_1,t_2,t_3n,t1,t2,t3nn的含義見題目描述,t_1t1t_2t2t_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 21t13,1t24,1t32。不同的 t_1, t_2, t_3t1,t2,t3 對應的特殊限制如下:

  • 對於 t_1 = 1t1=1 的測試點,滿足 a = 1a=1

  • 對於 t_1 = 2t1=2 的測試點,滿足 |a| = 1a=1

  • 對於 t_1 = 3t1=3 的測試點,滿足 |a| \leqslant 10^9a109

  • 對於 t_2 = 1t2=1 的測試點,滿足 0 \leqslant b, k \leqslant 300b,k30

  • 對於 t_2 = 2t2=2 的測試點,滿足 0 \leqslant b, k \leqslant 1000b,k100

  • 對於 t_2 = 3t2=3 的測試點,滿足 0 \leqslant b, k \leqslant n0b,kn

  • 對於 t_2 = 4t2=4 的測試點,滿足 0 \leqslant b, k \leqslant 30n0b,k30n

  • 對於 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==-1return;
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==0return -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==0return;
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

BZOJ5457: 城市(線段合並)(尚待優化)

size EDA max bzoj turn dfs insert 優化 next 5457: 城市 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Disc

BZOJ5457: 城市(線段合併)(尚待優化)

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

HDU1540Tunnel 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

POJ3067Japan(線段)

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: