题面

现场题面

codeforces878E

codeforces878E
A sequence of n integers is written on a blackboard. Soon Sasha will come to the blackboard and start the following actions: let x and y be two adjacent numbers (xxx before yyy), then he can remove them and write x+2yx + 2yx + 2y instead of them. He will perform these operations until one number is left. Sasha likes big numbers and will get the biggest possible number.

Nikita wants to get to the blackboard before Sasha and erase some of the numbers. He has qqq options, in the option iii he erases all numbers to the left of the lil_ili​-th number and all numbers to the right of rir_iri​-th number, i. e. all numbers between the lil_ili​-th and the rir_iri​-th, inclusive, remain on the blackboard. For each of the options he wants to know how big Sasha’s final number is going to be. This number can be very big, so output it modulo 109+710^9 + 7109 + 7.

双倍经验传送门:Luogu

题解

自己的唠叨

  • 现场得分:NULL/50(他没给我测)

  • 题目已补

  • 注意点:

    • 会爆long long,所以对于一个块,要记录取模后的和以及大致的和(就是不取模,与INF取min)
    • 一定要注意不要输出负数
  • xjoi上面的数据是hapi,过了xjoi不一定能过codeforces。其中差别(就我的程序而言),在于为000的元素的处理。值为000的块不要并到前面的块上面。

现场题解

代码

#include<bits/stdc++.h>
#define LL long long
#define MAXN 1000000
#define MOD 1000000007
#define INF (1ll<<62)
using namespace std;
template<typename T>void Read(T &cn)
{char c;int sig = 1;while(!isdigit(c = getchar()))if(c == '-')sig = -1; cn = c-48;while(isdigit(c = getchar()))cn = cn*10+c-48; cn*=sig;
}
template<typename T>void Write(T cn)
{if(cn < 0) {putchar('-'); cn = 0-cn; }int wei = 0; T cm = 0; int cx = cn%10; cn/=10;while(cn)cm = cm*10+cn%10,cn/=10,wei++;while(wei--)putchar(cm%10+48),cm/=10;putchar(cx+48);
}
template<typename T>void Min(T &cn, T cm) {cn = cn > cm ? cm : cn; }
template<typename T>void Max(T &cn, T cm) {cn = cn < cm ? cm : cn; }
struct xun{int l,r,ci;inline friend bool operator <(xun a,xun b) {return a.r < b.r; }void getit(int cn) {Read(l); Read(r); ci = cn; }
};
struct qwe{LL zhi,dax,chang;void mk(int cn) {zhi = dax = cn; }
};
xun b[MAXN+1];
int ans[MAXN+1];
int n,m;
qwe a[MAXN+1];
int fa[MAXN+1];
LL qz[MAXN+1],mi[MAXN+1],nim[MAXN+1];
LL he[MAXN+1];
int get_fa(int cn) {return cn == fa[cn] ? cn : fa[cn] = get_fa(fa[cn]); }
LL ksm(LL cn,LL cm) {LL ans = 1; while(cm) ans = ans*(1+(cn-1)*(cm&1))%MOD, cn = cn*cn%MOD, cm>>=1; return ans; }
void yuchu(int cn)
{mi[0] = 1; mi[1] = 2; nim[0] = 1; nim[1] = ksm(2,MOD-2);for(int i = 2;i<=cn;i++) mi[i] = mi[i-1]*mi[1]%MOD, nim[i] = nim[i-1]*nim[1]%MOD;
}
void weihu_he(int cn)
{int lin = get_fa(cn);he[lin] = (he[get_fa(lin-1)]+a[lin].zhi*(1+(lin!=1)))%MOD;
}
LL jia(LL cn,LL cm,LL cx)
{if(cx >= 62) return INF;if(((INF-cn)>>cx) <= cm) return INF;LL guo = cn + cm*(1ll<<cx);return min(guo,INF);
}
void weihu_a(int cn)
{a[cn].chang = 1;if(cn == 1) return; while(cn != 1 && a[cn].dax >= 0){int lin = get_fa(cn-1);fa[cn] = lin;a[lin].zhi = (a[lin].zhi + a[cn].zhi * mi[a[lin].chang])%MOD;a[lin].dax = jia(a[lin].dax,a[cn].dax,a[lin].chang);a[lin].chang = a[lin].chang + a[cn].chang;cn = lin;}
}
LL suan(int cn,int cm)
{int lin = get_fa(cn);int lin2 = lin + a[lin].chang-1;int lin1 = get_fa(cm);
//  printf("lin = %d lin1 = %d lin2 = %d\n",lin,lin1,lin2);return ((he[lin1] - he[lin] + (qz[lin2]-qz[cn-1]+MOD)%MOD*nim[cn-1]%MOD+MOD)%MOD+MOD)%MOD;
}
signed main()
{//  freopen("border2.in","r",stdin);
//  freopen("T3.out","w",stdout);Read(n); Read(m);for(int i = 1;i<=n;i++) {int bx; Read(bx); a[i].mk(bx); fa[i] = i; }for(int i = 1;i<=m;i++) b[i].getit(i);yuchu(n); qz[0] = 0;for(int i = 1;i<=n;i++) qz[i] = (qz[i-1] + a[i].zhi*mi[i-1])%MOD;sort(b+1,b+m+1);int xian = 0; he[0] = 0;for(int i = 1;i<=n;i++){weihu_a(i); weihu_he(i);while(xian < m && b[xian+1].r == i) xian++, ans[b[xian].ci] = suan(b[xian].l,i);}for(int i = 1;i<=m;i++) Write(ans[i]), puts("");return 0;
}

