贞鱼传教&&贞鱼传教(数据加强版)

http://acm.buaa.edu.cn/problem/1381/

贞鱼传教
【问题描述】 
新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教。说干就干......
贞鱼哥把即将接受传教的人排成一行,每个人从左到右的编号为1-n。每个人有一个信仰值,一开始所有人的信仰值为0。接着贞鱼哥会做以下两件事之一: 
1.贞鱼哥向连续的一段人群传教。具体来说,贞鱼哥会使第l个人到第r个人之间的所有人的信仰值增加k。 
2.贞鱼哥想知道某一段人的信仰值之和,于是他想找他的同桌DZY来帮忙,但是DZY要求他放出JY,才肯帮忙,贞鱼哥只好放了JY。具体来说,贞鱼哥会问DZY第l个人到第r个人之间所有人的信仰值之和。 
然而之前已经无数次介绍:DZY智商低下,太笨了!于是他想找帮过他多次大忙的计算机大神WJC来帮忙,但是WJC去相亲了,所以他找到了机智的你。 
【输入格式】 
第一行包含两个整数n,m。分别表示接受传教的人数以及贞鱼哥的操作数。 
接下来m行,每行包含若干个整数。若第一个整数为1,则代表贞鱼哥在进行传教,这一行接下来会包含l,r,k三个整数。否则第一个整数为2,代表贞鱼哥的一个询问,这一行接下来会包含l,r两个整数。 
【输出格式】 
输出若干行,每行包含1个整数,表示贞鱼哥询问的答案。行数为贞鱼哥的询问数量。 
【样例输入】 
5 5 
2 1 2 
1 4 4 2 
1 2 4 7 
1 4 5 6 
2 3 4 
【样例输出】 

22 
【样例说明】 
一开始所有人的信仰值都为0,所以答案为0。到第五个操作时,五个人的信仰值分别为0,7,7,15,6。则答案为7+15=22
【数据范围】 
对于30%测试点,n,m<=10,0<l<=n,0<r<=n,0<k<=10; 
对于60%测试点,n,m<=10^2,0<l<=n,0<r<=n,0<k<=10; 
对于100%测试点,n,m<=10^3,0<l<=n,0<r<=n,0<k<=10; 
命题人:Hacker_WJC

一看题目果断想到线段树区间更新,区间查询。写了一发。照着模板调了一会(好弱)过了

