HDU 6274 二分+预处理(CCPC K题

 1 #include"bits/stdc++.h"
 2 #define db double
 3 #define ll long long
 4 #define vec vector<ll>
 5 #define Mt  vector<vec>
 6 #define ci(x) scanf("%d",&x)
 7 #define cd(x) scanf("%lf",&x)
 8 #define cl(x) scanf("%lld",&x)
 9 #define pi(x) printf("%d\n",x)
10 #define pd(x) printf("%f\n",x)
11 #define pl(x) printf("%lld\n",x)
12 using namespace std;
13 const int N   = 1e6 + 5;
14 int a[N],b[N],s[1010][1010],n; //s[x][y]表示对于所有a[i]==x时的b[i]%a[i]余数大于等于y的数目
15 ll ret;
16 bool check(ll x,ll k)
17 {
18     ll ans=ret*-1;
19     for(int i=1; i<=1000; i++)
20     {
21         ans+=x/i*s[i][0]; //s[i][0]为a数组中等于i的数的个数
22         ans-=s[i][x%i+1];  //减掉所有 c1<c2 的情况
23     }
24     return ans>=k;
25 }
26 ll cal(ll x)
27 {
28     ll l=1,r=1e13,mid;
29     ll res=l;
30     while(l<=r)
31     {
32         mid=(l+r)>>1;
33         if(check(mid,x)) res=mid,r=mid-1;
34         else l=mid+1;
35     }
36     return res;
37 }
38 int main()
39 {
40     int TA,T,x,y,z;
41     scanf("%d",&TA);
42     while(TA--)
43     {
44         scanf("%d%d",&n,&T);
45         ret=0;
46         memset(s,0, sizeof(s));
47         for(int i=1; i<=n; i++) scanf("%d",&a[i]);
48         for(int i=1; i<=n; i++) scanf("%d",&b[i]),ret+=(b[i]/a[i]),s[a[i]][b[i]%a[i]]++;
49         for(int i=1; i<=1000; i++)
50             for(int j=i-1; j>=0; j--)
51                 s[i][j]+=s[i][j+1];
52         while(T--)
53         {
54             scanf("%d%d",&z,&x);
55             if(z==1)
56             {
57                 scanf("%d",&y);
58                 for(int i=b[x]%a[x]; i>=0; i--) s[a[x]][i]--;
59                 for(int i=b[x]%y; i>=0; i--)    s[y][i]++;
60                 ret-=(b[x]/a[x]);
61                 ret+=(b[x]/y);
62                 a[x]=y;
63             }
64             else if(z==2)
65             {
66                 scanf("%d",&y);
67                 for(int i=b[x]%a[x]; i>=0; i--) s[a[x]][i]--;
68                 for(int i=y%a[x]; i>=0; i--)    s[a[x]][i]++;
69                 ret-=(b[x]/a[x]);
70                 ret+=(y/a[x]);
71                 b[x]=y;
72             }
73             else
74             {
75                 printf("%lld\n",cal(1ll*x));
76             }
77         }
78     }
79 }

猜你喜欢

转载自www.cnblogs.com/mj-liylho/p/9382887.html
今日推荐