[GXOI/GZOI2019]与或和(单调栈)

想了想决定把这几题也随便水个解题报告...

bzoj  luogu

思路:

首先肯定得拆成二进制30位啊

此后每一位的就是个01矩阵

Q1就是全是1的矩阵个数

Q2就是总矩阵个数减去全是0的矩阵个数

玉蟾宫警告

就是单调栈乱搞对吧

本题完结

事实上有了思路其他的都是多余的对吧所以就不要介意代码了

 1 #include<cstdio>
 2 #define mo 1000000007
 3 const int N=1011;
 4 template<typename tp>inline void read(tp &tar)
 5 {
 6     tp ret=0,f=1;char ch=getchar();
 7     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 8     while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
 9     tar=ret*f;
10 }
11 int n,ai[N][N],a1[N][N],a0[N][N];
12 int ans1,ans0;
13 int sta1[N],sta0[N];
14 int main()
15 {
16     read(n);
17     for(int i=1;i<=n;i++)
18     {
19         for(int j=1;j<=n;j++)
20         {
21             read(ai[i][j]);
22         }
23     }
24     for(int k=0,o=1;k<31;k++,o<<=1)
25     {
26         for(int i=1;i<=n;i++)
27         {
28             for(int j=1;j<=n;j++)
29             {
30                 if(ai[i][j]&o)
31                     a1[i][j]=a1[i-1][j]+1,a0[i][j]=0;
32                 else
33                     a0[i][j]=a0[i-1][j]+1,a1[i][j]=0;
34             }
35         }
36         for(int i=1;i<=n;i++)
37         {
38             int hop1=0,hop0=0,tmp1=0,tmp0=0;
39             for(int j=1;j<=n;j++)
40             {
41                 tmp1+=a1[i][j];
42                 while(hop1&&a1[i][j]<a1[i][sta1[hop1]])
43                 {
44                     tmp1+=(sta1[hop1]-sta1[hop1-1])*(a1[i][j]-a1[i][sta1[hop1]]);
45                     hop1--;
46                 }
47                 ans1=(ans1+((1ll*tmp1)<<k)%mo)%mo;
48                 sta1[++hop1]=j;
49                 tmp0+=a0[i][j];
50                 while(hop0&&a0[i][j]<a0[i][sta0[hop0]])
51                 {
52                     tmp0+=(sta0[hop0]-sta0[hop0-1])*(a0[i][j]-a0[i][sta0[hop0]]);
53                     hop0--;
54                 }
55                 ans0=(ans0+((1ll*(i*j-tmp0))<<k)%mo)%mo;
56                 sta0[++hop0]=j;
57             }
58         }
59     }
60     printf("%d %d\n",ans1,ans0);
61     return 0;
62 }
我又被卡常了啊啊啊

 

转载于:https://www.cnblogs.com/rikurika/p/gxoi2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
OSZAR »