/* ***********************************************
Author        :buaaasd
Created Time  :2016/1/23 19:48:00
File Name     :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 100000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

bool cmp(int a,int b){
    return a>b;
}
struct node{
    int l,r;
    ll sum;
    ll c;
}nod[maxn*4];
void push_up(int i){
    nod[i].sum=nod[i<<1].sum+nod[i<<1|1].sum;
}
void push_down(int i){
    if(nod[i].c){
        nod[i<<1].c+=nod[i].c;
        nod[i<<1|1].c+=nod[i].c;
        nod[i<<1].sum+=(ll)(nod[i<<1].r-nod[i<<1].l+1)*nod[i].c;

        nod[i<<1|1].sum+=(ll)(nod[i<<1|1].r-nod[i<<1|1].l+1)*nod[i].c;
        nod[i].c=0;
    }
}
void build(int i,int l,int r){
    nod[i].l=l;
    nod[i].r=r;
    nod[i].c=0;
    if(l==r){
        nod[i].sum=0;
        return ;
    }
    int mid=(l+r)/2;
    build(i<<1,l,mid);
    build(i<<1|1,mid+1,r);
    push_up(i);
}
void update(int i,int l,int r,ll w){
    if(nod[i].l==l&&nod[i].r==r){
        nod[i].c+=w;
        nod[i].sum+=(r-l+1)*w;
        return ;
    }
    if(nod[i].l==nod[i].r)return ;
    push_down(i);
    int mid=(nod[i].l+nod[i].r)/2;
    if(r<=mid)update(i<<1,l,r,w);
    else if(l>mid)update(i<<1|1,l,r,w);
    else{
        update(i<<1,l,mid,w);
        update(i<<1|1,mid+1,r,w);
    }
    push_up(i);
}
ll query(int i,int l,int r){
    if(nod[i].l==l&&nod[i].r==r){
        return nod[i].sum;
    }
    push_down(i);
    int mid=(nod[i].l+nod[i].r)/2;
    ll ans=0;
    if(r<=mid)ans+=query(i<<1,l,r);
    else if(l>mid)ans+=query(i<<1|1,l,r);
    else {
        ans+=query(i<<1,l,mid);
        ans+=query(i<<1|1,mid+1,r);
    }
    push_up(i);
    return ans;
}
int main()
{
    #ifndef ONLINE_JUDGE
    //freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    int n,m;
    int x,y,z,w;
    while(cin>>n>>m){
        build(1,1,n);
        for(int i=1;i<=m;i++){
            scanf("%d",&x);
            if(x==1){
                scanf("%d%d%d",&y,&z,&w);
                update(1,y,z,w);
            }
            else{
                scanf("%d%d",&y,&z);
                printf("%lld\n",query(1,y,z));
            }
        }
    }
    return 0;
}

贞鱼传教(数据加强版)http://acm.buaa.edu.cn/problem/1382/

贞鱼传教
【问题背景】 
计算机大神 Hacker_WJC 发现原先的题目:贞鱼传教连智商低下的DZY都能做出来,于是加强了数据,23333333333333333333333~
【问题描述】 
新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教。说干就干......
贞鱼哥把即将接受传教的人排成一行,每个人从左到右的编号为1-n。每个人有一个信仰值,一开始所有人的信仰值为0。接着贞鱼哥会做以下两件事之一: 
1.贞鱼哥向连续的一段人群传教。具体来说,贞鱼哥会使第l个人到第r个人之间的所有人的信仰值增加k。 
2.贞鱼哥想知道某一段人的信仰值之和,于是他想找他的同桌DZY来帮忙,但是DZY要求他放出JY,才肯帮忙,贞鱼哥只好放了JY。具体来说,贞鱼哥会问DZY第l个人到第r个人之间所有人的信仰值之和。 
然而之前已经无数次介绍:DZY智商低下,太笨了!于是他想找帮过他多次大忙的计算机大神WJC来帮忙,但是WJC去相亲了,所以他找到了机智的你。 
【输入格式】 
第一行包含两个整数n,m。分别表示接受传教的人数以及贞鱼哥的操作数。 
接下来m行,每行包含若干个整数。若第一个整数为1,则代表贞鱼哥在进行传教,这一行接下来会包含l,r,k三个整数。否则第一个整数为2,代表贞鱼哥的一个询问,这一行接下来会包含l,r两个整数。 
【输出格式】 
输出若干行,每行包含1个整数,表示贞鱼哥询问的答案。行数为贞鱼哥的询问数量。 
【样例输入】 
5 5 
2 1 2 
1 4 4 2 
1 2 4 7 
1 4 5 6 
2 3 4 
【样例输出】 

22 
【样例说明】 
一开始所有人的信仰值都为0,所以答案为0。到第五个操作时,五个人的信仰值分别为0,7,7,15,6。故答案为7+15=22。
【数据范围】
对于30%测试点,n,m<=10,0<l<=n,0<r<=n,k<=10
对于60%测试点,n,m<=10^3,0<l<=n,0<r<=n,k<=10
对于所有测试点,n<=10^9,m<=10^3,0<l<=n,0<r<=n,k<=10
命题人:Hacker_WJC

这个题目是上一个题目的数据加强,没多想把上面那个线段树代码交了一发 re 调了半天没调出来.

试了试离散化,发现不对。不能离散化。

思维定势啊,卡了很久。后来看题解用的模拟的方法。

/* ***********************************************
Author        :buaaasd
Created Time  :2016/1/23 19:48:00
File Name     :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 100000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

bool cmp(int a,int b){
    return a>b;
}
int main()
{
    #ifndef ONLINE_JUDGE
   // freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    int n,m;
    ll u,x,y;
    ll k,l,r;
    while(cin>>n>>m){
        int num=0;
        ll qx[1110],qy[1110],qz[1110],qk[1110];
        for(int i=1;i<=m;i++){
            scanf("%lld %lld %lld",&u,&x,&y);
            if(u==1){
                scanf("%lld",&k);
                num++;
                qx[num]=x;
                qy[num]=y;
                qk[num]=k;
            }
            else{
                ll ans=0;
                for(int j=1;j<=num;j++){
                    l=qx[j];
                    r=qy[j];
                    k=qk[j];
                    if(l<=x&&r>=y){
                        ans+=(y-x+1)*k;
                    }
                    else if(l>=x&&r<=y){
                        ans+=(r-l+1)*k;
                    }
                    else if(r>=x&&r<=y&&l<x){
                        ans+=(r-x+1)*k;
                    }
                    else if(r>y&&l<=y&&l>=x){
                        ans+=(y-l+1)*k;
                    }
                }
                printf("%lld\n",ans);
            }
        }
    }
    return 0;
}

这种姿势挺帅的。

时间: 2024-08-27 21:48:14

贞鱼传教&&贞鱼传教(数据加强版)的相关文章

彩票APP将演绎“快鱼吃慢鱼”的发展轨迹

思科CEO钱伯斯有句名言,叫"快鱼吃慢鱼",他觉得"在Internet经济下,大公司不一定打败小公司,可是快的一定会打败慢的."对此观点,笔者表示部分认同,首先,"快鱼吃慢鱼"已经被非常多商业案例所验证,无需多言,至于"大公司不一定打败小公司",笔者觉得,大公司在资源.资金.技术等层面拥有很多其它优势,胜算会更大一些,尽管大公司不一定能打败小公司,可是小公司要打败大公司几率更低,并且这也早已被非常多商业案例所验证. 今天要讨论

家电市场洗牌,快鱼吃慢鱼大势所趋

珠三角劳动密集型产业正面临越来越严峻的挑战.4月14日凌晨,格兰仕中山工厂发生员工打砸事件,据说此事源于格兰仕中山工厂员工不满工资低于承诺标准所致.此事件发生之后,业界开始关注格兰仕的发展状况,并借此找出中国制造所面临的挑战和难题. 如果说这属于"内忧"的话,格兰仕也面临着更严重的"外患",根据海关数据显示,从2011年起,格兰仕原本第一的市场地位就被美的所超越.据统计,2013年美的出口量为1922万台,超过格兰仕近200万台,出口额为85687万美元,超过格兰仕

快鱼吃慢鱼:浪潮服务器未来五年要争全球第一的背后

2015年的时候,浪潮给自己提出一个五年规划目标,希望浪潮服务器在2020年的时候做到中国第一.全球前三,然而经过这几年的快速努力,很快在2017年就达成了这一目标.根据Gartner数据,2017年浪潮服务器出货量上升至全球第三,成为全球主要的服务器方案供应商,而在过去的16个季度中,有10个季度浪潮增长全球最快.2018年4月26日的2018浪潮云数据中心合作伙伴(IPF)大会上,×××院士.浪潮集团执行总裁王恩东宣布了新目标:五年实现浪潮服务器全球第一! 总结过去三年浪潮服务器成为中国第一

[bzoj2594][Wc2006]水管局长数据加强版

论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...100w你告诉我(n+m)log(n+m)可过?[掀桌] 蒟蒻又蠢了..复杂度应该是O((n+q)log(n+m))吧.. 一开始数组开太小re了两发(要开到maxn+maxm),然后又开太大mle一发,然后无限tle...把记录类型全改成数组还是tle.... 最后把非lct部分改得和黄学长全部一样终于20+s卡过去了......... 然后发现自己原来是有个地方写萎了..一开始把没被删的边做kru

bzoj 2594: [Wc2006]水管局长数据加强版 动态树

2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Status] Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等到路径

【BZOJ 2594】 [Wc2006]水管局长数据加强版

2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MB Submit: 1138  Solved: 364 [Submit][Status] Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等

统计方形(数据加强版)

洛谷P2241 统计方形(数据加强版) 我的做法是在求矩形时(包括正方形),用的是长从1~m,宽从1~n枚举的,但是数学方法往往能起到四两拨千斤的效果,其实矩形的个数就是Cn+22  *  Cm+22.因为确定一个矩形只需要确定它的两个端点就可以了,为啥要n+1,m+1呢?因为矩形边长可以为1,就是另一个点选空.若只求长方形,用容斥原理即可. #include<bits/stdc++.h> using namespace std; unsigned long long n,m; unsigne

luogu P1120 小木棍 [数据加强版]

二次联通门 : luogu P1120 小木棍 [数据加强版] /* luogu P1120 小木棍 [数据加强版] 暴搜 + 剪枝 枚举可能的长度 挨个检查答案 二分显然正确性不能保障 搜索时从最大的开始找 放上当前木棍后的长度比枚举的长度要大, 则退出 若当前的长度与当前扫到的木棍长度相同, 或是还需要的长度与枚举的长度相同,则退出 若当前的木棍不符合要求, 则后面与它长度相同的木棍都不行 */ #include <algorithm> #include <iostream>

丑数[数据加强版]

丑数[数据加强版] Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合. 这个集合包括:p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是个对于一个输入的S的丑数集 合.注意:我们不认为1 是一个丑数. 你的工作是对于输入的集合S去寻找集合中的第N个丑数.long long对于 程序是足够的. Input 第 1 行: 二个被空隔分开的整数:K 和 N , 1<= K<=100 , 1<=