BZOJ 4216 Pig 分块乱搞

题意:id=4216">链接

方法:分块以节约空间。

解析:

这题坑的地方就是他仅仅有3M的内存限制,假设我们开longlong前缀和是必死的。

所以考虑缩小这个long long数组的大小。

然后想到分块

最好还是以15为大小进行分块,事实上不T再大一点也行,可是算内存的话15是差点儿相同的吧。

然后记录每一个块内的和,然后询问的时候整块直接拿,非整块暴力枚举。顶多30个点。

所以时间上能过,然后内存上也就2.6MB左右。能够过。

可是有个问题啊,千万别打using namespace std;

这个执行自己主动申请700kb内存。太坑辣!

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500005
#define M 33335
#define K 16
typedef long long ll;
int a[N];
ll sum[M];
int n,m,jd,blockl,blockr,cntblock,l,r;
ll ans;
void calc(int l,int r)
{
    blockl=l>>4;
    blockr=r>>4;
    ans+=sum[blockr-1]-sum[blockl];
    for(int i=l;i>>4==blockl&&i>0&&i<=n;i++)
    {
        ans+=a[i];
    }
    for(int i=r;i>>4==blockr&&i>0&&i<=n;i--)
    {
        ans+=a[i];
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&jd);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum[i>>4]+=a[i];
    }
    cntblock=n>>4;
    for(int i=1;i<=cntblock;i++)sum[i]+=sum[i-1];
    for(int i=1;i<=m;i++)
    {
        if(ans<0)ans=-ans;
        scanf("%d%d",&l,&r);
        if(jd)
        {
            l=(l^ans)%n+1;
            r=(r^ans)%n+1;
            if(l>r)
                l^=r^=l^=r;
        }
        ans=0;calc(l,r);
        printf("%lld\n",ans);
    }
}
时间: 2024-12-15 15:17:35

BZOJ 4216 Pig 分块乱搞的相关文章

【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)

4148: [AMPPZ2014]Pillars Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 100  Solved: 49 Description 给定一个n*m的矩形,其中有f个2*2的障碍物,其中任意两个障碍物中心之间的欧几里得距离至少为6, 且每个障碍物的中心到边缘的距离至少为3.请找到一条从左下角(1,1)出发经过所有没有障碍物的点各 一次的且最后回到左下角的回路. Input 第一行包含三个整数n,

【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954 Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][Discuss] Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

Codeforces 732e [贪心][stl乱搞]

/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变压器供应. 问最多能使得多少个插座与电脑匹配,使得电压一致. 如果有多种方案,输出需要变压器总数最小的那种. 输出匹配数量 输出每个插座需要接多少个变压器.输出每台电脑匹配哪个插座. 思路: 贪心 乱搞 先从小到大将插座排序,然后从地第一个插座开始,不断除以2上取整.不断找是否可以匹配.找到匹配就停

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

Bucharest, Romania 2013 H Red John Game 乱搞 未解

题意:给你一个无限的棋盘,里面有n×n的棋子,每个棋子可以跳过一个相邻(4个方向)棋子跳到下一个位置,并把他的相邻位(他跳过的那一位)删除. 解题思路:判断n%3 是否等于 0 , 原因未知. 解题代码: 1 #include<stdio.h> 2 int main(){ 3 int n ; 4 while(~scanf("%d",&n)) 5 { 6 if(n%3) 7 printf("1\n"); 8 else printf("0\

【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Status][Discuss] Description 文章是一些单词组成的序列,单词由字母组成.你的任务是将一篇文章的单词填充到一个网格中,其中网格包含W列和足够多的行.为了布局之美,以下限制都需要满足. 1.文章中的文字需要按照原有的顺序放置.下图表示了将4个单词的文章“This is a pen”放入

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &