JZOJ__Day 9:【普及模拟】算法学习(sfxx)

题目描述

自从学习了动态规划后,Famer KXP对动态规划的热爱便一发不可收拾,每天都想找点题做,一天,他找到了一道题,但是不会做,于是,他找到了你。题目如下:
给出N个无序不重复的数,再有M个询问,每次询问一个数是否在那N个数中,若在,则ans增加2^K,K为该数在原数列中的位置。
由于ans过大,所以只要求你输出ans mod 10^9+7。

输入

第一行,两个数N,M,第二行N个数,第三行M个数。

输出

输出最终答案。

样例输入

5 5
1 3 4 6 5
1 8 1 3 6

样例输出

24

数据范围限制

30% 0< N,M<100
50% 0< N,M<10000
100% 0< N,M<100000
输入的数均在2^31 以内

分析
理论时间复杂度:N*logN*logN
正解:动态规划 (骗人的)
题目背景坑人的:
30%可以暴力拿到;
50%可以用二分查找或者快速幂其一得到;

正解为二分查找+快速幂。

程序:

var
a,p:array[0..100000]of int64;
i:longint;
n,m,ans,w,wz:int64;

function f(b1,p1,k1:longint):int64;
var
l,t,bz:int64;
i:longint;
a1:array[1..32]of longint;
begin
    l:=0;t:=p1;
    while t<>0 do
    begin
        inc(l);
        a1[l]:=t mod 2;
        t:=t div 2;
    end;
    bz:=1;
    for i:=l downto 1 do
    begin
        t:=bz*bz mod k1;
        if a1[i]=1 then bz:=b1 mod k1 *t mod k1 else bz:=t;
    end;
    exit(bz);
end;

procedure kp(l,r:longint);
var
i,j:longint;
mid:int64;
begin
    if l>=r then exit;
    i:=l;j:=r;mid:=a[(i+j) div 2];
    repeat
         while a[i]<mid do inc(i);
         while a[j]>mid do dec(j);
         if i<=j then
         begin
             a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
             p[0]:=p[i];p[i]:=p[j];p[j]:=p[0];
             inc(i);dec(j);
         end;
    until i>j;
    kp(l,j);
    kp(i,r);
end;

function search(k:int64):longint;
var
l,r,mid:int64;
begin
    l:=1;r:=n;
    mid:=(l+r) div 2;
    while (a[mid]<>k)and(l<=r) do
    begin
        if a[mid]>k then r:=mid-1 else l:=mid+1;
        mid:=(l+r) div 2;
    end;
    if l>r then exit(0);
    exit(mid);
end;


begin
    assign(input,'sfxx.in');
    reset(input);
    assign(output,'sfxx.out');
    rewrite(output);
    readln(n,m);
    for i:=1 to n do
    begin
        read(a[i]);
        p[i]:=i;
    end;
    kp(1,n);
    readln;
    ans:=0;
    for i:=1 to m do
    begin
        read(w);
        wz:=search(w);
        if wz>0 then ans:=ans+f(2,p[wz],1000000007);
    end;
    write(ans mod 1000000007);
    close(input);
    close(output);
