标签:emc log while 前缀 read stdin return 变量 垃圾
今天的题是去年考过的,\(cb\)依旧很垃圾\(QAQ\)。
前缀和
我们先将左上角的点看作\((1,1)\),右下角的点看作\((n,m)\),那么有\(\displaystyle \sum_{i=1}^{n} \sum_{j=1}^{m} d[i][j] = \frac{m \times n \times (n+m)}{2}\),自己手推下。就有了
那么\(Ans\)就是前缀和中的问题。
\(Ans=sum[x_2][y_2]+sum[x_1-1][y_1-1]-sum[x_1][y_2]-sum[x_2][y_1-1]\)
但是计算乘法时会爆\(long\;long\),可以用高精,也可以用龟速乘(好像是个这名)
单纯的计算好像有\(70\;pts\).
int x1,y,x2,y2,m;
inline int mul(int n, int m, int p){
int a=n,ans=0;
for(;m;m>>=1){
if(m&1) ans=(ans+a)%p;
a=(a*2)%p;
}
return ans;
}
inline int power(int x,int y,int m){
int sum=x+y;
if(~x&1) x>>=1;
else if(~y&1) y>>=1;
else sum>>=1;
return mul(mul(x,y,m),sum,m);
}
signed main(){
freopen(File".in","r",stdin);
freopen(File".out","w",stdout);
x1=read(); y=read();
x2=read(); y2=read(); m=read();
printf("%lld",(power(x2,y2,m)-power(x1-1,y2,m)-power(x2,y-1,m)+power(x1-1,y-1,m)+2*m)%m);
return 0;
}
先打了个暴力,发现大样例过不了。
然后想到了二分,又想暴力加区间会炸掉,于是又用了倍增。
关键是二分,我瞎调了调居然过了,
复杂度为\(O(n \log^2 n)\),应该是吧。。。
int a[maxn],b[maxn];
int aa[maxn],bb[maxn];
int n,M;
inline bool check(int x,int len){//判断为是否合法区间
int y=x+len-1;
for(int i=x;i<=y;i++) aa[i]=a[i],bb[i]=b[i];
sort(aa+x,aa+y+1); sort(bb+x,bb+y+1);
int res=0;
for(int i=x;i<=y;i++) res+=aa[i]*bb[i];
return res<=M;
}
inline int solve(){
int QAQ=0,qwq=1;//请忽略,不知该起什么变量名
while(qwq<=n){
int len=1;
for(;check(qwq,len)&&qwq+len-1<=n;len*=2);//倍增
int l=len>>1,r=min(len-1,qwq+len-1);
while(l<r){//二分
int mid=(l+r+1)>>1;
if(check(qwq,mid)) l=mid;
else r=mid-1;
}
qwq+=l; QAQ++;
}
return QAQ;
}
signed main(){
freopen(File".in","r",stdin);
freopen(File".out","w",stdout);
n=read(); M=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read();
printf("%d",solve());
return 0;
}
蒟蒻不会删边,于是只输出了\(-1\),\(QAQ\)
但好像有\(15\;pts\),真良心。
\[ The \quad End \]
\[ \text{楼台上戏子和衣吟唱,一曲画堂春;不如就携手隐没红尘,相对忘贫生-《画堂春》} \]
标签:emc log while 前缀 read stdin return 变量 垃圾
原文地址:https://www.cnblogs.com/cbyyc/p/11619322.html