懶得粘題面了…..
我最開始打了三個小時的表,發現了一件神奇的事情:[1
,k] [1,
k]內的「好的」數對的數量是有規律可循的(這個規律極其複雜)!所以每個區間內的「好的」數對的數量就是a[
ri]−
a[li
−1] a[r
i]−a
[li−
1],然後我就愉快地切過此題啦!
這當然是很*****的錯解。乙個數對如果橫跨兩個區間,那怎麼減?
打表留念:
當把某一位上的1異或掉的時候,1的總個數會減少2個。
如果要得到奇數個1,那麼x和y的1的總個數加起來必須是奇數,這樣無論抵消掉多少個1,最後的答案中1的個數也是奇數。所以x,y中只要乙個是奇數,乙個是偶數就可以滿足要求。
打表可得:當
k k
為奇數的時候,[1
,k]' role="presentation">[1,
k][1
,k]內有奇數個
1 1
的數字個數為(k
+1)/
2' role="presentation">(k+
1)/2
(k+1
)/2;當
k k
為偶數時,[1
,k−1
]' role="presentation">[1,
k−1]
[1,k
−1]內的奇數個數為k/
2 k/2
,再特判一下
k k
即可。最後線段樹維護區間的並,查詢時只用查詢1號線段的答案。
注意被完全覆蓋過的線段要做標記。
**
#include
#include
#define n 4001000
#define ll long long
using
namespace
std;
ll bitcnt(ll x)
ll find(ll x)
ll odd[n],even[n],lson[n<<4],rson[n<<4],tot;
void add(ll p,ll x,ll y)
bool mark[n];
void ins(ll &p,ll l,ll r,ll x,ll y)
ll mid=l+r>>1ll;
ins(lson[p],l,mid,x,y);
ins(rson[p],mid+1,r,x,y);
odd[p]=odd[lson[p]]+odd[rson[p]];
even[p]=even[lson[p]]+even[rson[p]];
}int main()
return
0;}
奧數 找規律 總結
時間限制 1 sec 記憶體限制 128 mb 提交 78 解決 3 提交 狀態 討論版 輸入兩個正整數a,b 1 求在a與b之間的所有正整數 含a,b 中數字d出現的次數 第一行乙個數t 1 t 10000 接下來 t 行每行由 a b d 三個數組成 輸出這組資料a與b之間所有正整數中數字d出現...
劍指offer 醜數(找規律)
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。醜數的序列為 每個醜數都是前面某乙個醜數乘上2 3 5的結果。所以新加入的醜數必然是從原有醜數中與2,3,5乘積中最小的值...
hdu 5047 大數找規律
找規律信kuangbin,能ac include include include include include include include include include include include include using namespace std 完全大數模板 輸出cin a 輸出...