維護乙個
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...