#182. 「2019冬令营提高组」定价

先瞄下数据范围

对于所有数据,1≤n≤1000,1≤m≤10^9,1≤q≤500000 。\textbf{2 操作的个数不超过 1000。}

$10^9$位,看起来挺吓人,咋维护每个可以为1的位鸭?

再仔细看看,$q<=500000$,最多500000次操作,那么显然是对每一列,开个动态开点线段树或者平衡树维护。

本题对数据结构要求不高,于是我们可以快捷地用set代替辣

接下来我们考虑如何求出价格和的最小值

2 操作的个数不超过 1000。

这告诉我们可以愉快地在O(nlogn)内解决

从左到右一列列扫过去........考虑贪心

切一段ppt

我们先总结一下贪心的时候在干啥。

假设我们上一行有若干位为1,那么对于下一行,我们需要找到最高的为1位,满足这一行这位不能再为1了,我们就需要选取在这个位置之前的一个可以变成1的0,把它变成1,并把后面的位置全变成0。

直接用bitset维护可以获得部分分。

我们考虑使用一个栈维护当前的1,假设我们能找到最高的不能继续为1的位,我们就可以从这一位开始依次遍历前面的1,找到这个1之前第一个可以变成1的位置,如果这个位置在下一个1之前就是答案。

举个栗子

设前面$i$列处理完后,已知第$i$列的最小值$=(10101101)_{2}$

而第$i+1$列允许为$1$的位(从左到右,从$1$开始)有第$1,2,3,4,5,6$位

加入没有限制,那么第$i+1$列的最优解$=(10101110)_{2}$

但是允许为$1$的位不包括第$7$位鸭

于是我们就只能再向左找,找到第$4$位

把第$4$位改为$1$,并将右边所有位改为$0$

最后第$i+1$列的最优解$=(10110000)_{2}$

即为:

$a[i]=(10101101)_{2}$

$a[i+1]=(10110000)_{2}$

然后顺便维护下答案就ok了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set> namespace IO {
const int lim = ( << ) + ; char buf[lim + ], *S, *T; inline char gc() {
if (S == T) {
T = (S = buf) + fread(buf, , lim, stdin);
if (S == T) return EOF;
}
return *S++;
} inline int read() {
int x; char c; bool f;
for (f = ; (c = gc()) < '' || c > ''; f = c == '-');
for (x = c ^ ''; (c = gc()) >= '' && c <= ''; x = (x << ) + (x << ) + (c ^ ''));
return f ? -x : x;
}
}
using namespace IO;//快读是题目给的(逃 using namespace std;
const int mod=1e9+;
int n,m,q,stk[],v[],tp;
set <int> s[];
set <int>::iterator it;
int Pow(int x,int y){
int re=;
for(;y;y>>=,x=1ll*x*x%mod)
if(y&) re=1ll*re*x%mod;
return re;
}
int solve(){
int re=; tp=;
for(int i=,j;i<=n;++i){
stk[tp+]=m+;
for(j=;j<=tp&&s[i].count(stk[j]);++j);//这一位填不了的话就从这位开始找
tp=j-;
for(;;){
it=s[i].upper_bound(stk[tp+]-);
if(it==s[i].begin()) return -;
--it;
if(*it>stk[tp]){stk[++tp]=*it; break;}
if(!tp) return -;
--tp;
}
v[tp]=v[tp-]+Pow(,m-stk[tp]);//上个的答案(用数组维护)加上这一位
if(v[tp]>=mod) v[tp]-=mod;
re+=v[tp];
if(re>=mod) re-=mod;
}return re;
}
int main(){
freopen("price.in","r",stdin);
freopen("price.out","w",stdout);
n=read(); m=read(); q=read();
int q1,q2;
while(q--){
if(read()==){
q1=read(); q2=read();
if(s[q1].count(q2)) s[q1].erase(q2);
else s[q1].insert(q2);
}else printf("%d\n",solve());
}return ;
}

fjwc2019 D2T2 定价 (栈+set+贪心)的更多相关文章

  1. vijos 1605 双栈排序 - 贪心 - 二分图

    题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$ ...

  2. 洛谷P1155 双栈排序(贪心)

    题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...

  3. 洛谷$P1155$ 双栈排序 贪心+二分图匹配

    正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...

  4. $[NOIp2008]$双栈排序 栈/二分图/贪心

    \(Sol\) 先考虑单栈排序,怎么样的序列可以单栈排序呢?设\(a_i\)表示位置\(i\)是哪个数.\(\exist i<j<k\),都没有\(a_k<a_i<a_j\), ...

  5. fjwc2019 D6T2 密文(trie+贪心)

    #194. 「2019冬令营提高组」密文 设$s[i]$表示前$i$个密文的异或和 容易发现,只要知道$s[0]~s[n](s[0]=0)$就可以知道每一位的值. 转化一下,就变成了在完全图上求最小生 ...

  6. fjwc2019 D3T1 签到题 (贪心)

    #184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...

  7. 51Nod 1272 最大距离 (栈或贪心)

    #include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...

  8. BZOJ 4029 [HEOI2015] 定价 ( 数位DP/贪心 )

    前言 最近学了数位DP,感觉挺简单又实用.这道题就比较水,可以用300B的贪心过掉-网上似乎大多是贪心的题解,我就写写DP的做法 题意 给出正整数区间[L,R][L,R][L,R],定义荒谬值为 (去 ...

  9. 【TOJ 4493】Remove Digits(单调栈贪心)

    描述 Given an N-digit number, you should remove K digits and make the new integer as large as possible ...

随机推荐

  1. SQL 、NoSQL数据库教程

    前言: 嗯,先说说数据库的分类吧,其实主要大的分类就是关系型数据库(SQL)和非关系型数据库(NoSQL); 实验楼上有常见的数据库教程,这里做一个整理,希望对你学习数据库方面的知识有所帮助: 关系型 ...

  2. [Java in NetBeans] Lesson 06. Custom classes

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: Constructors: A special method called when an object of the class ...

  3. js动态规划---最长子序列(lcs)

    function LCS(wordX, wordY) { var m = wordX.length; var n = wordY.length; this.lcs = function(){ var ...

  4. vmware 下linux 共享文件夹消失

    今天遇到了vmware下linux和宿主win7系统共享文件,突然在linux下消失的问题 环境:vmware10.0.0下装了centos, 主机系统是win7. 背景:事情的初衷是想让win7 下 ...

  5. gcc 6.2.0/6.3.0/8.2.0 编译安装

    参考:http://www.linuxfromscratch.org/blfs/view/stable/general/gcc.html 下载地址在这里:https://ftp.gnu.org/gnu ...

  6. Kotlin 范型约束

    官方的示意及其简约,该说的一概没说 我在这里给大家一个完整的例子 //test.kt fun <T> cloneWhenGreater(list: List<T>, thres ...

  7. Go linux 实践3

    Go 的灵魂-goroutine(协程), channel(渠道) 看看吧,不多说了 ************************************************ package ...

  8. Oracle之SQL优化专题02-稳固SQL执行计划的方法

    首先构建一个简单的测试用例来实际演示: create table emp as select * from scott.emp; create table dept as select * from ...

  9. spring对JDBC的整合支持

    参考网址:https://blog.csdn.net/u013821825/article/details/51606171 springMVC,目前用到的jar包 spring IOC 5个包  + ...

  10. jquery简介未完成

    jQuery jQuery是一个快速.简洁的javascript框架,是继prototype之后又一个优秀的代码库(或者javascript框架).jQuery设计的宗旨是writeLess,Do M ...