高精度 題解 洛谷P2104 二進位制

2021-08-27 18:42:31 字數 2494 閱讀 5341

維護乙個

n n

位二進位制數,支援:

最後的結果(二進位制)

n<=5∗

106' role="presentation" style="position: relative;">n

<=5∗

106n<=5∗

106sb模擬自然可以寫,但顯然最壞o(

n2) o(n

2)

分析一下,乘除好搞,但加減麻煩:

然後我考試時就用二分+線段樹維護了一下,tle+mle。。

#include

#include

#define gt() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?eof:*p1++)

#define pt(ch) (top<1000000?st[top++]=ch:(fwrite(st,1,1000000,stdout),st[(top=0)++]=ch))

#define ls lson[x]

#define rs rson[x]

#define in inline

using

namespace

std;

int top;static

char st[1000000],buf[1000000],*p1=buf,*p2=buf;

const

int maxn=(1e7)+35,k=30;

int n,q;bool a[maxn];

struct ff;

struct segmenttree

in void updata(int x)

in void down(int x)

in void build(int x,int l,int r));

c[x]=(ff);

build(ls,l,c[x].mid),build(rs,c[x].mid+1,r);

updata(x);

}in void modify(int x,int l,int r,int data)

in int query(int x,int l,int r)

}g;int main()

else

if(ch=='+')

g.modify(1,l-1,l-1,1),g.modify(1,l,tal,0);

if(l-1

1; }

}else

g.modify(1,l-1,l-1,0),g.modify(1,l,tal,1);}}

ch=gt();

// for(int i=hed;i<=tal;i++) pt(g.query(1,i,i)+'0');pt('\n');

}for(int i=hed;i<=tal;i++) a[i]=g.query(1,i,i);

while(!a[hed]&&hedfor(int i=hed;i<=tal;i++) pt(a[i]+'0');pt('\n');

fwrite(st,1,top,stdout);

return

0;}

然後我當時是sb啊!!!

我竟然沒想到可以將所有標記疊到最後乙個一起搞!!!

把操作直接標在最後一位上,加法就+1,減法就-1

如果除法導致這一位失效了,那麼就把標記往前推

然後就變成乙個精細點的模擬了。。注意邊界情況(不要除過頭)

複雜度o(n

) o(n

)

#include

#define gt() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?eof:*p1++)

#define pt(ch) (top<1000000?st[top++]=ch:(fwrite(st,1,1000000,stdout),st[(top=0)++]=ch))

using namespace std;

int top;static char st[1000000],buf[1000000],*p1=buf,*p2=buf;

const int maxn=(1e7)+5;

int n,q,a[maxn];

int main()

if(a[n]>0) a[n-1]+=(a[n]>>1);

else a[n-1]-=(-a[n]>>1)+(-a[n]&1);

n--;

}ch=gt();

}for(int i=n;i;i--) if(a[i]>0) a[i-1]+=(a[i]>>1),a[i]&=1;else a[i-1]-=(-a[i]>>1)+(-a[i]&1),a[i]=-a[i]&1;

for(int i=1;i<=n;i++) pt(a[i]+'0');pt('\n');

fwrite(st,1,top,stdout);

return

0;}

洛谷 P1633 二進位制

我去考fop zz的 結果他真的秒掉了 我們考慮三個長度為l的串 顯然如果這3個串符合條件的話 我們就只要保證增加2 l級別的值滿足加法原則就好了 所以我們大力dp f i a b c 0 1 i表示位數 a表示x串前i 1個字元所有的1的數量 b,c同理 0 1表示c串在第i位是1還是0 預處理 ...

洛谷P1582 倒水 二進位制

一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...

洛谷P2456 二進位制方程

題目 字串模擬 並查集 建立兩個並查集分別存放每個變數的每一位數的祖先,乙個是1乙個是2 考慮每個字母的每一位的數都是唯一的,先模擬,記錄每乙個變數的每一位。一一對映到方程中去,最後將兩個方程進行一一比較,然後合併並查集。中間判斷是否出現一位既是1又是2的情況 最後統計自由元的個數cnt,高精求解2...