【日常训练】2019-10-24am_xjoi结界[生与死的境界]/codeforces878E_贪心相关推荐

  1. 6374. 【NOIP2019模拟2019.10.04】结界[生与死的境界]

    题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数xxx和yyy,将其删去,并在原来位置插入x+2yx+2yx+2y. 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答 ...

  2. 2019.10.26日常总结兼一码学成普及模拟4比赛选解

    [题目A]: [题目]: 有 n 只袋鼠(题目假设他们都是母的),你需要给他们组建成家庭. 对于第 i 只袋鼠来说,它的大小用一个数字 Si 来表示. 如果第 i 只袋鼠的大小 Si 达到了第 j 只 ...

  3. 浅析中科红旗的生与死

    中科红旗,全名(北京中科红旗软件技术有限公司),成立于2000年6月,由中科院软件所和北京赛迪等八家股东联合设立的中外合资公司,注册资金96.2万美金.由于是中科院牵头的中国代表性操作系统厂家,所以一 ...

  4. codeforces日常训练 C. Cutting Out - 二分搜索答案

    codeforces日常训练 C. Cutting Out - 二分搜索答案 题干 You are given an array s consisting of n integers. You hav ...

  5. 李振杰:中科红旗的生与死

    中科红旗,全名(北京中科红旗软件技术有限公司),成立于2000年6月,由中科院软件所和北京赛迪等八家股东联合设立的中外合资公司,注册资金96.2万美金.由于是中科院牵头的中国代表性操作系统厂家,所以一 ...

  6. 2019.10 全世界评分最高动画TOP100

    2019.10 全世界评分最高动画TOP100: 100.朝花夕誓--约定之花 99.樱花庄的宠物女孩 98.王牌投手 振臂高挥 97.幼女战记 96.花开伊吕波 95.我的青春恋爱物语果然有问题 9 ...

  7. 野鸡NOI.AC模拟赛【2019.10.26】

    前言 截止至2019.10.2614:222019.10.26\ \ \ \ 14:222019.10.26    14:22 成绩 正题 T1:NOI.AC−T1:NOI.AC-T1:NOI.AC− ...

  8. 决定零售商生与死的12大关键指标

    数据分析入门与实战  公众号: weic2c 决定零售商生与死的重要线在哪里?有哪些指标可以帮助零售商转危为机? 一.营业额1.营业额反映了店铺的生意走势.针对以往销售数据,结合地区行业的发展状况,通 ...

  9. 2019.10.15

    2019.10.15 #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class MyThread: public QThr ...

最新文章

  1. python特性和属性_Python之属性、特性和修饰符
  2. maven多profile环境打包下-P参数和-D参数
  3. zcmu1734: 18岁
  4. how is webdynpro component class initialized
  5. POJ 2553 The Bottom of a Graph
  6. 华三服务器bios中查看硬盘,H3C服务器升级BIOS
  7. Python代码自动转成C++代码
  8. 人群密度分析算法调研
  9. iOS蓝牙链接打印机的使用心得
  10. 铁路订票系统的简单设计(转载)
  11. Python异步并发机制详解,让你的代码运行效率就像搭上了火箭!!!
  12. 为什么说交换机可以隔离冲突域?
  13. 【企业网盘】公有云和私有云的9大差异 | 燕麦企业云盘(OATOS企业网盘)
  14. 计算机基础知识离线作业答案,2013浙大离线作业1.计算机基础知识题
  15. 计算机语言表示教师节快乐,教师节英文祝福语(精选50句)
  16. Axure教程:填入数据自动生成饼图教程
  17. 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列
  18. apache ab使用详解
  19. Nacos服务注册与发现源码(一)之gRPC协议的实例注册
  20. c语言核桃的数量--程序设计,核桃的数量

热门文章

  1. v2ray本机和服务器连不上报错ocks: failed to transport all TCP response > io: read/write on closed pipe
  2. 位操作技巧:Bit Twiddling Hacks
  3. 安卓一键清理内存_微清理下载软件-微清理app下载v1.0.1.2 安卓版
  4. CREO5.0.6.0基本操作与导出常用图保姆级教程
  5. [深度学习] (sklearn)多层感知机对葡萄酒的分类
  6. PAT 1009 蜜蜂寻路
  7. Cocos技术派 | TS版属性面板定义高级用法
  8. Clion远程Linux开发调试环境搭建
  9. Codeforces 645B Mischievous Mess Makers【逆序数】
  10. wsl2 ping不通windows主机问题速查