首页 > 其他分享 >『模拟赛』CSP-S加赛1

『模拟赛』CSP-S加赛1

时间:2024-09-16 11:02:04浏览次数:1  
标签:rt ch num int sum tag 加赛 CSP 模拟

Rank

一般

image

A. 小W与伙伴招募

仔细想了想,发现是贪心题。

赛时想了跟正解完全有些不太一样的做法,被顶针说假了,但其实开了 long long 能有 80pts。后来发现如果思路正确打 \(\mathcal{O(nm)}\) 的暴力能有 95pts。

《对于 60% 的数据》

考虑正解的贪法,每天相当于将第 \(i\) 宝石进货 \(b_i\) 个,维护一下每种宝石当前库存,然后从小到大买即可,这样也就有了上面 \(\mathcal{O(nm)}\) 的做法。要想过最后一个点,我们可以考虑输出前缀和 我们考虑用线段树来维护这个库存,线段树上二分来解决查询,这样就做到了 \(\mathcal{O(n\log m+m)}\) 的复杂度。还有一种单调栈优化的,能达到 \(\mathcal{O(n)}\),比较牛。

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register ll (x)((y));(x)<=(z);(x)++)
#define fu(x,y,z) for(register ll (x)((y));(x)>=(z);(x)--)
using namespace std;
typedef __int128 ll;
#define lx ll
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
const int Ratio=0;
const int N=2e5+5;
const int mod=1e9+9;
int n,m;
int c[N];
long long ans;
ll numb[N],sumcos[N];
ll num[N<<2],sum[N<<2],tag[N<<2],cle[N<<2];
struct rmm
{
    ll a,b;
}b[N];
bool cmp(rmm A,rmm B)
{
    if(A.a!=B.a) return A.a<B.a;
    return A.b>B.b;
}
namespace Wisadel
{
    #define ls (rt<<1)
    #define rs (rt<<1|1)
    #define mid ((l+r)>>1)
    void Wpushup(int rt)
    {
        num[rt]=num[ls]+num[rs];
        sum[rt]=sum[ls]+sum[rs];
    }
    void Wpushdown(int rt,int l,int r)
    {
        num[ls]+=tag[rt]*(numb[mid]-numb[l-1]);
        num[rs]+=tag[rt]*(numb[r]-numb[mid]);
        sum[ls]+=tag[rt]*(sumcos[mid]-sumcos[l-1]);
        sum[rs]+=tag[rt]*(sumcos[r]-sumcos[mid]);
        tag[ls]+=tag[rt],tag[rs]+=tag[rt];
        tag[rt]=0;
    }
    void Wclerr(int rt)
    {
        num[ls]=num[rs]=0;
        sum[ls]=sum[rs]=0;
        cle[ls]=cle[rs]=1;
        tag[ls]=tag[rs]=0;
        cle[rt]=0;
    }
    void Wupd(int rt,int l,int r,int k)
    {
        if(k>0)
        {
            num[rt]+=numb[r]-numb[l-1];
            sum[rt]+=sumcos[r]-sumcos[l-1];
            tag[rt]++;
        }
        else
        {
            num[rt]=sum[rt]=tag[rt]=0;
            cle[rt]=1;
        }
    }
    ll Wq(int rt,int l,int r,int k)
    {
        if(l==r)
        {
            num[rt]-=k,sum[rt]-=b[l].a*k;
            return b[l].a*k;
        }
        if(cle[rt]) Wclerr(rt);
        if(tag[rt]) Wpushdown(rt,l,r);
        ll res=0;
        if(k<=num[ls])
        {
            res+=Wq(ls,l,mid,k);
            Wpushup(rt);
            return res;
        }
        res+=sum[ls]+Wq(rs,mid+1,r,k-num[ls]);
        Wupd(ls,l,mid,-1);
        Wpushup(rt);
        return res;
    }
    short main()
    {
        freopen("a.in","r",stdin),freopen("a.out","w",stdout);
        n=qr,m=qr;
        fo(i,1,n) c[i]=qr;
        fo(i,1,m) b[i].a=qr,b[i].b=qr,b[i].b=(b[i].b==-1?1e12:b[i].b);
        sort(b+1,b+1+m,cmp);
        fo(i,1,m)
        {
            numb[i]=numb[i-1]+b[i].b;
            sumcos[i]=sumcos[i-1]+1ll*b[i].a*b[i].b;
            if(b[i].b==1e12){m=i;break;}
        }
        fo(i,1,n) Wupd(1,1,m,1),ans+=Wq(1,1,m,c[i]);
        printf("%lld\n",ans);
        return Ratio;
    }
}
int main(){return Wisadel::main();}

B. 小W与制胡串谜题

签,但想复杂了所以没签上。

一个排序就解决了,不过看到第二个样例发现直接比较不太行,像 bcabc,于是我就想到了如果存在前缀关系,判断长串后缀与短串的大小,然后由于不清楚 cmp 的比较关系返回值导致搞错了只有 55pts。实际上比较 \(a+b\lt b+a\) 就行了。

