首页 > 其他分享 >NOIP 模拟 13

NOIP 模拟 13

时间:2024-11-20 12:07:59浏览次数:1  
标签:std 13 ch NOIP int long eb 模拟 define

A 草莓

直接贪。

B 三色

发现是有限制的动态规划问题,\(n^3\) 很简单,直接在不合法的时候不转移就行了,然后发现转移很普通,有 \(j,k\to j,k\ \ \ j,k\to i,j\ \ \ j,k\to i,k\),把后面两维看做矩阵形式,然后发现第一种没变,第二种和第三种相当于新加了一行,第二种是加列,第三种是加行,所以维护一个 \(s_i=\sum_{j=1}^n f_{now,i,j}+f_{now,j,i}\) 就可以做到快速转移,但是转移有限制,所以要做到给一些位置清零,拿东西存一下有值的位置,遇到不合法的就删了。具体看代码吧。

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pii std::pair<int,int>
#define eb emplace_back
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
std::mt19937 myrand(std::chrono::high_resolution_clock::now().time_since_epoch().count());
inline int R(int n){return myrand()%n+1;}
inline int read(){char ch=getchar();int 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;}
const int N=5e3+10,mod=1e9+7,inf=1e9,ny=500000004;
inline void Min(int &x,int y){if(x>y)x=y;}
inline void Max(int &x,int y){if(x<y)x=y;}
inline void W(int &x,int y){x=(x+y)%mod;}
inline bool check(int l,int i,int r){return i>=l&&i<r;}
int n,m,s[N],t[N];
std::vector<pii> v[N];
std::vector<int> f,p,q,A[N],B[N];// f存的是值,A,B 存的是相应行列的值的下标,s 就是上文所说。
inline void insert(int x,int y,int v){
    if(!v)return ;
    int b=f.size();f.eb(v),p.eb(x),q.eb(y);
    A[x].eb(b),B[y].eb(b);W(s[x],v),W(s[y],v);
}// insert 相当于 f[x][y]=v
signed main(){
    freopen("color.in","r",stdin);freopen("color.out","w",stdout);
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    int T=read();while(T--){
        n=read(),m=read();
        for(int i=1;i<=m;++i){int l=read(),r=read(),x=read();v[r].pb({l,x});}
        insert(0,0,1);
        for(int i=0;i<=n;++i){
            int la=0,lb=0,ra=i,rb=i;
            for(auto it:v[i]){
                int p=it.fi,x=it.se;
                if(x==3)Max(la,p),Max(lb,p);
                if(x==2)Max(la,p),Min(rb,p-1);
                if(x==1)Min(ra,p-1),Min(rb,p-1);
            }
            for(int j=0;j<=i;++j){
                if(j>=la&&j<=ra)continue;
                for(int x:A[j])W(s[p[x]],-f[x]),W(s[q[x]],-f[x]),f[x]=0;
                A[j].clear();// 如果不满足限制,更新信息
            }
            for(int j=0;j<=i;++j){
                if(j>=lb&&j<=rb)continue;
                for(int x:B[j])W(s[p[x]],-f[x]),W(s[q[x]],-f[x]),f[x]=0;
                B[j].clear();
            }
            if(i==n)break;
            for(int j=0;j<=i;++j)t[j]=s[j];
            for(int j=0;j<=i;++j)insert(i,j,t[j]);//转移新的一行
        }int ans=0;
        for(int i=0;i<=n;++i)W(ans,s[i]),s[i]=0,A[i].clear(),B[i].clear(),v[i].clear();
        f.clear(),p.clear(),q.clear();            
        std::cout<<(ans*ny%mod+mod)%mod<<'\n';
    }
}

C 博弈

只有三个值,首先考虑都不相等的情况,在图上就是三个点。当两点关于一点对称时:
Alt text

先手必胜,直接移到同一个位置即可,然后不对称的时候,可以移动 \(A,C\) 使他们中的一个与 \(B\) 重合,此时如果是必胜局面那么先手可以继续操作,否则可以直接停止,所以当三个数不同时一定是先手必胜。
对于两个数相同的情况,设差为 \(x\),一定是移动使两个数重合,每次 \(x=\frac{x}{2}\),如果达不到一定必败,所以 \(f_i=!f_{i/2}\),所以当 \(x\) 的 lowbit 在偶数位置上的时候先手必胜。
然后正难则反,对于 \(a_i\),统计不合法的情况,首先选择两个 \(a_i\),然后枚举 \(x\) 的 lowbit,这个本质上就是异或,直接在 trie 树上找就行了,这里的 trie 树要从低位插。

