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 << ;
const double eps=1e-;
using namespace std; bool cmp(int a,int b){
return a>b;
}
struct node{
int l,r;
ll sum;
ll c;
}nod[maxn*];
void push_up(int i){
nod[i].sum=nod[i<<].sum+nod[i<<|].sum;
}
void push_down(int i){
if(nod[i].c){
nod[i<<].c+=nod[i].c;
nod[i<<|].c+=nod[i].c;
nod[i<<].sum+=(ll)(nod[i<<].r-nod[i<<].l+)*nod[i].c; nod[i<<|].sum+=(ll)(nod[i<<|].r-nod[i<<|].l+)*nod[i].c;
nod[i].c=;
}
}
void build(int i,int l,int r){
nod[i].l=l;
nod[i].r=r;
nod[i].c=;
if(l==r){
nod[i].sum=;
return ;
}
int mid=(l+r)/;
build(i<<,l,mid);
build(i<<|,mid+,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+)*w;
return ;
}
if(nod[i].l==nod[i].r)return ;
push_down(i);
int mid=(nod[i].l+nod[i].r)/;
if(r<=mid)update(i<<,l,r,w);
else if(l>mid)update(i<<|,l,r,w);
else{
update(i<<,l,mid,w);
update(i<<|,mid+,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)/;
ll ans=;
if(r<=mid)ans+=query(i<<,l,r);
else if(l>mid)ans+=query(i<<|,l,r);
else {
ans+=query(i<<,l,mid);
ans+=query(i<<|,mid+,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(,,n);
for(int i=;i<=m;i++){
scanf("%d",&x);
if(x==){
scanf("%d%d%d",&y,&z,&w);
update(,y,z,w);
}
else{
scanf("%d%d",&y,&z);
printf("%lld\n",query(,y,z));
}
}
}
return ;
}

贞鱼传教(数据加强版)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 << ;
const double eps=1e-;
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=;
ll qx[],qy[],qz[],qk[];
for(int i=;i<=m;i++){
scanf("%lld %lld %lld",&u,&x,&y);
if(u==){
scanf("%lld",&k);
num++;
qx[num]=x;
qy[num]=y;
qk[num]=k;
}
else{
ll ans=;
for(int j=;j<=num;j++){
l=qx[j];
r=qy[j];
k=qk[j];
if(l<=x&&r>=y){
ans+=(y-x+)*k;
}
else if(l>=x&&r<=y){
ans+=(r-l+)*k;
}
else if(r>=x&&r<=y&&l<x){
ans+=(r-x+)*k;
}
else if(r>y&&l<=y&&l>=x){
ans+=(y-l+)*k;
}
}
printf("%lld\n",ans);
}
}
}
return ;
}

这种姿势挺帅的。

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

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

    思科CEO钱伯斯有句名言,叫"快鱼吃慢鱼",他觉得"在Internet经济下,大公司不一定打败小公司,可是快的一定会打败慢的."对此观点,笔者表示部分认同,首先 ...

  2. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

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

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  4. BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )

    离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...

  5. [bzoj2594][Wc2006]水管局长数据加强版 (lct)

    论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...

  6. BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 2917  Solved: 918[Submit][St ...

  7. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT

    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...

  8. 洛谷 P1120 小木棍 [数据加强版]解题报告

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

  9. BZOJ 2594 【WC2006】 水管局长数据加强版

    题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...

随机推荐

  1. Myeclipse 2014 for mac10.9 激活

    网上查了N多激活,都无法正确激活.后来慢慢爬文,终于激活了...真艰难啊.  所以怒马一份!   安装myeclipse. 安装完成别急着打开. 在终端里面打开的破解文件jar. java -jar ...

  2. Mongodb报错:ERROR: child process failed, exited with error number 1

    Mongodb在启动时报错: 2018-10-16T11:18:54.533+0800 I CONTROL [main] Automatically disabling TLS 1.0, to for ...

  3. 《从零开始搭建游戏服务器》MySQL安装配置

    一.下载资源: 到MySQL官网下载免安装版的mysql包,或者直接点击此链接下载:mysql-5.7.19-winx64.zip 二.解压配置: 将上面下载的安装包解压到一个本地目录下,在得到的my ...

  4. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  5. 超级强大的淘宝开源平台(taobao-code)

    今天发现了一个免费又高级的开源SVN服务器,taobao,阿里云CODE.迫不及待的注册了一个.感觉不错,分享给大家. 先说说我们用过的几个SVN服务器吧: google code oksvn(感觉不 ...

  6. 校园网、教育网 如何纯粹访问 IPv6 网站避免收费

    我国校园网有可靠的 IPv6 网络环境,速度非常快.稳定,并且大多数高校在网络流量计费时不会限制 IPv6 的流量,也就是免费的.然而访问 IPv4 商业网络时,则会收费,并且连接的可靠性一般.可幸的 ...

  7. BUPT复试专题—众数(2014)

    题目描述 有一个长度为N的非降数列,求数列中出现最多的数,若答案不唯一输出最小的数 输入 第一行T表示测试数据的组数(T<100) 对于每组测试数据: 第一行是一个正整数N表示数列长度 第二行有 ...

  8. js 验证 输入值 全是中文

    1.代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. android Graphics类:概述及基本几何图形绘制

    当须要在Android上绘制图形时.就会用到Graphics类.Paint类.Paint就是相当于笔,而Canvas就是 纸.这里叫画布. 所以,凡有跟要要画的东西的设置相关的.比方大小,粗细,画笔颜 ...

  10. 获取DOM父元素和子元素

    利用javascript可以遍历DOM树,这篇文章介绍用获取一个DOM元素的所有父节点和获取一个DOM元素的所以子孙节点. 1.获取所有父节点.用递归的方法,用parentNode属性. <!D ...