点击查看代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)((y));(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)((y));(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx int
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
const int Ratio=0;
const int N=5e5+5;
const int mod=1e9+9;
int n;
string s[N];
bool cmp(string s1,string s2){return string(s1+s2)<string(s2+s1);}
namespace Wisadel
{
    short main()
    {
        freopen("a.in","r",stdin),freopen("a.out","w",stdout);
        n=qr;
        fo(i,1,n) cin>>s[i];
        sort(s+1,s+1+n,cmp);
        fo(i,1,n) cout<<s[i];
        return Ratio;
    }
}
int main(){return Wisadel::main();}

C. 小W与屠龙游戏

由于之前学过博弈论所以看出来了是 Nim Game 的变种,因为当时不会线性基就没看 Nim-k 的实现,后面补上。

突然的考试,有点慌其实。

此 W 非彼 W,差评

打到 1.5h 左右觉得 200pts 是大众分,于是开始被 T3 折磨,想到结束也没想出点啥,感觉学东西学一半就很难受。

看来大家都挂了不少分,致敬大黄首次不挂分反向挂分模拟赛!


完结撒花~

标签:rt,ch,num,int,sum,tag,加赛,CSP,模拟
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18416089

相关文章

  • 202312-2 因子化简ccfcsp
    常规质数因子带相关资料抄写稍加修改指数的筛选部分includeinclude<math.h>typedeflonglongll;usingnamespacestd;boolisprime(lln){inti;if(n<=1)returnfalse;intsq=(int)sqrt(1.0n);for(i=2;i<=sq;i++){if(n%i==0)returnfalse;}returntrue;}cons......
  • 2024CSP-J初赛全真模拟卷选择题篇(原创,难度偏简单)
    注意,本卷由再临TSC原创,禁止转载!本卷难度偏简单,若想要通过初赛本卷应拿80+分左右查看答案的方法:if(设备=="PC"){    把光标移到答案上面,选中答案,就会显示();}elseif(设备==移动端b||设备==平板){    把答案复制,找到随便一个地方粘贴即可();}else{......
  • 信息学奥赛初赛天天练-90-CSP-S2023基础题2-离散数学、染色、完全三叉树、平面图、边
    PDF文档公众号回复关键字:202409152023CSP-S选择题1单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)6以下连通无向图中,()一定可以用不超过两种颜色进行染色A完全三叉树B平面图C边双连通图D欧拉图7最长公共子序列长度常常用来衡量两个序列的相......
  • YC339A [ 20240915 CQYC NOIP 模拟赛 T1 ] 演讲(talk)
    题意有\(n\)个地点,你可以:使用\(\frac{a_i}{len}\)的代价标记该地点。使用\(\frac{b_i}{len}\)的代价标记该地点并使得\(len:=len+1\)。跳过该地点。你不需要按照顺序标记,问标记\(m\)个点的最小代价是多少(可以证明答案是实数)。\(n\le500,a_i\leb_i\)。S......
  • 总结:1037 - CSP 2021 提高级第一轮
    我的提交记录与结果以比较为基本运算,对于\(2n\)个数,同时找到最大值和最小值,最坏情况下需要的最小的比较次数为()。\(\textttA\).4n-2\(\textttB\).3n+1\(\color{#5eb95e}\texttt{C}\).3n-2\(\color{#e74c3c}\textttD\).2n+1【解析】:首先先将原数组两两分组。每组......
  • 【题解】【模拟】—— [NOIP2008 普及组] ISBN 号码
    【题解】【模拟】——[NOIP2008普及组]ISBN号码[NOIP2008普及组]ISBN号码题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2008普及组]ISBN号码通往洛谷的传送门题目描述每一本正式出版的图书都有一个I......
  • 【C++】string类中常用函数的模拟实现
    【C++】string类中常用函数的模拟实现1.string.h2.Text.cpp1.string.h#include<assert.h>namespacewch{ classstring { public: typedefchar*iterator; typedefconstchar*const_iterator; iteratorbegin() { return_str; } itera......
  • 2024.9.15 NOIP2024#6模拟赛
    不怎么模拟的模拟赛。比赛界面吐槽以IOI赛制来模拟OI赛事,\(jzyz\)真难绷。暴力有点难打,纯暴力(全排列)等拿的分少。不会写(我太蒻了)。\(T4\)暴力让我怒砍\(\textcolor{#ecdb44}{65pts}\)。文件\(IO\)是开考后加的。跟新高二打打了个倒数,压迫感略强。看了\(1h\)......
  • NOIP 模拟赛
    警示:看到一道做过的题不要着急上头去写,写炸了心态就崩了。T1题意:有\(n\)个人,每个人有经验\(w_i\)、薪水\(s_i\)、意愿\(p_i\)三个属性。要选出\(2k\)个人组成\(k\)组,每组两个人。每个组内一人做组长,一人做组员。要求组长经验\(\ge\)组员。每个人可能有三种意愿:组......
  • CSP 加赛 1
    A.小W与伙伴招募考虑贪心,可以发现,每一天只需要优先选择价值低的即可这种贪心思路有一个错误的扩展,就是先把\(m\)天的货一次性补齐再一次性买,这样做的问题在于有可能买到次日的货,而这样做是不被允许的考虑放到线段树上,维护“节点能够提供的钻石数量”和“节点花费”两个值......