D 后缀数组

不会。

总结

没啥好说的,睡觉场,不过没接触过有限制的 DP 转移,没想到直接不转移就行了,然后博弈论打出表来居然不觉得互不相同就能必胜,太唐了。

标签:std,13,ch,NOIP,int,long,eb,模拟,define
From: https://www.cnblogs.com/Ishar-zdl/p/18556595

相关文章

  • NOIP 模拟 10
    A邻间的骰子之舞设复制次数为\(x\),粘贴次数为\(y\),有\(x\ley\),发现\(x\)很小,如果能知道\(x,y\)时能达到的最大值,就能二分求答案了。根据数学直觉,肯定是讲粘贴平均地插入最优,仔细研究一下这个事情发现粘贴\(w\)次就是乘\(w+1\),所以\(f(x,y)=(\lfloor\frac{y}{x}\rflo......
  • [68] (NOIP集训) NOIP2024 加赛 5
    恐将成为我改题时间最长的一场(也是分最低的一场)码长断崖式领先了flowchartTB A(暴力操作) styleAcolor:#ffffff,fill:#00c0c0,stroke:#ffffff首先你肯定要让小于(等于)中位数的数变小,将较大的值变小是毫无意义的,因为即使你完全不管他们,也不会对答案造成任何影响,白白浪费费......
  • 富满 FM5013F SOT23-6 集成充电与电机驱动的控制芯片
    ......
  • 即时通讯技术文集(第43期):直播技术合集(Part3) [共13篇]
    为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 43 期。[-1-] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术实践之路[链接] http://www.52im.net/thread-1236-1-1.html[摘要] 直播弹幕指直播间的用户,礼......
  • Noip 集训 (后半)
    已经快两周没写闲话了,一想万一十几天就退役了不得留点念想啊,于是还是拾起来吧11.19上午打了困困模拟赛,不过我倒没那么困,不至于像CTH一样啃着水杯呼呼大睡开场就听大家说全不可做,于是果断【数据删除】结果再看题目,看T1的前半小时脑子里全是【数据删除】,看了十几分钟才看懂......
  • 9.noip杂题选讲
    noip杂题选讲\(A\)CF1290CPrefixEnlightenment\(B\)CF1458DFlipandReverse\(C\)CF1389FBicoloredSegments\(D\)CF1580DSubsequence\(E\)CF1720D2Xor-Subsequence(hardversion)\(F\)CF1775ETheHumanEquation\(G\)CF1763CAnotherArray......
  • 10.13
    桥接模式桥接模型(BridgePattern)是一种结构设计模型,先在将抽像部分和实际部分解析成,使它们可以独立地改变。桥接模型通通过使用组合关系而不是继承关系,将两个单独立变的维数分离开来,从而提高系统的灵性和可扩展性。在桥接口模式中,抽像部分和实际部分分别由两个抽像类(或接口)确定......
  • 模拟线程池与异步方法调用查询接口优化
    问题:批量查询如何优化?entity实体类packagecom.itheima.alipay.prop;importlombok.Data;@DatapublicclassUserInfo{privateLonguserId;privateStringusername;privateintage;publicUserInfo(LonguserId,Stringusername,intage){......
  • Chrome 浏览器 131 版本新特性
    Chrome浏览器131版本新特性一、Chrome浏览器131版本新特性1.在iOS上使用GoogleLens搜索自Chrome126版本以来,用户可以通过GoogleLens搜索屏幕上看到的任何图片或文字。要使用此功能,请访问网站,并点击聚焦时出现在地址栏的GoogleLens搜索按钮,或者点击桌面右......
  • Redis设计与实现第13章 -- 客户端 总结 (属性、标志、创建和关闭)
    Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务端发送命令请求,而服务端接口并处理客户端发送的命令请求,并向客户端返回命令回复。对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient......