\(noip模拟23\;solutions\)

怎么说呢??这个考试考得是非常的惨烈,一共拿了70分,为啥呢

因为我第一题和第三题爆零了,然后第二题拿到了70分,还是贪心的分数

第一题和第二题我调了好久,hhhh

害,害,害,害

·

\(T1\;联\)

据出题人说,这是个线段树裸题,啊啊啊,我看到1e5的时候也觉得这是个简单的线段树

后来看到1e18我就溜走了,后来回来看,发现这个可以\(O(n^2)\)链表做

打对了1,2操作,忘记换行了0分,应该是30分

这个题说白了就是利用线段树维护值,不过你发现他的范围极其大

但是,这里面有用的值吧,只有这些区间的端点和这些区间右端点的右边那一位

所以我们要做的就是一个离散化,然后就很容易找到了这第一个0

再看看操作,1,2直接下放,3的话就追上1,2的时候给他的laz标记异或一下

代码实现极其简单,我因为pushdown没有改当前值WA了好长时间

注意离散化要把1也弄进去,离散化数组开打一点

AC_code

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
const int N=1e5+5;
int m;
int typ[N];
ll a[N],b[N];
ll lsh[N*10],lh;
map<long long,int> ys;
struct TREE{
#define ls x<<1
#define rs x<<1|1
int laz[N*16],now[N*16],mn[N*16];
TREE(){}
void pushup(int x){
mn[x]=min(mn[ls],mn[rs]);
return ;
}
void build(int x,int l,int r){
mn[x]=l;
if(l==r){
return ;
}
now[x]=-1;
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
return ;
}
void pushdown(int x,int l,int r){
if(now[x]==-1)return ;
int mid=l+r>>1;
now[ls]=now[rs]=now[x];
if(now[x]==0){
mn[ls]=l;mn[rs]=mid+1;
}
else if(now[x]==1)mn[ls]=mn[rs]=0x3f3f3f3f;
now[x]=-1;
return ;
}
void ins(int x,int l,int r,int ql,int qr,int v){
//if(v==1)cout<<x<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<" "<<now[x]<<" "<<mn[x]<<endl;
if((ql<=l&&r<=qr)&&(v!=3||now[x]!=-1)){
if(v==1)now[x]=1;
if(v==2)now[x]=0;
if(v==3){
now[x]^=1;
}
if(now[x]==0)mn[x]=l;
if(now[x]==1)mn[x]=0x3f3f3f3f;
return ;
}
pushdown(x,l,r);
int mid=l+r>>1;
if(ql<=mid)ins(ls,l,mid,ql,qr,v);
if(qr>mid)ins(rs,mid+1,r,ql,qr,v);
pushup(x);
//if(v==1)cout<<x<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<" "<<now[x]<<" "<<mn[x]<<endl;
return ;
}
}xds;
signed main(){
scanf("%d",&m);
lsh[++lh]=1;
for(re i=1;i<=m;i++){
scanf("%d%lld%lld",&typ[i],&a[i],&b[i]);
lsh[++lh]=a[i];
lsh[++lh]=b[i];
lsh[++lh]=b[i]+1;
}
sort(lsh+1,lsh+lh+1);
lh=unique(lsh+1,lsh+lh+1)-lsh-1;
for(re i=1;i<=lh;i++)ys[lsh[i]]=i;//cout<<i<<" "<<lsh[i]<<endl;
xds.build(1,1,lh);
for(re i=1;i<=m;i++){
a[i]=ys[a[i]];
b[i]=ys[b[i]];
//cout<<a[i]<<" "<<b[i]<<endl;
xds.ins(1,1,lh,a[i],b[i],typ[i]);
//cout<<xds.now[64]<<" ";
printf("%lld\n",lsh[xds.mn[1]]);
}
}


·

\(T2\;赛\)

这个题考场上我只会打贪心,拿到了70pts

最后我发现,这个贪心正确性果然保证不了,因为你无法枚举完所有的情况

并且你根本不知道要选多少共同喜欢的物品才能达到最有解

所以我们就枚举,先枚举一个共同喜欢的个数,再枚举在各自喜欢的中选多少

最后在剩余的中寻找前几个,最后的这个用线段树,要不然复杂度就炸了

这里有一堆边界之要维护,诸如,是否有足够m个共同喜欢的。。。。

AC_code

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
const int N=2e5+5;
int n,m,k,a[N],b[N];
bool via[N],vib[N],vis[N];
int val[N];
int cc[N],ac[N],bc[N];
ll ans,res;
struct node{
int ls[N*40],rs[N*40];
ll sum[N*40],siz[N*40];
int seg;
void pushup(int x){
sum[x]=sum[ls[x]]+sum[rs[x]];
siz[x]=siz[ls[x]]+siz[rs[x]];
}
void ins(int &x,int l,int r,int pos){
if(!x)x=++seg;
if(l==r){
siz[x]+=1;
sum[x]+=pos;
return ;
}
int mid=l+r>>1;
if(pos<=mid)ins(ls[x],l,mid,pos);
else ins(rs[x],mid+1,r,pos);
pushup(x);return ;
}
void del(int x,int l,int r,int pos){
if(l==r){
siz[x]-=1;
sum[x]-=pos;
return ;
}
int mid=l+r>>1;
if(pos<=mid)del(ls[x],l,mid,pos);
else del(rs[x],mid+1,r,pos);
pushup(x);return ;
}
ll query(int x,int l,int r,int rak){
if(!rak)return 0;
if(!x)return 0;
if(!siz[x])return 0;
if(rak==siz[x])return sum[x];
int mid=l+r>>1;ll ret=0;
if(rak>siz[ls[x]]){
ret+=query(ls[x],l,r,siz[ls[x]]);
ret+=query(rs[x],l,r,rak-siz[ls[x]]);
}
else ret+=query(ls[x],l,r,rak);
return ret;
}
}xds;
int R,rt;
bool cmp(int x,int y){
return val[x]<val[y];
}
signed main(){
ans=0x3f3f3f3f3f3f3f3f;
scanf("%d%d%d",&n,&m,&k);
for(re i=1;i<=n;i++)scanf("%d",&val[i]),R=max(R,val[i]);
scanf("%d",&a[0]);
for(re i=1;i<=a[0];i++)scanf("%d",&a[i]);
scanf("%d",&b[0]);
for(re i=1;i<=b[0];i++)scanf("%d",&b[i]);
for(re i=1;i<=a[0];i++)via[a[i]]=true;
for(re i=1;i<=b[0];i++)vib[b[i]]=true;
for(re i=1;i<=a[0];i++)if(vib[a[i]])cc[++cc[0]]=a[i];
for(re i=1;i<=a[0];i++)if(!vib[a[i]])ac[++ac[0]]=a[i];
for(re i=1;i<=b[0];i++)if(!via[b[i]])bc[++bc[0]]=b[i];
int nc=m,na;
while(nc>cc[0])nc--;
if(k-nc>ac[0]||k-nc>bc[0]||nc<2*k-m){
printf("-1");
return 0;
}
//cout<<"sb"<<endl;
sort(cc+1,cc+cc[0]+1,cmp);
sort(ac+1,ac+ac[0]+1,cmp);
sort(bc+1,bc+bc[0]+1,cmp);
for(re i=1;i<=nc;i++)vis[cc[i]]=true,res+=val[cc[i]];
for(re i=1;i<=k-nc;i++)vis[ac[i]]=true,res+=val[ac[i]];
for(re i=1;i<=k-nc;i++)vis[bc[i]]=true,res+=val[bc[i]];
for(re i=1;i<=n;i++)if(!vis[i])xds.ins(rt,1,R,val[i]);
na=max(k-nc,0);
//cout<<"sb"<<endl;
//cout<<res<<" "<<na<<" "<<nc<<" "<<xds.query(rt,1,R,m-2*na-nc)<<endl;
ans=min(ans,res+xds.query(rt,1,R,m-na*2-nc));
for(re i=nc;i>=max(1,2*k-m);i--){
if(na>ac[0]||na>bc[0])break;
res-=val[cc[i]];vis[cc[i]]=false;
xds.ins(rt,1,R,val[cc[i]]);
if(k-i+1>0){
res+=val[ac[k-i+1]];vis[ac[k-i+1]]=true;
xds.del(rt,1,R,val[ac[k-i+1]]);
res+=val[bc[k-i+1]];vis[bc[k-i+1]]=true;
xds.del(rt,1,R,val[bc[k-i+1]]);
na++;
}
if(na*2+i-1>m)break;
//cout<<ans<<" "<<na<<" "<<i<<endl;
ans=min(ans,res+xds.query(rt,1,R,m-2*na-i+1));
//cout<<ans<<" "<<res<<" "<<cc[i]<<" "<<ac[k-i+1]<<" "<<bc[k-i+1]<<endl;
}
printf("%lld",ans);
}


调的时候千万不要着急,得耐心的调,要不然肯定调不出来

·

\(T3\;题\)

这个我第一眼看上去就是一个图论,然后没有想到怎么做

最后dfs也没有打对,就直接0分了,其实就是一个大枚举。。。。

维护一个\(bool\)数组\(f[i][j]\),

1表示,如果想让i存在,那么必须删掉j,0就不用了呗

那么偶们就有了一个转移,每次枚举u,v

如果\(f[i][u]和f[i][v]\)都为1,那么这个苹果就不可能存在了,注意uv是从m到1的

因为你后面必须要删掉u,v,而你现在就要删掉一个,那后面的条件就不能满足了

如果只有其中一个为1,那就把另一个也标记成1

最后我们美剧可能存在的点,如果他们必须删掉的点集中没有交集,那就合法

AC_code