end.
/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA8AKADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDU8L+GNAuPCejTTaHpkksljA7u9pGWZiikkkjkmrWr+BdC1DR7u0ttJ020nliKxzx2kYZG7HO31q54R/5E3Q/+wfb/APota2xQB478MItIlub3wvr2h6c+qWbsUee1jZ3UH5lJI5IPI9j6CvTR4Q8Nf9C7pP8A4BR//E1wPxR0S50nUbPxto42XNq6i5wOo6Kx9v4T7EV6L4d1u28RaHa6paH93OmSueUboyn3BoAjHhDwz/0Lukf+AUf/AMTTh4P8Mf8AQuaR/wCAMf8A8TWwKJJY4InllYIiAszHsBQBkjwd4Y/6FzSP/AGL/wCJp48HeF/+hb0f/wAAYv8A4mrMeuaVI7Imo2rMpKkCUHBGM/kSB9eOtaKMrjKsCPY0AY48G+F/+hb0f/wBi/8AiaePBnhb/oWtH/8AAGL/AOJqj4m8bab4ZULO4aUjIXIz1AwBnLE57ZwME4BGafhT4i6f4kvDbArG33VPJBbrjdgDp7DnjmgDcHgzwt/0LWj/APgDF/8AE08eC/Cv/QtaN/4ARf8AxNbQphuYFJBlTcFL7QcnaMZOPTkfnQBlDwV4V/6FnRv/AAAi/wDiacPBXhT/AKFnRv8AwAi/+JrYgmiuIUmhkSSJxlXRgVYeoI60+SWOCMySuqIOrMcCgDHHgnwp/wBCxov/AIARf/E04eCPCf8A0LGi/wDgBF/8TWlZajZahGJLO7hnQ9DG4b+X0P5VdFAGGPBHhP8A6FfRf/BfF/8AE04eB/CX/Qr6J/4L4v8A4mtwU8UAYQ8D+Ev+hW0T/wAF8X/xNY/jHwb4XtfA/iC4t/DejwzxabcPHJHYxKyMImIIIXIIPeu4FYfjj/kn3iT/ALBV1/6KagDkvCP/ACJmhf8AYPt//Ra1tisXwj/yJmhf9g+3/wDRa1tigCO6tIL6zmtLmMSQTIY5EPRlIwRXl0eheIvhY73uju+saE533VoV2yR/7YxntjJHpyOMj1gVyHiPxfLHrMfhfQEE+uXC8yMMxWi9S7+4HOPp6gEArv8AEBPENrbWXg8G41S7UlmlQhbJeheT3HYc5PrxnkfiprOo6fY6V4civprqYhTLOQA0rKcDIH+1g/h3rpY/hSNPubO/0TX7zT9TQH7Tc7RILgnkkoSB17cjHvzXmHxPg1mx8VR/2pfRXU6Rq0c8MXlZ7525ODkdqANHR/hPrupaYuoW18kcjZKBiRuHUHP1ruPBNj4i8JadqS6wXKKCyPIS65AJyMZOMZJ6ZOBXmul6r4/0XTPttot+NOhJLMVLRgZ3flz+tdFJ8VL7XvD09rc6U0jQqGuJY2AAX156fPt/KgDO0e3fxd4sutT1IGWCFiFE/CDnq/PQf3R1PAwBgc3rnleH/Gn2nS5dscUyyRFTgrjGcgdO/A6dKTw9rV5bXUdpa2gnuZLjfskYfPxwpJGRhsngjk07xfousWN4txq5UTTBWVPMLEbhnGSO3TvzQB6r8Qvidc6XBY2mmMwuLiBZXYEcBh7rnPvx9K4a5k8YQaMuqXdw6RH96kZByFIxvQ9vQgdjjocVzUSz6nq1gLq75O1EZdq7QOmPyxn1r1TxV4IitfBkV/NqGr3eEyi3V38qscbVVAMDOSD9KAOi+GnjC3utMkfUryztWJzIHdY1ZsA7xuIPI6/h+PI/Ff4lpqLLo2h3itbjPnTQyZV/QZH5+xArjvD8mkWvhDVNTudKgubmJ1gi8xd2zcSQ5B4PYV1PwptPDCw3l7qeoWLai22S3t5GVCrDJwoPfPGBQByfwz1dNH8ZW1zMLuSNATsto2kdvYKOucmvoQfEC6n4sfBXiaY9jNaLAp/Fm/pXinwvYr8VxE2BvleXI9Bk/wAjX1EKAOKHiPx1c8W3gWO3B6Pd6rGP/HVBNOH/AAs657eFrFD6+fM4/kK7UU8UAV9NjvItOgTUZoprxUAmkiTYrN3IHYVm+OP+SfeJf+wVdf8Aopq3RWF45/5J94l/7BV1/wCimoA5Pwj/AMiZoX/YPt//AEWtbYrF8If8iZoX/YPt/wD0WtbYoA5Lxv4yTw7ZLZ6eFudcumEVrbJ8zBj/ABMPTkYHfj3qXwJ4P/4Rqwkub5/tGtXp8y8uGO45PO0H0B/M/hjivA0Sa58YvEeruokS1aRYmPODu2KR/wABVvzr2MUAKK8n+NnhyW+srXWLdOLSNxOfUZXb/wCzV6yKJYIriFopkV43GGVhkEUAea+AvEei6p8Pl02/uoophCY7hWOOMlFP5BTXl/h63e/8V6nbJAktreyMs8CPtKoWL5B7BSoz7fWu78S/BIS3Rn8PXXkIwAMMpyAcYOD74z+Jrovh58Ml8KySXuoSx3F433cDhBgg898gmgDxyyjj8LeIDPf2MkyKoVwTg7yu113Dhc5ZlPJ4X1NQeK/EV94u1fzEifyz91VXbuORuYgcdl/75HfmvpLUvBmkarJvnibdyMZypUjlSOhXPPPIPQiqth8O9EsriGZYVYxHIV0V93AGCWBPGMggg9skcUAeH+LvDT+GhoV9cpObadY/McdU2qA6gHByeTyPT3r0LXfFdnrXw2KCSEykFpjFJuMcgjMmV9hNsGOflJ+o9D8R+GNO8S6I+mXkCmLH7vb8pQjpg9q8lsfgdqMd35U14rWqyKTlzhlAyeB6tgdsDJ64oAh+G3gKLxF4ekhvGngtJXlaVQv+t+VFTnoCrCU/itX9U/Z8jW0eTTdZfzkTOyaLIY4HcdP4vXtXsGh6JaaDp8dpaIAFUKzkDc55JJx6ksfTk4xWoKAPjOG013w54sktLF2XVbSQxhoDnPbjPUEGvrXwdNqU/hTT5NYSVNQMWZxKu1t2e4rg9b+Dpu/Fqa/puqeUzzeZPDKhO4FskBh/skgcdhXrCZ2jdjPfFADhTxTRTxQA4VheOf8AknviX/sFXX/opq3hWF45/wCSe+Jf+wVdf+imoA5Pwh/yJehf9g63/wDRa1pahdrp+l3d6/3beF5Tn0VSf6V4Bpvxi8Q6Xplpp8FnpjRWsKQoXikLFVUKM4cc4FM1b4v+IdY0i602e102OG5jMTtFHIGCnrjLkfpQB3XwNs2GharqUmS91dBCx6nYuc/m5r1YV8z+G/ijrXhbRY9LsLPTnhRmbfNG5diTnkhwPbp2rX/4Xp4n/wCfDSP+/Mv/AMcoA+hBTxXzz/wvbxP/AM+Gkf8AfmX/AOOUv/C9/FH/AD4aP/35l/8AjlAH0QKeK+df+F8+KP8Anw0f/vzL/wDHKX/hfXin/nw0f/vzL/8AHKAPosU8V85f8L88U/8APho3/fmX/wCOUv8Awv3xV/0D9G/78y//ABygD6PFPFfN3/C//FX/AED9G/78y/8Axyl/4aB8V/8AQP0X/vzL/wDHKAPpIU8V81/8NBeK/wDoH6L/AN+Zf/jlL/w0J4s/6B+i/wDfmX/45QB9LCnivmj/AIaF8W/9A7RP+/Mv/wAco/4aH8W/9A7RP+/Ev/xygD6ZFPFfMv8Aw0R4u/6B2if9+Jf/AI7S/wDDRXi7/oHaJ/34l/8AjtAH04KwvHP/ACT3xL/2Crr/ANFNXgP/AA0X4v8A+gdof/fiX/47VTVvj34p1jRr7S7iw0ZYLy3kt5GjhlDBXUqSMyEZwfQ0Af/Z
最新发布
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值