fjwc2019 D2T2 定价 (栈+set+贪心)
先瞄下数据范围
对于所有数据,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+贪心)的更多相关文章
- vijos 1605 双栈排序 - 贪心 - 二分图
题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$ ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- $[NOIp2008]$双栈排序 栈/二分图/贪心
\(Sol\) 先考虑单栈排序,怎么样的序列可以单栈排序呢?设\(a_i\)表示位置\(i\)是哪个数.\(\exist i<j<k\),都没有\(a_k<a_i<a_j\), ...
- fjwc2019 D6T2 密文(trie+贪心)
#194. 「2019冬令营提高组」密文 设$s[i]$表示前$i$个密文的异或和 容易发现,只要知道$s[0]~s[n](s[0]=0)$就可以知道每一位的值. 转化一下,就变成了在完全图上求最小生 ...
- fjwc2019 D3T1 签到题 (贪心)
#184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...
- 51Nod 1272 最大距离 (栈或贪心)
#include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...
- BZOJ 4029 [HEOI2015] 定价 ( 数位DP/贪心 )
前言 最近学了数位DP,感觉挺简单又实用.这道题就比较水,可以用300B的贪心过掉-网上似乎大多是贪心的题解,我就写写DP的做法 题意 给出正整数区间[L,R][L,R][L,R],定义荒谬值为 (去 ...
- 【TOJ 4493】Remove Digits(单调栈贪心)
描述 Given an N-digit number, you should remove K digits and make the new integer as large as possible ...
随机推荐
- 【LeetCode每天一题】Permutations(排列组合)
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...
- python-selenium无法调用浏览器的问题
一直有这个问题 问题:selenim不能调用浏览器 File "/Users/ligaijiang/PycharmProjects/Runoob/venv/lib/python3.7/sit ...
- [Java in NetBeans] Lesson 02. Variables, Data Types and Assignment.
这个课程的参考视频在youtube. 主要学到的知识点有: Data Type: int, char, String, double, boolean. When into printf, int ( ...
- jmeter4.0 执行jmeter_server.bat报错
Jmeter分布式执行1.-------------------------------Jmeter4.0 执行jmeter_server.bat 报错,是由于4.0要手工生成密钥 bin目录下 ...
- mybatis核心文件详解
MyBatis配置文件详解 configuration 这是配置文件的根元素标签,所有的其他元素都要在这个标签下使用. environments 用于管理所有环境,并可以指定默认使用哪个环境,通 ...
- MACD 下0轴后,强力=7上0轴的实例:
MACD 下0轴后,强力=7上0轴的实例: 虽然再上0轴,但是由于是强力上,必须有缓解期.缓解期后MACD开始收口,虽然没有下0轴,但是开始趋向死叉. 由于并没有很强的做多市场环境,MACD只是略高于 ...
- aop编程之后置通知,环绕通知和异常通知
---恢复内容开始--- 此将实例将在上一讲前置通知的基础上进行配置,前置配置内容:http://www.cnblogs.com/lihuibin/p/7955947.html 具体流程如下: 1. ...
- 使用sqoop往hdfs中导入数据供hive使用
sqoop import -fs hdfs://x.x.x.x:8020 -jt local --connect "jdbc:oracle:thin:@x.x.x.x:1521:testdb ...
- linux命令目录
一.文件和目录.(文件目录的增删改查) ls pwd cd mkdir touch rmdir ln dd rm cp mv nl cat tac more less head tail stat # ...
- django admin 处理文本换行空格
使用 linebreaks filter <p>{{ blogpassage.content|linebreaksbr }}<p>