#include<bits/stdc++.h>
using namespace std;
#define re register int
const int N=405;
const int M=5e4+5;
int n,m;
int f[N][N],g[N];
int u[M],v[M];
int ans;
signed main(){
scanf("%d%d",&n,&m);
for(re i=1;i<=m;i++)scanf("%d%d",&u[i],&v[i]);
for(re i=1;i<=n;i++)f[i][i]=1,g[i]=1;
for(re i=1;i<=n;i++){
for(re j=m;j>=1;j--){
if(f[i][u[j]]&&f[i][v[j]])g[i]=0;
else if(f[i][u[j]])f[i][v[j]]=1;
else if(f[i][v[j]])f[i][u[j]]=1;
}
}
for(re i=1;i<=n;i++){
for(re j=1;j<=n;j++){
int flag=0;
if(!g[i]||!g[j])continue;
for(re k=1;k<=n;k++){
if(f[i][k]&&f[j][k])
flag=1;
}
if(flag==0)ans++;
}
}
printf("%d",ans/2);
}


noip模拟23[联·赛·题]的更多相关文章

  1. NOIP 模拟 $23\; \rm 赛$

    题解 将所有物品分成四类,分别为两人共同喜欢的,只有一人喜欢的,没人喜欢的. 首先,先从两人共同喜欢的物品里找出 \(k\) 个,这时,就要从剩余的找出 \(\rm m-k\) 个,而且是最小的. 用 ...

  2. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  3. noip模拟35[第一次4题·裂了]

    noip模拟35 solutions 这是我第一次这么正式的考四个题,因为这四个题都出自同一个出题人,并不是拼盘拼出来的. 但是考得非常的不好,因为题非常难而且一直想睡觉.. 有好多我根本就不会的算法 ...

  4. 9.29 csp-s模拟测试55 联+赛+题

    T1 联 $n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同 ...

  5. NOIP 模拟 $23\; \rm 联$

    题解 \(by\;zj\varphi\) 区间上的问题,一般都用线段树来解决(但是这题也可以用 \(\rm ODT\)) 对于每段段区间设置三个参数,分别表示这个区间是否只有 \(1\) 或 \(0\ ...

  6. NOIP 模拟 $23\; \rm 题$

    题解 \(by\;zj\varphi\) 考虑 \(\rm DP\) 设 \(dp_{k}(S)\) 表示前 \(k\) 个人来后 \(S\) 集合中的苹果都存在的概率是否大于 \(0\) 考虑倒着转 ...

  7. Noip模拟考第三题——饥饿游戏

    饥饿游戏 (hungry.pas/c/cpp) [问题描述] Chanxer饿了,但是囊中羞涩,于是他去参加号称免费吃到饱的“饥饿游戏”. 这个游戏的规则是这样的,举办者会摆出一排 个食物,希望你能够 ...

  8. [NOIP模拟23]题解

    中间鸽了好几篇啊QAQ……有时间再补吧…… A.mine sbdp,考场上写的巨麻烦不过还是能A的(虽然MLE了……每一维都少开1就A掉了555).设$dp[i][j][k]$为枚举到第i位,第i位是 ...

  9. noip模拟4[随·单·题·大佬]

    woc    woc   woc难斩了人都傻了 害上来先看T1,发现这不就是一个小期望嘛(有啥的)真是!!打算半个小时秒掉 可是吧,读着读着题面,发现这题面有大问题,后来去找老师,还是我nb给题挑错, ...

随机推荐

  1. 自主数据类型:在TVM中启用自定义数据类型探索

    自主数据类型:在TVM中启用自定义数据类型探索 介绍 在设计加速器时,一个重要的决定是如何在硬件中近似地表示实数.这个问题有一个长期的行业标准解决方案:IEEE 754浮点标准.1.然而,当试图通过构 ...

  2. 记 Ant Designer Vue 2.0.1 layout 丢失样式类名问题分析

    现象 <a-layout-sider /> 渲染到页面上会变成 <section class="undefined-has-sider"> 丢失了 layo ...

  3. 权限管理(基本权限、附加权限、ACL权限)

    基本权限 •访问方式(权限) 读取:允许查看内容-read   r 写入:允许修改内容-write    w 可执行:允许运行和切换-execute  x 对于文本文件 r: cat   head  ...

  4. 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks

    题目描述 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作 ...

  5. WPF中选择文件和选择文件夹的方法

    最近从winform转WPF,遇到了各种各样的问题.然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法.所以,踩了几个坑之后,我把我得到的方法分享给大家 ...

  6. 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...

  7. Java基础-封装和继承

    @ 目录 Java基础知识(封装和继承) 一. 封装 1.1 封装的目的 1.2 封装的好处 1.3 封装的步骤 1.4 封装的例子 1.5 小结 二. 继承 2.1 继承的介绍 2.2 生活中的继承 ...

  8. 《MySQL面试小抄》索引失效场景验证

    我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! 本期主要面试考点 面试官考点之什么情况下会索 ...

  9. VLAN协议与三层交换机 (Access/Trubk/Hrbrid)

    VLAN协议与三层交换机(Access/Trunk/Hybrid) 目录 一.VLAN概述 1.1.分割广播域 1.2.VLAN的优势 1.3.静态VLAN 二.Trunk的作用 2.1.概念 2.2 ...

  10. excel VBA返回选中单元格区域的行数、列数,以及活动单元格的行号和列号

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) '可以直接sub(),不然选择就会触发vba    Dim rows_coun ...