9.29 csp-s模拟测试55 联+赛+题
T1 联
$n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同的区间,再区间覆盖就可以。
在线段树中维护一个$cnt$,表示区间中$0$的个数,在询问的时候,只需要找到最左端$cnt!=0$的地方,在把离散化后的映射回来输出即可。
要注意的一点是,不仅要每个区间的左右端点,也要把区间右端点$+1$的地方也离散化,留下可能是$0$的位置,并且把$1$位置扔进去,不然可能会找不到答案,离散化后是$3×m$个点,数组要开够。。。
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
struct tree
{
ll l,r,lz,cnt;//sz为区间0的个数
}t[];
struct node
{
ll opt,l,r;
}q[];
ll n,m,tot,sum,cp[],pos[];
map<ll,ll>mp;
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
void build(ll x,ll l,ll r)
{
t[x].l=l;t[x].r=r;t[x].cnt=t[x].r-t[x].l+;
if(l==r) return;
ll mid=l+r>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
void down(ll x)
{
if(t[x].lz==){
t[x<<].cnt=;t[x<<|].cnt=;
t[x<<].lz=t[x].lz;t[x<<|].lz=t[x].lz;
t[x].lz=;
}
else if(t[x].lz==){
t[x<<].cnt=t[x<<].r-t[x<<].l+;t[x<<|].cnt=t[x<<|].r-t[x<<|].l+;
t[x<<].lz=t[x].lz;t[x<<|].lz=t[x].lz;
t[x].lz=;
}
}
void update(ll x)
{
t[x].cnt=t[x<<].cnt+t[x<<|].cnt;
}
void change(ll x,ll l,ll r,ll opt)//1:全改为1 2:全改为0 cnt:0的个数
{
if(l<=t[x].l&&t[x].r<=r){
if(opt==){
t[x].lz=opt;
t[x].cnt=;
return;
}
if(opt==){
t[x].lz=opt;
t[x].cnt=t[x].r-t[x].l+;
return;
}
if(opt==){
if(t[x].cnt==){
t[x].lz=;
t[x].cnt=t[x].r-t[x].l+;
return;
}
else if(t[x].cnt==t[x].r-t[x].l+){
t[x].lz=;
t[x].cnt=;
return;
}
}
}
down(x);
ll mid=t[x].l+t[x].r>>;
if(l<=mid) change(x<<,l,r,opt);
if(r>mid) change(x<<|,l,r,opt);
update(x);
}
ll query(ll x)
{
if(t[x].l==t[x].r||t[x].cnt==t[x].r-t[x].l+) return t[x].l;
down(x);
if(t[x<<].cnt) return query(x<<);
else return query(x<<|);
}
int main()
{
n=read();cp[++tot]=;
for(int i=;i<=n;i++) q[i].opt=read(),q[i].l=read(),q[i].r=read(),cp[++tot]=q[i].l,cp[++tot]=q[i].r,cp[++tot]=q[i].r+;
sort(cp+,cp+tot);
for(int i=;i<=tot;i++) if(!mp[cp[i]]) mp[cp[i]]=++sum,pos[sum]=cp[i];
for(int i=;i<=n;i++) q[i].l=mp[q[i].l],q[i].r=mp[q[i].r];
build(,,sum);
for(int i=;i<=n;i++){
change(,q[i].l,q[i].r,q[i].opt);
printf("%lld\n",pos[query()]);
}
return ;
}
联
T2 赛
把$n$个物品分成$4$类,甲乙都喜欢,只有甲喜欢,只有乙喜欢,甲乙都不喜欢,并按权值$sort$
枚举选$i$个甲乙都喜欢的,那么就要最小的$k-i$个甲喜欢的,最小的$k-i$个乙喜欢的,然后还不够的就从剩下的没选的里面选$m-k-k+i$个最小的,但显然会超时
把权值离散化,插到一棵权值线段树里,每次查询最小的$m-k-k+i$个元素的和
随着$i$的递推,新加入的点只有两个,但要注意边界问题,因为这个wa95了一晚上
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#define ll long long
using namespace std;
struct tree
{
ll l,r,cnt,sum;
}t[];
ll n,m,k,x,y;
ll ans,a[],q0[],q1[],q2[],cp[],rt,tot,num,id[];
bool aa[],bb[];
vector<ll>ve[];
map<ll,ll>mp;
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
void insert(ll &x,ll l,ll r,ll now)
{
if(!x) x=++num;
t[x].cnt++;t[x].sum+=id[now];
if(l==r) return;
ll mid=l+r>>;
if(now<=mid) insert(t[x].l,l,mid,now);
else insert(t[x].r,mid+,r,now);
}
ll query(ll x,ll l,ll r,ll cnt)
{
if(t[x].cnt<=cnt) return t[x].sum;
if(l==r) return l*cnt;
ll mid=l+r>>,as=;
as+=query(t[x].l,l,mid,cnt);
if(t[t[x].l].cnt<cnt) as+=query(t[x].r,mid+,r,cnt-t[t[x].l].cnt);
return as;
}
int main()
{
//freopen("b19.in","r",stdin);
n=read();m=read();k=read();ans=0x7ffffffffffff;
for(int i=;i<=n;i++) a[i]=read(),cp[i]=a[i];
x=read();
for(int i=;i<=x;i++) aa[read()]=;
y=read();
for(int i=;i<=y;i++) bb[read()]=;
if(x<k||y<k||k>m){
puts("-1");
return ;
}
sort(cp+,cp+n+);
for(int i=;i<=n;i++) if(!mp[cp[i]]) mp[cp[i]]=++tot,id[tot]=cp[i];
for(int i=;i<=n;i++){
if(aa[i]&&bb[i]) ve[].push_back(a[i]);
else if(aa[i]&&!bb[i]) ve[].push_back(a[i]);
else if(!aa[i]&&bb[i]) ve[].push_back(a[i]);
else if(!aa[i]&&!bb[i]) ve[].push_back(a[i]);
}
sort(ve[].begin(),ve[].end());
sort(ve[].begin(),ve[].end());
sort(ve[].begin(),ve[].end());
for(int i=;i<ve[].size();i++) q0[i+]=q0[i]+ve[][i];
for(int i=;i<ve[].size();i++) q1[i+]=q1[i]+ve[][i];
for(int i=;i<ve[].size();i++) q2[i+]=q2[i]+ve[][i];
for(int i=;i<ve[].size();i++) insert(rt,,n,mp[ve[][i]]);
for(int i=k+;i<ve[].size();i++) insert(rt,,n,mp[ve[][i]]);
for(int i=k+;i<ve[].size();i++) insert(rt,,n,mp[ve[][i]]);
for(int i=;i<=min((ll)k,(ll)ve[].size());i++){
if(k-i<ve[].size()) insert(rt,,n,mp[ve[][k-i]]);
if(k-i<ve[].size()) insert(rt,,n,mp[ve[][k-i]]);
if(m-k-k+i<||k-i>=ve[].size()||k-i>=ve[].size()) continue;
ll as=q0[i]+q1[k-i]+q2[k-i];
as+=query(rt,,n,m-k-k+i);
ans=min(ans,as);
}
if(ans>=){
puts("-1");
return ;
}
printf("%lld\n",ans);
return ;
}
赛
T3 题
$f[i]$表示$i$这个苹果是否可能剩下,$0$表示不可能,$1$可能剩下,初始全为$1$,$g[i][j](bitset)$表示i这个苹果必须有,最终的状态,$1$表示状态已经确定,$0$表示不确定
枚举每个苹果,让他必须活下来,倒序枚举$m$个人,看最后一个人要吃的苹果,
如果$a$,$b$都不确定,那么他们还是都不确定,
如果$a$确定,那么$j$这个人就只能吃$b$,所以$b$也确定了
如果$b$确定,那么$j$这个人就只能吃$a$,所以$a$也确定了
如果$a$,$b$都已确定,那这个状态就推不回去了(后边的人把他确定了,但他在后边的人前边,所以一定是他先吃,状态一定不合法),所以i一定不会活下来
最后再枚举每个苹果,如果他可能剩下,再去找另一个可能剩下的苹果,看他们两个最终状态是不是交集为空(一个苹果只能被一个人吃),为空$ans++$
#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
int n,m,ans,a[],b[];
bitset<>g[],as;
bool f[];
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++) a[i]=read(),b[i]=read();
for(int i=;i<=n;i++) f[i]=;
for(int i=;i<=n;i++){
g[i][i]=;
for(int j=m;j>=;j--){
if(g[i][a[j]]&&g[i][b[j]]){f[i]=;break;}
else if(g[i][a[j]]&&!g[i][b[j]]) g[i][b[j]]=;
else if(!g[i][a[j]]&&g[i][b[j]]) g[i][a[j]]=;
}
}
for(int i=;i<=n;i++){
if(f[i]){
for(int j=i+;j<=n;j++){
if(f[j]){
as=g[i]&g[j];
if(!as.count()) ans++;
}
}
}
}
printf("%d\n",ans);
return ;
}
题
不想联赛就退役就静下来好好想
9.29 csp-s模拟测试55 联+赛+题的更多相关文章
- csp-s模拟测试55 联,赛,题题解
题面:https://www.cnblogs.com/Juve/articles/11610969.html 联: 用线段树维护区间和,要修改成1或0就线段树修改区间和 如果是异或,那么新的区间和就是 ...
- csp-s模拟测试55(9.29)联「线段树」·赛「??」题「神仙DP」
T1 联 考试两个小时终于调过了,话说一个傻逼错最后还是静态查出错的..... 大概维护两个懒标记,一个区间覆盖,一个区间异或,然后保证每个区间只会存在一种懒标记. 然后维护区间0的个数,查询时查询那 ...
- 2019.9.29 csp-s模拟测试55 反思总结
不咕咕咕是一种美德[大雾] 头一次体会到爆肝写题解??? 这次考试我们没赶上,是后来掐着时间每个人自己考的.我最后的分数能拿到152…熟悉的一题AC两题爆炸. 强烈吐槽出题人起名走心 T1联: 发现每 ...
- [考试反思]0929csp-s模拟测试55:消逝
菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3 ...
- noip模拟23[联·赛·题]
\(noip模拟23\;solutions\) 怎么说呢??这个考试考得是非常的惨烈,一共拿了70分,为啥呢 因为我第一题和第三题爆零了,然后第二题拿到了70分,还是贪心的分数 第一题和第二题我调了好 ...
- csp-s模拟测试80(b)
csp-s模拟测试80(b) 水题没什么可写的. $T1SB$规律题正解调了仨小时就过了. $T2SBDp$题颓完题解就秒了. $T3SB$数据结构考场想到正解就弃了,考后太懒一半正解一发随机化就A了 ...
- Mock 模拟测试简介及 Mockito 使用入门
Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- csp-s模拟测试60
csp-s模拟测试60 2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...
随机推荐
- Educational Codeforces Round 76 (Rated for Div. 2) B. Magic Stick 水题
B. Magic Stick Recently Petya walked in the forest and found a magic stick. Since Petya really likes ...
- Codeforces Round #598 (Div. 3) C. Platforms Jumping 贪心或dp
C. Platforms Jumping There is a river of width n. The left bank of the river is cell 0 and the right ...
- Python连载44-XML其他注意点
一.XML文件注意点 1.内容中不能出现尖括号 例如:下面是不合法的 <grade>成绩<90</grade> 解决方案:使用实体引用<EntityReferenc ...
- 前端笔记之Vue(四)UI组件库&Vuex&虚拟服务器初识
一.日历组件 new Date()的月份是从0开始的. 下面表达式是:2018年6月1日 new Date(2018, 5, 1); 下面表达式是:2018年5月1日 new Date(2018, 4 ...
- Linux war包部署jenkins
一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Je ...
- git查看/修改个人信息-用户名邮箱
我们在使用git作为仓库管理工具时,要设置自己Git的用户名和邮箱,要不然大家一块开发时不知道谁是谁,不知道谁提交的. 另外,当我们用自己的电脑开发时你可能设置的是一个你喜欢的昵称,所以那就得改一下. ...
- Ansible快速开始-指挥集群
Ansible可以集中地控制多个节点,批量地执行ssh命令.由于其使用ssh进行操作,因此远端服务器除了安装openssh-server(一般服务器已经内置)之外,不需要安装额外的软件,因此使用非常简 ...
- TCP协议 - 面向连接
一.TCP特性概览 1.面向连接 TCP是基于连接进行数据交互,通信双方在进行数据交互之前需要建立连接,该连接也只能用在双方之间进行交互.这点不像UDP中的组播和广播,可以在同一组中多个主机交互数据. ...
- 13. 罗马数字转整数(C#)
看到这道题,存在键值对,所以先建个泛型字典,把键值填进去. 由于这道题存在两个字符表示一个数字的情况,所以在for循环的时候判断一下,看看当前字符串中循环到的字符是否和下一个字符能够组成存在在字典里的 ...
- 漫谈golang设计模式 工厂模式
工厂模式 意义:创建过程交给专门的工厂子类去完成.定义一个抽象的工厂类,再定义具体的工厂类来生成子类等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引 ...